/ Hex Artifact Content
Login

Artifact 39b59af94153bbac8ae5419700410518db54ff8a7a73b4e43cf2d69b797e7546:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
4d20: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
4d30: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
4d40: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
4d50: 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 43  slist */.  Fts5C
4d60: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
4d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4d80: 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
4d90: 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
4da0: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64  */..  /* Invoked
4db0: 20 74 6f 20 73 65 74 20 6f 75 74 70 75 74 20 76   to set output v
4dc0: 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76  ariables. */.  v
4dd0: 6f 69 64 20 28 2a 78 53 65 74 4f 75 74 70 75 74  oid (*xSetOutput
4de0: 73 29 28 46 74 73 35 49 74 65 72 2a 2c 20 46 74  s)(Fts5Iter*, Ft
4df0: 73 35 53 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20  s5SegIter*);..  
4e00: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4e30: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4e40: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e60: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4e70: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4e80: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4e90: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4ea0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4eb0: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4ec0: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20  tries */..  i64 
4ed0: 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20  iSwitchRowid;   
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4ef0: 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66  irstest rowid of
4f00: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72   other than aFir
4f10: 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43  st[1] */.  Fts5C
4f20: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
4f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4f40: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
4f50: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
4f60: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61  .  Fts5SegIter a
4f70: 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Seg[1];         
4f80: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
4f90: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4fa0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
4fb0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
4fd0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72   is used to iter
4fe0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4ff0: 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61  contents.** of a
5000: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
5010: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61  ecord..**.** pDa
5020: 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20  ta:.**   Record 
5030: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
5040: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74  oclist-index dat
5050: 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a  a..**.** bEof:.*
5060: 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20  *   Set to true 
5070: 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61  once iterator ha
5080: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a  s reached EOF..*
5090: 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20  *.** iOff:.**   
50a0: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  Set to the curre
50b0: 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
50c0: 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a   record pData..*
50d0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  /.struct Fts5Dli
50e0: 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61  dxLvl {.  Fts5Da
50f0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
5100: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
5110: 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65  for current page
5120: 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a   of this level *
5130: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  /.  int iOff;   
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
5160: 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a  set into pData *
5170: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
51a0: 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ady */.  int iFi
51b0: 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  rstOff;         
51c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
51d0: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
51e0: 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ors */..  /* Out
51f0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
5200: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
5210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5220: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
5230: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
5240: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
5250: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5260: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5270: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5280: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73  LeafPgno */.};.s
5290: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
52a0: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c  ter {.  int nLvl
52b0: 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
52c0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61    Fts5DlidxLvl a
52d0: 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74  Lvl[1];.};..stat
52e0: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
52f0: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
5300: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
5310: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
5320: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
5330: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
5340: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
5350: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5360: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5370: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5380: 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a  In[1];.} ../*.**
5390: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
53a0: 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74  turn a buffer at
53b0: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
53c0: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
53d0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
53e0: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
53f0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
5400: 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  d set the error 
5410: 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  code in.** the F
5420: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20  ts5Index handle 
5430: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5440: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
5450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
5460: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35  s5IdxMalloc(Fts5
5470: 49 6e 64 65 78 20 2a 70 2c 20 73 71 6c 69 74 65  Index *p, sqlite
5480: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
5490: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
54a0: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
54b0: 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d  p->rc, nByte);.}
54c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
54d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
54e0: 74 68 65 20 70 4c 65 66 74 20 62 75 66 66 65 72  the pLeft buffer
54f0: 20 77 69 74 68 20 74 68 65 20 70 52 69 67 68 74   with the pRight
5500: 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a  /nRight blob..**
5510: 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69  .** Return -ve i
5520: 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c  f pLeft is small
5530: 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20  er than pRight, 
5540: 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71  0 if they are eq
5550: 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66  ual or.** +ve if
5560: 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c   pRight is small
5570: 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49  er than pLeft. I
5580: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a  n other words:.*
5590: 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a  *.**     res = *
55a0: 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a  pLeft - *pRight.
55b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
55c0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
55d0: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
55e0: 61 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42  areBlob(.  Fts5B
55f0: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20  uffer *pLeft,   
5600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
5610: 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft hand side of 
5620: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
5630: 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74  const u8 *pRight
5640: 2c 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20  , int nRight    
5650: 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73 69  /* Right hand si
5660: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
5670: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
5680: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
5690: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
56a0: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
56b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20  eft->p, pRight, 
56c0: 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  nCmp);.  return 
56d0: 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74  (res==0 ? (pLeft
56e0: 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20  ->n - nRight) : 
56f0: 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  res);.}.#endif..
5700: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
5710: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
5720: 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73  e two buffers us
5730: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ing memcmp(). If
5740: 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   one buffer.** i
5750: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
5760: 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63  e other, it is c
5770: 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65  onsidered the le
5780: 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sser..**.** Retu
5790: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
57a0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57b0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
57c0: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
57d0: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
57e0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57f0: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
5800: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
5810: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
5820: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
5830: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
5840: 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66  Compare(Fts5Buff
5850: 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42  er *pLeft, Fts5B
5860: 75 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a  uffer *pRight){.
5870: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
5880: 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68  (pLeft->n, pRigh
5890: 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73  t->n);.  int res
58a0: 20 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 4c   = fts5Memcmp(pL
58b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e  eft->p, pRight->
58c0: 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  p, nCmp);.  retu
58d0: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
58e0: 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d  eft->n - pRight-
58f0: 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73  >n) : res);.}..s
5900: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65  tatic int fts5Le
5910: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46  afFirstTermOff(F
5920: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b  ts5Data *pLeaf){
5930: 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74  .  int ret;.  ft
5940: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
5950: 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73  Leaf->p[pLeaf->s
5960: 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20  zLeaf], ret);.  
5970: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
5980: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72  *.** Close the r
5990: 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61  ead-only blob ha
59a0: 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f  ndle, if it is o
59b0: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pen..*/.static v
59c0: 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61  oid fts5CloseRea
59d0: 64 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70  der(Fts5Index *p
59e0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  ){.  if( p->pRea
59f0: 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  der ){.    sqlit
5a00: 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72  e3_blob *pReader
5a10: 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20   = p->pReader;. 
5a20: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5a30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  0;.    sqlite3_b
5a40: 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65  lob_close(pReade
5a50: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
5a60: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
5a70: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
5a80: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
5a90: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5aa0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
5ab0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
5ac0: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
5ad0: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
5ae0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
5af0: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
5b00: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
5b10: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
5b20: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
5b30: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
5b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b50: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
5b60: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28  ITE_OK;..    if(
5b70: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
5b80: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
5b90: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
5ba0: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
5bb0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
5bc0: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
5bd0: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
5be0: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
5bf0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
5c00: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
5c10: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
5c20: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
5c30: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5c40: 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65  Blob = p->pReade
5c50: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  r;.      p->pRea
5c60: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  der = 0;.      r
5c70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5c80: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
5c90: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73  Rowid);.      as
5ca0: 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
5cb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
5cc0: 70 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b  pReader = pBlob;
5cd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
5ce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5cf0: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
5d00: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  der(p);.      }.
5d10: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5d20: 4c 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20  LITE_ABORT ) rc 
5d30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5d50: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  e blob handle is
5d60: 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69   not open at thi
5d70: 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74  s point, open it
5d80: 20 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a   and seek .    *
5d90: 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  * to the request
5da0: 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20  ed entry.  */.  
5db0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5dc0: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
5dd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
5de0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
5df0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
5e00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5e10: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
5e20: 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20  nfig->db, .     
5e30: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
5e40: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
5e50: 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
5e60: 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a   0, &p->pReader.
5e70: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
5e80: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
5e90: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
5ea0: 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73  blob_open() or s
5eb0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
5ec0: 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  en() calls.    *
5ed0: 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64  * above returned
5ee0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72   SQLITE_ERROR, r
5ef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5f00: 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61  RUPT_VTAB instea
5f10: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68  d..    ** All th
5f20: 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20  e reasons those 
5f30: 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20  functions might 
5f40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5f50: 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20  ROR - missing.  
5f60: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73    ** table, miss
5f70: 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f  ing row, non-blo
5f80: 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20  b/text in block 
5f90: 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74  column - indicat
5fa0: 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e  e .    ** backin
5fb0: 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69  g store corrupti
5fc0: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  on.  */.    if( 
5fd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
5fe0: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
5ff0: 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72  RUPT;..    if( r
6000: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6010: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d        u8 *aOut =
6020: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6030: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6040: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6050: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
6060: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
6070: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
6080: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
6090: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 41  sqlite3_int64 nA
60a0: 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 46 74  lloc = sizeof(Ft
60b0: 73 35 44 61 74 61 29 20 2b 20 6e 42 79 74 65 20  s5Data) + nByte 
60c0: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
60d0: 49 4e 47 3b 0a 20 20 20 20 20 20 70 52 65 74 20  ING;.      pRet 
60e0: 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71 6c  = (Fts5Data*)sql
60f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 41  ite3_malloc64(nA
6100: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28  lloc);.      if(
6110: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
6120: 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79 74   pRet->nn = nByt
6130: 65 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20  e;.        aOut 
6140: 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a  = pRet->p = (u8*
6150: 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20  )&pRet[1];.     
6160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6170: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
6180: 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  M;.      }..    
6190: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
61a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
61b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
61c0: 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72  _read(p->pReader
61d0: 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30  , aOut, nByte, 0
61e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
61f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6200: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
6210: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
6220: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
6230: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
6240: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  .        /* TODO
6250: 31 3a 20 46 69 78 20 74 68 69 73 20 2a 2f 0a 20  1: Fix this */. 
6260: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 70 5b 6e         pRet->p[n
6270: 42 79 74 65 5d 20 3d 20 30 78 30 30 3b 0a 20 20  Byte] = 0x00;.  
6280: 20 20 20 20 20 20 70 52 65 74 2d 3e 73 7a 4c 65        pRet->szLe
6290: 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  af = fts5GetU16(
62a0: 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a 20 20  &pRet->p[2]);.  
62b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
62c0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
62d0: 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a  p->nRead++;.  }.
62e0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 52 65 74  .  assert( (pRet
62f0: 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51  ==0)==(p->rc!=SQ
6300: 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65  LITE_OK) );.  re
6310: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
6320: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
6330: 66 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61 20  ference to data 
6340: 72 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64 20  record returned 
6350: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
6360: 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74  ll to.** fts5Dat
6370: 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74  aRead()..*/.stat
6380: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
6390: 52 65 6c 65 61 73 65 28 46 74 73 35 44 61 74 61  Release(Fts5Data
63a0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 73 71 6c 69   *pData){.  sqli
63b0: 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b  te3_free(pData);
63c0: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
63d0: 61 74 61 20 2a 66 74 73 35 4c 65 61 66 52 65 61  ata *fts5LeafRea
63e0: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
63f0: 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46  i64 iRowid){.  F
6400: 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20  ts5Data *pRet = 
6410: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
6420: 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 70  iRowid);.  if( p
6430: 52 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Ret ){.    if( p
6440: 52 65 74 2d 3e 73 7a 4c 65 61 66 3e 70 52 65 74  Ret->szLeaf>pRet
6450: 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  ->nn ){.      p-
6460: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
6470: 50 54 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61  PT;.      fts5Da
6480: 74 61 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b  taRelease(pRet);
6490: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
64a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
64b0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn pRet;.}..sta
64c0: 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
64d0: 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20  xPrepareStmt(.  
64e0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
64f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
6500: 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a  pStmt,.  char *z
6510: 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Sql.){.  if( p->
6520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6530: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  .    if( zSql ){
6540: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
6550: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6560: 33 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62  3(p->pConfig->db
6570: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20 20 20 20  , zSql, -1,.    
6580: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52 45        SQLITE_PRE
6590: 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54 7c  PARE_PERSISTENT|
65a0: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 4e  SQLITE_PREPARE_N
65b0: 4f 5f 56 54 41 42 2c 0a 20 20 20 20 20 20 20 20  O_VTAB,.        
65c0: 20 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20    ppStmt, 0);.  
65d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
65e0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
65f0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
6600: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
6610: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ql);.  return p-
6620: 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  >rc;.}.../*.** I
6630: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
6640: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
6650: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
6660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6670: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74  fts5DataWrite(Ft
6680: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
6690: 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38  iRowid, const u8
66a0: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
66b0: 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ta){.  if( p->rc
66c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
66d0: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  turn;..  if( p->
66e0: 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20  pWriter==0 ){.  
66f0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
6700: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
6710: 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65  ig;.    fts5Inde
6720: 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
6730: 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 73 71 6c  &p->pWriter, sql
6740: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
6750: 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
6760: 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 64   INTO '%q'.'%q_d
6770: 61 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20  ata'(id, block) 
6780: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20  VALUES(?,?)", . 
6790: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
67a0: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
67b0: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
67c0: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
67d0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  turn;.  }..  sql
67e0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
67f0: 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69  p->pWriter, 1, i
6800: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
6810: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
6820: 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61  Writer, 2, pData
6830: 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , nData, SQLITE_
6840: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
6850: 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74  e3_step(p->pWrit
6860: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
6870: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
6880: 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69  pWriter);.  sqli
6890: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d  te3_bind_null(p-
68a0: 3e 70 57 72 69 74 65 72 2c 20 32 29 3b 0a 7d 0a  >pWriter, 2);.}.
68b0: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  ./*.** Execute t
68c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
68d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45  :.**.**     DELE
68e0: 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57  TE FROM %_data W
68f0: 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20  HERE id BETWEEN 
6900: 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61  $iFirst AND $iLa
6910: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  st.*/.static voi
6920: 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65  d fts5DataDelete
6930: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
6940: 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69  64 iFirst, i64 i
6950: 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Last){.  if( p->
6960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6970: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70  return;..  if( p
6980: 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b  ->pDeleter==0 ){
6990: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
69a0: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
69b0: 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20  onfig;.    char 
69c0: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
69d0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
69e0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25   "DELETE FROM '%
69f0: 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48 45  q'.'%q_data' WHE
6a00: 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c  RE id>=? AND id<
6a10: 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  =?", .          
6a20: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6a30: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6a40: 20 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35   );.    if( fts5
6a50: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
6a60: 28 70 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72  (p, &p->pDeleter
6a70: 2c 20 7a 53 71 6c 29 20 29 20 72 65 74 75 72 6e  , zSql) ) return
6a80: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
6a90: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
6aa0: 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72  Deleter, 1, iFir
6ab0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  st);.  sqlite3_b
6ac0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6ad0: 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29  leter, 2, iLast)
6ae0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
6af0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
6b00: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
6b10: 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74  _reset(p->pDelet
6b20: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
6b30: 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  move all records
6b40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6b50: 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e   segment iSegid.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6b70: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
6b80: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
6b90: 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  *p, int iSegid){
6ba0: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
6bb0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6bc0: 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20  ID(iSegid, 0);. 
6bd0: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
6be0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
6bf0: 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a  iSegid+1, 0)-1;.
6c00: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
6c10: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
6c20: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  t);.  if( p->pId
6c30: 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  xDeleter==0 ){. 
6c40: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6c50: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6c60: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6c70: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6c80: 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72   &p->pIdxDeleter
6c90: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6ca0: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44 45  f(.          "DE
6cb0: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
6cc0: 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
6cd0: 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20  gid=?",.        
6ce0: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6cf0: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6d00: 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
6d10: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6d20: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6d30: 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
6d40: 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65  xDeleter, 1, iSe
6d50: 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
6d60: 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65  3_step(p->pIdxDe
6d70: 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  leter);.    p->r
6d80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6d90: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6da0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6db0: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6dc0: 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74  nce to an Fts5St
6dd0: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72  ructure object r
6de0: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6df0: 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74  rlier .** call t
6e00: 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  o fts5StructureR
6e10: 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72  ead() or fts5Str
6e20: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a  uctureDecode()..
6e30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6e40: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
6e50: 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ase(Fts5Structur
6e60: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
6e70: 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30 3e  f( pStruct && 0>
6e80: 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65  =(--pStruct->nRe
6e90: 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  f) ){.    int i;
6ea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
6eb0: 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ruct->nRef==0 );
6ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6ed0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
6ee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6ef0: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
6f00: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
6f10: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
6f20: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6f30: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ct);.  }.}..stat
6f40: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6f50: 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74 72  ctureRef(Fts5Str
6f60: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
6f70: 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  {.  pStruct->nRe
6f80: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  f++;.}../*.** De
6f90: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
6fa0: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
6fb0: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
6fc0: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
6fd0: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
6fe0: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
6ff0: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
7000: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
7010: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
7020: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
7030: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
7040: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
7050: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
7060: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
7070: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
7080: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
7090: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
70a0: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
70b0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
70c0: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
70d0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
70e0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
70f0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7100: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7110: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7120: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
7130: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
7140: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7150: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7160: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7170: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
7180: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7190: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
71a0: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
71b0: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
71c0: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
71f0: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7200: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
7210: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
7220: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
7230: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
7240: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
7250: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
7260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7270: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
7280: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
7290: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
72a0: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
72b0: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
72c0: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
72d0: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
72e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
72f0: 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  4 nByte;        
7300: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
7310: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
7320: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
7330: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
7340: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
7350: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
7360: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7370: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
7380: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
7390: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
73a0: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
73b0: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
73c0: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
73d0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
73e0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
73f0: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
7400: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
7410: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
7420: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
7430: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
7440: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7450: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
7460: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7470: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
7480: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20  Segment);.  if( 
7490: 6e 4c 65 76 65 6c 3e 46 54 53 35 5f 4d 41 58 5f  nLevel>FTS5_MAX_
74a0: 53 45 47 4d 45 4e 54 20 20 20 7c 7c 20 6e 4c 65  SEGMENT   || nLe
74b0: 76 65 6c 3c 30 0a 20 20 20 7c 7c 20 6e 53 65 67  vel<0.   || nSeg
74c0: 6d 65 6e 74 3e 46 54 53 35 5f 4d 41 58 5f 53 45  ment>FTS5_MAX_SE
74d0: 47 4d 45 4e 54 20 7c 7c 20 6e 53 65 67 6d 65 6e  GMENT || nSegmen
74e0: 74 3c 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  t<0.  ){.    ret
74f0: 75 72 6e 20 46 54 53 35 5f 43 4f 52 52 55 50 54  urn FTS5_CORRUPT
7500: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
7510: 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  (.      sizeof(F
7520: 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b 20  ts5Structure) + 
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63     /* Main struc
7550: 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 69  ture */.      si
7560: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7570: 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76  reLevel) * (nLev
7580: 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c 65 76  el-1)    /* aLev
7590: 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  el[] array */.  
75a0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73  );.  pRet = (Fts
75b0: 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69  5Structure*)sqli
75c0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
75d0: 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a  o(&rc, nByte);..
75e0: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
75f0: 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31    pRet->nRef = 1
7600: 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76  ;.    pRet->nLev
7610: 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20  el = nLevel;.   
7620: 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e 74 20   pRet->nSegment 
7630: 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  = nSegment;.    
7640: 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  i += sqlite3Fts5
7650: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
7660: 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69  [i], &pRet->nWri
7670: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  teCounter);..   
7680: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63 3d   for(iLvl=0; rc=
7690: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
76a0: 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  vl<nLevel; iLvl+
76b0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
76c0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
76d0: 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76  vl = &pRet->aLev
76e0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
76f0: 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30 3b 0a  int nTotal = 0;.
7700: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a        int iSeg;.
7710: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 44  .      if( i>=nD
7720: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ata ){.        r
7730: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
7740: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7750: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7760: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7770: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65  ta[i], pLvl->nMe
7780: 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 20  rge);.        i 
7790: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
77a0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
77b0: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  otal);.        i
77c0: 66 28 20 6e 54 6f 74 61 6c 3c 70 4c 76 6c 2d 3e  f( nTotal<pLvl->
77d0: 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20 46 54  nMerge ) rc = FT
77e0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
77f0: 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
7800: 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53   (Fts5StructureS
7810: 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46  egment*)sqlite3F
7820: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
7830: 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  c, .            
7840: 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28  nTotal * sizeof(
7850: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
7860: 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 20 29 3b  ment).        );
7870: 0a 20 20 20 20 20 20 20 20 6e 53 65 67 6d 65 6e  .        nSegmen
7880: 74 20 2d 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20  t -= nTotal;.   
7890: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
78a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
78b0: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e  .        pLvl->n
78c0: 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20  Seg = nTotal;.  
78d0: 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
78e0: 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69  ; iSeg<nTotal; i
78f0: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
7900: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
7910: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
7920: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
7930: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7940: 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  i>=nData ){.    
7950: 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53          rc = FTS
7960: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
7970: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7990: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
79a0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
79b0: 69 5d 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  i], pSeg->iSegid
79c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
79d0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
79e0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 53 65  2(&pData[i], pSe
79f0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g->pgnoFirst);. 
7a00: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
7a10: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7a20: 44 61 74 61 5b 69 5d 2c 20 70 53 65 67 2d 3e 70  Data[i], pSeg->p
7a30: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
7a40: 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67      if( pSeg->pg
7a50: 6e 6f 4c 61 73 74 3c 70 53 65 67 2d 3e 70 67 6e  noLast<pSeg->pgn
7a60: 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  oFirst ){.      
7a70: 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
7a80: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
7a90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7ab0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4c  }.        if( iL
7ac0: 76 6c 3e 30 20 26 26 20 70 4c 76 6c 5b 2d 31 5d  vl>0 && pLvl[-1]
7ad0: 2e 6e 4d 65 72 67 65 20 26 26 20 6e 54 6f 74 61  .nMerge && nTota
7ae0: 6c 3d 3d 30 20 29 20 72 63 20 3d 20 46 54 53 35  l==0 ) rc = FTS5
7af0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7b00: 20 20 69 66 28 20 69 4c 76 6c 3d 3d 6e 4c 65 76    if( iLvl==nLev
7b10: 65 6c 2d 31 20 26 26 20 70 4c 76 6c 2d 3e 6e 4d  el-1 && pLvl->nM
7b20: 65 72 67 65 20 29 20 72 63 20 3d 20 46 54 53 35  erge ) rc = FTS5
7b30: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7b40: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7b50: 6e 53 65 67 6d 65 6e 74 21 3d 30 20 26 26 20 72  nSegment!=0 && r
7b60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
7b70: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
7b80: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ;..    if( rc!=S
7b90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7ba0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
7bb0: 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20  elease(pRet);.  
7bc0: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
7bd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75    }.  }..  *ppOu
7be0: 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75  t = pRet;.  retu
7bf0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  rn rc;.}../*.**.
7c00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7c10: 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
7c20: 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46  evel(int *pRc, F
7c30: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
7c40: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20  pStruct){.  if( 
7c50: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
7c60: 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
7c70: 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
7c80: 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69  *ppStruct;.    i
7c90: 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72  nt nLevel = pStr
7ca0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20  uct->nLevel;.   
7cb0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
7cc0: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  Byte = (.       
7cd0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7ce0: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
7cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
7d00: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
7d10: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
7d20: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7d30: 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20  ) * (nLevel+1)  
7d40: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7d50: 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20  y */.    );..   
7d60: 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74   pStruct = sqlit
7d70: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 53 74  e3_realloc64(pSt
7d80: 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ruct, nByte);.  
7d90: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
7da0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
7db0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e  Struct->aLevel[n
7dc0: 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f  Level], 0, sizeo
7dd0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7de0: 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53  evel));.      pS
7df0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b  truct->nLevel++;
7e00: 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74  .      *ppStruct
7e10: 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20   = pStruct;.    
7e20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
7e30: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7e40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7e50: 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65  *.** Extend leve
7e60: 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74  l iLvl so that t
7e70: 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
7e80: 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61   at least nExtra
7e90: 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74   more.** segment
7ea0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7eb0: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45  d fts5StructureE
7ec0: 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e  xtendLevel(.  in
7ed0: 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53  t *pRc, .  Fts5S
7ee0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7ef0: 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  t, .  int iLvl, 
7f00: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a  .  int nExtra, .
7f10: 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b    int bInsert.){
7f20: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
7f30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
7f40: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7f50: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
7f60: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
7f70: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7f80: 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b  reSegment *aNew;
7f90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
7fa0: 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  64 nByte;..    n
7fb0: 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Byte = (pLvl->nS
7fc0: 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73  eg + nExtra) * s
7fd0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7fe0: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
7ff0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
8000: 72 65 61 6c 6c 6f 63 36 34 28 70 4c 76 6c 2d 3e  realloc64(pLvl->
8010: 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20  aSeg, nByte);.  
8020: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
8030: 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d      if( bInsert=
8040: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
8050: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d  mset(&aNew[pLvl-
8060: 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nSeg], 0, sizeo
8070: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8080: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
8090: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
80a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76          int nMov
80b0: 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a  e = pLvl->nSeg *
80c0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
80d0: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
80e0: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
80f0: 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e  aNew[nExtra], aN
8100: 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  ew, nMove);.    
8110: 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c      memset(aNew,
8120: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
8130: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
8140: 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20   * nExtra);.    
8150: 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e    }.      pLvl->
8160: 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  aSeg = aNew;.   
8170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
8180: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
8190: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  M;.    }.  }.}..
81a0: 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63  static Fts5Struc
81b0: 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74  ture *fts5Struct
81c0: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
81d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
81e0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
81f0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35  pRet = 0;.  Fts5
8200: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
8210: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
8220: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8250: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73   cookie */.  Fts
8260: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20  5Data *pData;.. 
8270: 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
8280: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54  aRead(p, FTS5_ST
8290: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a  RUCTURE_ROWID);.
82a0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
82b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
82c0: 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65   TODO: Do we nee
82d0: 64 20 74 68 69 73 20 69 66 20 74 68 65 20 6c 65  d this if the le
82e0: 61 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70 65  af-index is appe
82f0: 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e  nded? Probably..
8300: 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  . */.    memset(
8310: 26 70 44 61 74 61 2d 3e 70 5b 70 44 61 74 61 2d  &pData->p[pData-
8320: 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41  >nn], 0, FTS5_DA
8330: 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20  TA_PADDING);.   
8340: 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74 72   p->rc = fts5Str
8350: 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44 61  uctureDecode(pDa
8360: 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 6e  ta->p, pData->nn
8370: 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65  , &iCookie, &pRe
8380: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  t);.    if( p->r
8390: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
83a0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
83b0: 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  !=iCookie ){.   
83c0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
83d0: 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64  e3Fts5ConfigLoad
83e0: 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69  (pConfig, iCooki
83f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  e);.    }.    ft
8400: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
8410: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ata);.    if( p-
8420: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
8430: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
8440: 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65  ctureRelease(pRe
8450: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
8460: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
8470: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8480: 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
8490: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
84a0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
84b0: 20 20 69 36 34 20 69 56 65 72 73 69 6f 6e 20 3d    i64 iVersion =
84c0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
84d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
84e0: 20 20 20 69 66 28 20 70 2d 3e 70 44 61 74 61 56     if( p->pDataV
84f0: 65 72 73 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  ersion==0 ){.   
8500: 20 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 49     p->rc = fts5I
8510: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
8520: 70 2c 20 26 70 2d 3e 70 44 61 74 61 56 65 72 73  p, &p->pDataVers
8530: 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ion, .          
8540: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8550: 22 50 52 41 47 4d 41 20 25 51 2e 64 61 74 61 5f  "PRAGMA %Q.data_
8560: 76 65 72 73 69 6f 6e 22 2c 20 70 2d 3e 70 43 6f  version", p->pCo
8570: 6e 66 69 67 2d 3e 7a 44 62 29 0a 20 20 20 20 20  nfig->zDb).     
8580: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
8590: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
85a0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   0;.    }..    i
85b0: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
85c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
85d0: 44 61 74 61 56 65 72 73 69 6f 6e 29 20 29 7b 0a  DataVersion) ){.
85e0: 20 20 20 20 20 20 69 56 65 72 73 69 6f 6e 20 3d        iVersion =
85f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8600: 69 6e 74 36 34 28 70 2d 3e 70 44 61 74 61 56 65  int64(p->pDataVe
8610: 72 73 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 7d  rsion, 0);.    }
8620: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
8630: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44  ite3_reset(p->pD
8640: 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 7d  ataVersion);.  }
8650: 0a 0a 20 20 72 65 74 75 72 6e 20 69 56 65 72 73  ..  return iVers
8660: 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ion;.}../*.** Re
8670: 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20  ad, deserialize 
8680: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
8690: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
86a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53  .**.** The Fts5S
86b0: 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b  tructure.aLevel[
86c0: 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53  ] and each Fts5S
86d0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53  tructureLevel.aS
86e0: 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  eg[] array.** ar
86f0: 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64  e over-allocated
8700: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f   as described fo
8710: 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53  r function fts5S
8720: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29  tructureDecode()
8730: 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a   .** above..**.*
8740: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8750: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
8760: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
8770: 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e  ror code left in
8780: 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65   the.** Fts5Inde
8790: 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20  x handle. If an 
87a0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
87b0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
87c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
87d0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
87e0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
87f0: 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75  atic Fts5Structu
8800: 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72  re *fts5Structur
8810: 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  eRead(Fts5Index 
8820: 2a 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  *p){..  if( p->p
8830: 53 74 72 75 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Struct==0 ){.   
8840: 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69   p->iStructVersi
8850: 6f 6e 20 3d 20 66 74 73 35 49 6e 64 65 78 44 61  on = fts5IndexDa
8860: 74 61 56 65 72 73 69 6f 6e 28 70 29 3b 0a 20 20  taVersion(p);.  
8870: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8890: 70 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73  p->pStruct = fts
88a0: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
88b0: 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20 20 7d  cached(p);.    }
88c0: 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 65 6c  .  }..#if 0.  el
88d0: 73 65 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  se{.    Fts5Stru
88e0: 63 74 75 72 65 20 2a 70 54 65 73 74 20 3d 20 66  cture *pTest = f
88f0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
8900: 55 6e 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20  Uncached(p);.   
8910: 20 69 66 28 20 70 54 65 73 74 20 29 7b 0a 20 20   if( pTest ){.  
8920: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
8930: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
8940: 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ->pStruct->nSegm
8950: 65 6e 74 3d 3d 70 54 65 73 74 2d 3e 6e 53 65 67  ent==pTest->nSeg
8960: 6d 65 6e 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ment );.      as
8970: 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72  sert_nc( p->pStr
8980: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 65  uct->nLevel==pTe
8990: 73 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20  st->nLevel );.  
89a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
89b0: 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Test->nLevel; i+
89c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
89d0: 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63  rt_nc( p->pStruc
89e0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
89f0: 72 67 65 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76  rge==pTest->aLev
8a00: 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 20 29 3b 0a  el[i].nMerge );.
8a10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
8a20: 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61  c( p->pStruct->a
8a30: 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3d 3d 70  Level[i].nSeg==p
8a40: 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  Test->aLevel[i].
8a50: 6e 53 65 67 20 29 3b 0a 20 20 20 20 20 20 20 20  nSeg );.        
8a60: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 65 73 74  for(j=0; j<pTest
8a70: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67  ->aLevel[i].nSeg
8a80: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8a90: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
8aa0: 65 67 6d 65 6e 74 20 2a 70 31 20 3d 20 26 70 54  egment *p1 = &pT
8ab0: 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61  est->aLevel[i].a
8ac0: 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  Seg[j];.        
8ad0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
8ae0: 65 67 6d 65 6e 74 20 2a 70 32 20 3d 20 26 70 2d  egment *p2 = &p-
8af0: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8b00: 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20 20  [i].aSeg[j];.   
8b10: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
8b20: 28 20 70 31 2d 3e 69 53 65 67 69 64 3d 3d 70 32  ( p1->iSegid==p2
8b30: 2d 3e 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20  ->iSegid );.    
8b40: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
8b50: 20 70 31 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d   p1->pgnoFirst==
8b60: 70 32 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 3b  p2->pgnoFirst );
8b70: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
8b80: 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 4c 61  t_nc( p1->pgnoLa
8b90: 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 4c 61 73 74  st==p2->pgnoLast
8ba0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
8bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
8bc0: 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
8bd0: 28 70 54 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20  (pTest);.    }. 
8be0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
8bf0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
8c00: 4b 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  K ) return 0;.  
8c10: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 72 75  assert( p->iStru
8c20: 63 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a  ctVersion!=0 );.
8c30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74    assert( p->pSt
8c40: 72 75 63 74 21 3d 30 20 29 3b 0a 20 20 66 74 73  ruct!=0 );.  fts
8c50: 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 2d  5StructureRef(p-
8c60: 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  >pStruct);.  ret
8c70: 75 72 6e 20 70 2d 3e 70 53 74 72 75 63 74 3b 0a  urn p->pStruct;.
8c80: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
8c90: 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
8ca0: 6c 69 64 61 74 65 28 46 74 73 35 49 6e 64 65 78  lidate(Fts5Index
8cb0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
8cc0: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 66 74  Struct ){.    ft
8cd0: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8ce0: 73 65 28 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a  se(p->pStruct);.
8cf0: 20 20 20 20 70 2d 3e 70 53 74 72 75 63 74 20 3d      p->pStruct =
8d00: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
8d10: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
8d20: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
8d30: 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74  ents in index st
8d40: 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
8d50: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
8d60: 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75  n is only ever u
8d70: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
8d80: 73 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f  ssert() conditio
8d90: 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ns..*/.#ifdef SQ
8da0: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
8db0: 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74  c int fts5Struct
8dc0: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
8dd0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a  (Fts5Structure *
8de0: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
8df0: 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20  nSegment = 0;   
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8e10: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
8e20: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28  egments */.  if(
8e30: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
8e40: 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e60: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
8e70: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
8e80: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  */.    for(iLvl=
8e90: 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
8ea0: 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
8eb0: 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74  {.      nSegment
8ec0: 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   += pStruct->aLe
8ed0: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a  vel[iLvl].nSeg;.
8ee0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8ef0: 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a  urn nSegment;.}.
8f00: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8f10: 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
8f20: 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
8f30: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 20  Blob, nBlob) {  
8f40: 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28     \.  assert( (
8f50: 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28  pBuf)->nSpace>=(
8f60: 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29  (pBuf)->n+nBlob)
8f70: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
8f80: 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42 75  \.  memcpy(&(pBu
8f90: 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d  f)->p[(pBuf)->n]
8fa0: 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8fc0: 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42   (pBuf)->n += nB
8fd0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23            \.}..#
9000: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
9010: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
9020: 74 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b 20  t(pBuf, iVal) { 
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
9040: 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20  .  (pBuf)->n += 
9050: 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
9060: 72 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70 5b  rint(&(pBuf)->p[
9070: 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56 61  (pBuf)->n], (iVa
9080: 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72 74  l));  \.  assert
9090: 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65  ( (pBuf)->nSpace
90a0: 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20 20  >=(pBuf)->n );  
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a          \.}.../*
90d0: 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e  .** Serialize an
90e0: 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72  d store the "str
90f0: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a  ucture" record..
9100: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
9110: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
9120: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  an error code in
9130: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
9140: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
9150: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
9160: 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
9170: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
9180: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
9190: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
91a0: 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  reWrite(Fts5Inde
91b0: 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
91c0: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
91d0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
91e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
91f0: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
9200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
9210: 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a  ffer to serializ
9220: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f  e record into */
9230: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
9260: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
9270: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  vels */.    int 
9280: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
9290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f            /* Coo
92a0: 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f  kie value to sto
92b0: 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  re */..    asser
92c0: 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
92d0: 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
92e0: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
92f0: 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
9300: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
9310: 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
9320: 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  er));..    /* Ap
9330: 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  pend the current
9340: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
9350: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f  ookie */.    iCo
9360: 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  okie = p->pConfi
9370: 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20  g->iCookie;.    
9380: 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20  if( iCookie<0 ) 
9390: 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a 20 20  iCookie = 0;..  
93a0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
93b0: 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
93c0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 2b 39  p->rc, &buf, 4+9
93d0: 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20 73  +9+9) ){.      s
93e0: 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
93f0: 62 75 66 2e 70 2c 20 69 43 6f 6f 6b 69 65 29 3b  buf.p, iCookie);
9400: 0a 20 20 20 20 20 20 62 75 66 2e 6e 20 3d 20 34  .      buf.n = 4
9410: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
9420: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
9430: 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74  nt(&buf, pStruct
9440: 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  ->nLevel);.     
9450: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
9460: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66  ppendVarint(&buf
9470: 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  , pStruct->nSegm
9480: 65 6e 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ent);.      fts5
9490: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
94a0: 56 61 72 69 6e 74 28 26 62 75 66 2c 20 28 69 36  Varint(&buf, (i6
94b0: 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  4)pStruct->nWrit
94c0: 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 7d  eCounter);.    }
94d0: 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ..    for(iLvl=0
94e0: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
94f0: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
9500: 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b  .      int iSeg;
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
9530: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
9540: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
9550: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9560: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
9570: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
9580: 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 42  vl];.      fts5B
9590: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
95a0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
95b0: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20  pLvl->nMerge);. 
95c0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
95d0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
95e0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
95f0: 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73 73  nSeg);.      ass
9600: 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ert( pLvl->nMerg
9610: 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b  e<=pLvl->nSeg );
9620: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  ..      for(iSeg
9630: 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
9640: 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
9650: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9660: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9670: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9680: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
9690: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
96a0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
96b0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
96c0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
96d0: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
96e0: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
96f0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9700: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
9710: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
9720: 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  oLast);.      }.
9730: 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44      }..    fts5D
9740: 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
9750: 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
9760: 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b  , buf.p, buf.n);
9770: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
9780: 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 7d  ree(&buf);.  }.}
9790: 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 76  ..#if 0.static v
97a0: 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72  oid fts5DebugStr
97b0: 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73 35  ucture(int*,Fts5
97c0: 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72 75  Buffer*,Fts5Stru
97d0: 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63 20  cture*);.static 
97e0: 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53 74  void fts5PrintSt
97f0: 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63 68  ructure(const ch
9800: 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74  ar *zCaption, Ft
9810: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9820: 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  ruct){.  int rc 
9830: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
9840: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20  ts5Buffer buf;. 
9850: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
9860: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20   sizeof(buf));. 
9870: 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
9880: 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20 70  ure(&rc, &buf, p
9890: 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69 6e  Struct);.  fprin
98a0: 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a 20  tf(stdout, "%s: 
98b0: 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c  %s\n", zCaption,
98c0: 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73   buf.p);.  fflus
98d0: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74 73  h(stdout);.  fts
98e0: 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
98f0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
9900: 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74 72  ine fts5PrintStr
9910: 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e 64  ucture(x,y).#end
9920: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  if..static int f
9930: 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 46  ts5SegmentSize(F
9940: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
9950: 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72 65  ent *pSeg){.  re
9960: 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70  turn 1 + pSeg->p
9970: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
9980: 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a  pgnoFirst;.}../*
9990: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70  .** Return a cop
99a0: 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  y of index struc
99b0: 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 45 78  ture pStruct. Ex
99c0: 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73  cept, promote as
99d0: 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65 6e   many .** segmen
99e0: 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74  ts as possible t
99f0: 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65  o level iPromote
9a00: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  . If an OOM occu
9a10: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20  rs, NULL is .** 
9a20: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
9a30: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
9a40: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
9a50: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
9a60: 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 2c  .  int iPromote,
9a70: 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65  .  int szPromote
9a80: 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
9a90: 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20  e *pStruct.){.  
9aa0: 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46 74  int il, is;.  Ft
9ab0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9ac0: 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75 63   *pOut = &pStruc
9ad0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f  t->aLevel[iPromo
9ae0: 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75 74  te];..  if( pOut
9af0: 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ->nMerge==0 ){. 
9b00: 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f     for(il=iPromo
9b10: 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74  te+1; il<pStruct
9b20: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b  ->nLevel; il++){
9b30: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
9b40: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
9b50: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
9b60: 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69 66  el[il];.      if
9b70: 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  ( pLvl->nMerge )
9b80: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66   return;.      f
9b90: 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67  or(is=pLvl->nSeg
9ba0: 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29  -1; is>=0; is--)
9bb0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
9bc0: 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69   = fts5SegmentSi
9bd0: 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  ze(&pLvl->aSeg[i
9be0: 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s]);.        if(
9bf0: 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 20   sz>szPromote ) 
9c00: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
9c10: 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
9c20: 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
9c30: 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d 6f   pStruct, iPromo
9c40: 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
9c50: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
9c60: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 6d  eturn;.        m
9c70: 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67  emcpy(pOut->aSeg
9c80: 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73  , &pLvl->aSeg[is
9c90: 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  ], sizeof(Fts5St
9ca0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29  ructureSegment))
9cb0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  ;.        pOut->
9cc0: 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nSeg++;.        
9cd0: 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20  pLvl->nSeg--;.  
9ce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20 73  }../*.** A new s
9d00: 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20  egment has just 
9d10: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
9d20: 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69 6e  level iLvl of in
9d30: 64 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  dex structure.**
9d40: 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20 66   pStruct. This f
9d50: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
9d60: 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65 6e  es if any segmen
9d70: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f  ts should be pro
9d80: 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72 65  moted.** as a re
9d90: 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20 61  sult. Segments a
9da0: 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20 74  re promoted in t
9db0: 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
9dc0: 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65 20  .**   a) If the 
9dd0: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
9de0: 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72 20  tten is smaller 
9df0: 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  than one or more
9e00: 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20 20   segments.**    
9e10: 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 72 65    within the pre
9e20: 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64 20  vious populated 
9e30: 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72 6f  level, it is pro
9e40: 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72 65  moted to the pre
9e50: 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70 6f  vious.**      po
9e60: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a 2a  pulated level..*
9e70: 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68 65  *.**   b) If the
9e80: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
9e90: 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72 20  itten is larger 
9ea0: 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74 20  than the newest 
9eb0: 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20  segment on.**   
9ec0: 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70 75     the next popu
9ed0: 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68 65  lated level, the
9ee0: 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c 20  n that segment, 
9ef0: 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61 64  and any other ad
9f00: 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20 73  jacent.**      s
9f10: 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65  egments that are
9f20: 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74 68   also smaller th
9f30: 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74 20  an the one just 
9f40: 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a 2a  written, are .**
9f50: 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e 20        promoted. 
9f60: 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f 72  .**.** If one or
9f70: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 61   more segments a
9f80: 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68 65  re promoted, the
9f90: 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
9fa0: 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a 20  t is updated.** 
9fb0: 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  to reflect this.
9fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9fd0: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9fe0: 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  mote(.  Fts5Inde
9ff0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
a000: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
a010: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
a020: 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20  /.  int iLvl,   
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a040: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65 76      /* Index lev
a050: 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64 20  el just updated 
a060: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
a070: 72 65 20 2a 70 53 74 72 75 63 74 20 20 20 20 20  re *pStruct     
a080: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
a090: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
a0a0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a0b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
a0c0: 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 50  iTst;.    int iP
a0d0: 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20 20  romote = -1;.   
a0e0: 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20 3d   int szPromote =
a0f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
a100: 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68 69  * Promote anythi
a110: 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72 20  ng this size or 
a120: 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 46  smaller */.    F
a130: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
a140: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20  ent *pSeg;   /* 
a150: 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  Segment just wri
a160: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
a170: 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20  szSeg;          
a180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a190: 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73  e of segment jus
a1a0: 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  t written */.   
a1b0: 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72   int nSeg = pStr
a1c0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
a1d0: 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66 28  ].nSeg;..    if(
a1e0: 20 6e 53 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nSeg==0 ) retur
a1f0: 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  n;.    pSeg = &p
a200: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a210: 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63  Lvl].aSeg[pStruc
a220: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
a230: 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53  nSeg-1];.    szS
a240: 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e  eg = (1 + pSeg->
a250: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
a260: 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20  >pgnoFirst);..  
a270: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
a280: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a  ondition (a) */.
a290: 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76      for(iTst=iLv
a2a0: 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20  l-1; iTst>=0 && 
a2b0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
a2c0: 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69  iTst].nSeg==0; i
a2d0: 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20  Tst--);.    if( 
a2e0: 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iTst>=0 ){.     
a2f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
a300: 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20  t szMax = 0;.   
a310: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
a320: 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70  Level *pTst = &p
a330: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a340: 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Tst];.      asse
a350: 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65  rt( pTst->nMerge
a360: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
a370: 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53  (i=0; i<pTst->nS
a380: 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
a390: 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d    int sz = pTst-
a3a0: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73  >aSeg[i].pgnoLas
a3b0: 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69  t - pTst->aSeg[i
a3c0: 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b  ].pgnoFirst + 1;
a3d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
a3e0: 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20  szMax ) szMax = 
a3f0: 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
a400: 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53    if( szMax>=szS
a410: 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  eg ){.        /*
a420: 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69   Condition (a) i
a430: 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20  s true. Promote 
a440: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
a450: 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20  nt on level .   
a460: 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20       ** iLvl to 
a470: 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a  level iTst.  */.
a480: 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65          iPromote
a490: 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20   = iTst;.       
a4a0: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d   szPromote = szM
a4b0: 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ax;.      }.    
a4c0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e  }..    /* If con
a4d0: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f  dition (a) is no
a4e0: 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62  t met, assume (b
a4f0: 29 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63  ) is true. Struc
a500: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a  turePromoteTo().
a510: 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f      ** is a no-o
a520: 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  p if it is not. 
a530: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f   */.    if( iPro
a540: 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  mote<0 ){.      
a550: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b  iPromote = iLvl;
a560: 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65  .      szPromote
a570: 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a   = szSeg;.    }.
a580: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
a590: 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50  ePromoteTo(p, iP
a5a0: 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74  romote, szPromot
a5b0: 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  e, pStruct);.  }
a5c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  .}.../*.** Advan
a5d0: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a5e0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a5f0: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ly argument. If 
a600: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
a610: 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
a620: 20 70 61 67 65 20 69 73 20 72 65 61 63 68 65 64   page is reached
a630: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
a640: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
a650: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
a660: 74 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a  t(Fts5DlidxLvl *
a670: 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74  pLvl){.  Fts5Dat
a680: 61 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d  a *pData = pLvl-
a690: 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70  >pData;..  if( p
a6a0: 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a  Lvl->iOff==0 ){.
a6b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
a6c0: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20  ->bEof==0 );.   
a6d0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b   pLvl->iOff = 1;
a6e0: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
a6f0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
a700: 33 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c  32(&pData->p[1],
a710: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a720: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  );.    pLvl->iOf
a730: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
a740: 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76  nt(&pData->p[pLv
a750: 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  l->iOff], (u64*)
a760: 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a  &pLvl->iRowid);.
a770: 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74      pLvl->iFirst
a780: 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off = pLvl->iOff
a790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a7a0: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72  nt iOff;.    for
a7b0: 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66  (iOff=pLvl->iOff
a7c0: 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e  ; iOff<pData->nn
a7d0: 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20  ; iOff++){.     
a7e0: 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f   if( pData->p[iO
a7f0: 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20  ff] ) break; .  
a800: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66    }..    if( iOf
a810: 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20  f<pData->nn ){. 
a820: 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20       i64 iVal;. 
a830: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66       pLvl->iLeaf
a840: 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20  Pgno += (iOff - 
a850: 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31 3b  pLvl->iOff) + 1;
a860: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
a870: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
a880: 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ata->p[iOff], (u
a890: 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20  64*)&iVal);.    
a8a0: 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2b    pLvl->iRowid +
a8b0: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c  = iVal;.      pL
a8c0: 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b  vl->iOff = iOff;
a8d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a8e0: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31    pLvl->bEof = 1
a8f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
a900: 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66  eturn pLvl->bEof
a910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
a920: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a930: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a940: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
a950: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
a960: 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 46 74  lidxIterNextR(Ft
a970: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
a980: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
a990: 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46  , int iLvl){.  F
a9a0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
a9b0: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
a9c0: 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72  [iLvl];..  asser
a9d0: 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e  t( iLvl<pIter->n
a9e0: 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73  Lvl );.  if( fts
a9f0: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
aa00: 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  vl) ){.    if( (
aa10: 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d  iLvl+1) < pIter-
aa20: 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66  >nLvl ){.      f
aa30: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
aa40: 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c  R(p, pIter, iLvl
aa50: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +1);.      if( p
aa60: 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29  Lvl[1].bEof==0 )
aa70: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
aa80: 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e  taRelease(pLvl->
aa90: 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
aaa0: 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20  memset(pLvl, 0, 
aab0: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
aac0: 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70  Lvl));.        p
aad0: 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
aae0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
aaf0: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
ab00: 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72  LIDX_ROWID(pIter
ab10: 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20  ->iSegid, iLvl, 
ab20: 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e  pLvl[1].iLeafPgn
ab30: 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
ab40: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
ab50: 70 44 61 74 61 20 29 20 66 74 73 35 44 6c 69 64  pData ) fts5Dlid
ab60: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b 0a  xLvlNext(pLvl);.
ab70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ab80: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
ab90: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b  r->aLvl[0].bEof;
aba0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  .}.static int ft
abb0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
abc0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
abd0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
abe0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74  er){.  return ft
abf0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
ac00: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d  (p, pIter, 0);.}
ac10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
ac20: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
ac30: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
ac40: 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  t has the follow
ac50: 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a  ing fields set.*
ac60: 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68  * as follows. Th
ac70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
ac80: 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20   up the rest of 
ac90: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20  the iterator so 
aca0: 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74  that it.** point
acb0: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
acc0: 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
acd0: 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ist-index..**.**
ace0: 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 20     pData:.**    
acf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   pointer to docl
ad00: 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64  ist-index record
ad10: 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  , .**.** When th
ad20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
ad30: 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c 65  alled pIter->iLe
ad40: 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70 61  afPgno is the pa
ad50: 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a 2a  ge number the.**
ad60: 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73 6f   doclist is asso
ad70: 63 69 61 74 65 64 20 77 69 74 68 20 28 74 68 65  ciated with (the
ad80: 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20 74   one featuring t
ad90: 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61  he term)..*/.sta
ada0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
adb0: 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44  xIterFirst(Fts5D
adc0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
add0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
ade0: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
adf0: 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  Lvl; i++){.    f
ae00: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
ae10: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29  &pIter->aLvl[i])
ae20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ae30: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
ae40: 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69  of;.}...static i
ae50: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
ae60: 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
ae70: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
ae80: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
ae90: 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  n p->rc!=SQLITE_
aea0: 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c 76  OK || pIter->aLv
aeb0: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74  l[0].bEof;.}..st
aec0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
aed0: 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35  idxIterLast(Fts5
aee0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
aef0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
af00: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
af10: 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65 76  Advance each lev
af20: 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  el to the last e
af30: 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73 74  ntry on the last
af40: 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28 69   page */.  for(i
af50: 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20  =pIter->nLvl-1; 
af60: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
af70: 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a   && i>=0; i--){.
af80: 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
af90: 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
afa0: 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77 68  >aLvl[i];.    wh
afb0: 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76  ile( fts5DlidxLv
afc0: 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29  lNext(pLvl)==0 )
afd0: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66  ;.    pLvl->bEof
afe0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
aff0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  >0 ){.      Fts5
b000: 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c 64  DlidxLvl *pChild
b010: 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20   = &pLvl[-1];.  
b020: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
b030: 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61 74  ase(pChild->pDat
b040: 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  a);.      memset
b050: 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a 65  (pChild, 0, size
b060: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b070: 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  );.      pChild-
b080: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
b090: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
b0a0: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
b0b0: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
b0c0: 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69  id, i-1, pLvl->i
b0d0: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
b0e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
b0f0: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
b100: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
b110: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
b120: 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76 69  ent to the previ
b130: 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  ous entry..*/.st
b140: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b150: 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44 6c  dxLvlPrev(Fts5Dl
b160: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20  idxLvl *pLvl){. 
b170: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76 6c   int iOff = pLvl
b180: 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72  ->iOff;..  asser
b190: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
b1a0: 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d   );.  if( iOff<=
b1b0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b1c0: 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  ){.    pLvl->bEo
b1d0: 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f = 1;.  }else{.
b1e0: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76 6c      u8 *a = pLvl
b1f0: 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20  ->pData->p;.    
b200: 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e  i64 iVal;.    in
b210: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 6e  t iLimit;.    in
b220: 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 5a  t ii;.    int nZ
b230: 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ero = 0;..    /*
b240: 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20   Currently iOff 
b250: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
b260: 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61  rst byte of a va
b270: 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  rint. This block
b280: 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65   .    ** decreme
b290: 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69  nts iOff until i
b2a0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
b2b0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
b2c0: 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20  e previous .    
b2d0: 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e  ** varint. Takin
b2e0: 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65  g care not to re
b2f0: 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f  ad any memory lo
b300: 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63  cations that occ
b310: 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ur.    ** before
b320: 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d   the buffer in m
b330: 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69  emory.  */.    i
b340: 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20  Limit = (iOff>9 
b350: 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20  ? iOff-9 : 0);. 
b360: 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69     for(iOff--; i
b370: 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66  Off>iLimit; iOff
b380: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
b390: 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30  a[iOff-1] & 0x80
b3a0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
b3b0: 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65 74    }..    fts5Get
b3c0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
b3d0: 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20   (u64*)&iVal);. 
b3e0: 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20     pLvl->iRowid 
b3f0: 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76  -= iVal;.    pLv
b400: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a  l->iLeafPgno--;.
b410: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63  .    /* Skip bac
b420: 6b 77 61 72 64 73 20 70 61 73 74 20 61 6e 79 20  kwards past any 
b430: 30 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f  0x00 varints. */
b440: 0a 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66  .    for(ii=iOff
b450: 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46  -1; ii>=pLvl->iF
b460: 69 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d  irstOff && a[ii]
b470: 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20  ==0x00; ii--){. 
b480: 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20       nZero++;.  
b490: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d    }.    if( ii>=
b4a0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b4b0: 26 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30  && (a[ii] & 0x80
b4c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
b4d0: 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  e byte immediate
b4e0: 6c 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61  ly before the la
b4f0: 73 74 20 30 78 30 30 20 62 79 74 65 20 68 61 73  st 0x00 byte has
b500: 20 74 68 65 20 30 78 38 30 20 62 69 74 0a 20 20   the 0x80 bit.  
b510: 20 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74      ** set. So t
b520: 68 65 20 6c 61 73 74 20 30 78 30 30 20 69 73 20  he last 0x00 is 
b530: 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20  only a varint 0 
b540: 69 66 20 74 68 65 72 65 20 61 72 65 20 38 20 6d  if there are 8 m
b550: 6f 72 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a  ore 0x80.      *
b560: 2a 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 61  * bytes before a
b570: 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69  [ii]. */.      i
b580: 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20  nt bZero = 0;   
b590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
b5a0: 75 65 20 69 66 20 6c 61 73 74 20 30 78 30 30 20  ue if last 0x00 
b5b0: 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  counts */.      
b5c0: 69 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c  if( (ii-8)>=pLvl
b5d0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
b5e0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
b5f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
b600: 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20  <=8 && (a[ii-j] 
b610: 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20  & 0x80); j++);. 
b620: 20 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28         bZero = (
b630: 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j>8);.      }.  
b640: 20 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30      if( bZero==0
b650: 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20   ) nZero--;.    
b660: 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61  }.    pLvl->iLea
b670: 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a  fPgno -= nZero;.
b680: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
b690: 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20   iOff - nZero;. 
b6a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
b6b0: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74  l->bEof;.}..stat
b6c0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
b6d0: 49 74 65 72 50 72 65 76 52 28 46 74 73 35 49 6e  IterPrevR(Fts5In
b6e0: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
b6f0: 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
b700: 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44  t iLvl){.  Fts5D
b710: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
b720: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76  &pIter->aLvl[iLv
b730: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  l];..  assert( i
b740: 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  Lvl<pIter->nLvl 
b750: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  );.  if( fts5Dli
b760: 64 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20  dxLvlPrev(pLvl) 
b770: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c  ){.    if( (iLvl
b780: 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76  +1) < pIter->nLv
b790: 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  l ){.      fts5D
b7a0: 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c  lidxIterPrevR(p,
b7b0: 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b   pIter, iLvl+1);
b7c0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b  .      if( pLvl[
b7d0: 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  1].bEof==0 ){.  
b7e0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
b7f0: 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
b800: 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  a);.        mems
b810: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
b820: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b830: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
b840: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
b850: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
b860: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
b870: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
b880: 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  egid, iLvl, pLvl
b890: 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  [1].iLeafPgno). 
b8a0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
b8b0: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
b8c0: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  a ){.          w
b8d0: 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c  hile( fts5DlidxL
b8e0: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20  vlNext(pLvl)==0 
b8f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  );.          pLv
b900: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20  l->bEof = 0;.   
b910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b920: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
b930: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
b940: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
b950: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
b960: 65 72 50 72 65 76 28 46 74 73 35 49 6e 64 65 78  erPrev(Fts5Index
b970: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
b980: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
b990: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
b9a0: 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72  erPrevR(p, pIter
b9b0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , 0);.}../*.** F
b9c0: 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ree a doclist-in
b9d0: 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  dex iterator obj
b9e0: 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ect allocated by
b9f0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e   fts5DlidxIterIn
ba00: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
ba10: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
ba20: 65 72 46 72 65 65 28 46 74 73 35 44 6c 69 64 78  erFree(Fts5Dlidx
ba30: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ba40: 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
ba50: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
ba60: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
ba70: 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  vl; i++){.      
ba80: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
ba90: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70  pIter->aLvl[i].p
baa0: 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
bab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
bac0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
bad0: 74 69 63 20 46 74 73 35 44 6c 69 64 78 49 74 65  tic Fts5DlidxIte
bae0: 72 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72  r *fts5DlidxIter
baf0: 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
bb00: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
bb10: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20          /* Fts5 
bb20: 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  Backend to itera
bb30: 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
bb40: 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb60: 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52  * True for ORDER
bb70: 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74   BY ASC */.  int
bb80: 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20   iSegid,        
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bba0: 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
bbb0: 69 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20 20  int iLeafPg     
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d  /* Leaf page num
bbe0: 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64  ber to load dlid
bbf0: 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74  x for */.){.  Ft
bc00: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bc10: 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  er = 0;.  int i;
bc20: 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30  .  int bDone = 0
bc30: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  ;..  for(i=0; p-
bc40: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
bc50: 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29  & bDone==0; i++)
bc60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
bc70: 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
bc80: 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  of(Fts5DlidxIter
bc90: 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28 46  ) + i * sizeof(F
bca0: 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20  ts5DlidxLvl);.  
bcb0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
bcc0: 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77  *pNew;..    pNew
bcd0: 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74 65   = (Fts5DlidxIte
bce0: 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
bcf0: 6f 63 36 34 28 70 49 74 65 72 2c 20 6e 42 79 74  oc64(pIter, nByt
bd00: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
bd10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
bd20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
bd30: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
bd40: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
bd50: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
bd60: 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65  D(iSegid, i, iLe
bd70: 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73  afPg);.      Fts
bd80: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
bd90: 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d  = &pNew->aLvl[i]
bda0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20  ;.      pIter = 
bdb0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73  pNew;.      mems
bdc0: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
bdd0: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
bde0: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
bdf0: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
be00: 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a  ead(p, iRowid);.
be10: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
be20: 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e  pData && (pLvl->
be30: 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78  pData->p[0] & 0x
be40: 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0001)==0 ){.    
be50: 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
be60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
be70: 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a  er->nLvl = i+1;.
be80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
be90: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
bea0: 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
beb0: 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
bec0: 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
bed0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
bee0: 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74  idxIterFirst(pIt
bef0: 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
bf00: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
bf10: 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72  terLast(p, pIter
bf20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
bf30: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
bf40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35  E_OK ){.    fts5
bf50: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49  DlidxIterFree(pI
bf60: 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20  ter);.    pIter 
bf70: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
bf80: 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61  rn pIter;.}..sta
bf90: 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64  tic i64 fts5Dlid
bfa0: 78 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44  xIterRowid(Fts5D
bfb0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
bfc0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  {.  return pIter
bfd0: 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64  ->aLvl[0].iRowid
bfe0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
bff0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
c000: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
c010: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
c020: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
c030: 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  iLeafPgno;.}../*
c040: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78  .** Load the nex
c050: 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f  t leaf page into
c060: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65   the segment ite
c070: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
c080: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
c090: 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73  rNextPage(.  Fts
c0a0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c0c0: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
c0d0: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
c0e0: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
c0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
c100: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
c110: 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  to next page */.
c120: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
c130: 4c 65 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75  Leaf;.  Fts5Stru
c140: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
c150: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
c160: 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
c170: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
c180: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
c190: 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70  fPgno++;.  if( p
c1a0: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
c1b0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  ){.    pIter->pL
c1c0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  eaf = pIter->pNe
c1d0: 78 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65  xtLeaf;.    pIte
c1e0: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30  r->pNextLeaf = 0
c1f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ;.  }else if( pI
c200: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d  ter->iLeafPgno<=
c210: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
c220: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
c230: 61 66 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61  af = fts5LeafRea
c240: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54  d(p, .        FT
c250: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
c260: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
c270: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  Iter->iLeafPgno)
c280: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
c290: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
c2a0: 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65  f = 0;.  }.  pLe
c2b0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
c2c0: 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20  f;..  if( pLeaf 
c2d0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  ){.    pIter->iP
c2e0: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
c2f0: 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28  >szLeaf;.    if(
c300: 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
c310: 65 73 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20  ess(pLeaf) ){.  
c320: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c330: 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66  fDoclist = pLeaf
c340: 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  ->nn+1;.    }els
c350: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
c360: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
c370: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
c380: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50  eaf->p[pIter->iP
c390: 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20  gidxOff],.      
c3a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c3b0: 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29  fDoclist.      )
c3c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c3d0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
c3e0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
c3f0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
c400: 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74  varint to be int
c410: 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a  erpreted as a.**
c420: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
c430: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
c440: 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72  the varint and r
c450: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c460: 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61   of bytes.** rea
c470: 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  d. Before return
c480: 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74  ing, set *pnSz t
c490: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
c4a0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73  bytes in the pos
c4b0: 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61  ition.** list, a
c4c0: 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75  nd *pbDel to tru
c4d0: 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20  e if the delete 
c4e0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20  flag is set, or 
c4f0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
c500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c510: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
c520: 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69  e(const u8 *p, i
c530: 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70  nt *pnSz, int *p
c540: 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a  bDel){.  int nSz
c550: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
c560: 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
c570: 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b  nt32(p, n, nSz);
c580: 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53  .  assert_nc( nS
c590: 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20  z>=0 );.  *pnSz 
c5a0: 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65  = nSz/2;.  *pbDe
c5b0: 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31  l = nSz & 0x0001
c5c0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c5d0: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
c5e0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
c5f0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
c600: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
c610: 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69  e of a.** positi
c620: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
c630: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c  ld. Read the val
c640: 75 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  ue of the field 
c650: 61 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20  and store it.** 
c660: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
c670: 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
c680: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
c690: 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65  nPos.**   Fts5Se
c6a0: 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a  gIter.bDel.**.**
c6b0: 20 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74   Leave Fts5SegIt
c6c0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
c6d0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
c6e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
c6f0: 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69   .** position li
c700: 73 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61  st content (if a
c710: 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ny)..*/.static v
c720: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
c730: 6f 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65  oadNPos(Fts5Inde
c740: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
c750: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
c760: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
c770: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  K ){.    int iOf
c780: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
c790: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
c7a0: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
c7b0: 0a 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  .    ASSERT_SZLE
c7c0: 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65  AF_OK(pIter->pLe
c7d0: 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  af);.    if( p->
c7e0: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
c7f0: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
c800: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  NE ){.      int 
c810: 69 45 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72  iEod = MIN(pIter
c820: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c  ->iEndofDoclist,
c830: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
c840: 7a 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49  zLeaf);.      pI
c850: 74 65 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20  ter->bDel = 0;. 
c860: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
c870: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
c880: 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74  iOff<iEod && pIt
c890: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  er->pLeaf->p[iOf
c8a0: 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
c8b0: 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31   pIter->bDel = 1
c8c0: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b  ;.        iOff++
c8d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f  ;.        if( iO
c8e0: 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72  ff<iEod && pIter
c8f0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
c900: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
c910: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31   pIter->nPos = 1
c920: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
c930: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
c940: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  e{.          pIt
c950: 65 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20  er->nPos = 0;.  
c960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c980: 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20   int nSz;.      
c990: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
c9a0: 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  t32(pIter->pLeaf
c9b0: 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b  ->p, iOff, nSz);
c9c0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44  .      pIter->bD
c9d0: 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30  el = (nSz & 0x00
c9e0: 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  01);.      pIter
c9f0: 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b  ->nPos = nSz>>1;
ca00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
ca10: 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30  ( pIter->nPos>=0
ca20: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49   );.    }.    pI
ca30: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ca40: 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a   = iOff;.  }.}..
ca50: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ca60: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
ca70: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
ca80: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
ca90: 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  r){.  u8 *a = pI
caa0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
cab0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
cac0: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
cad0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
cae0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
caf0: 66 73 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f  fset;..  ASSERT_
cb00: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
cb10: 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69  >pLeaf);.  if( i
cb20: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
cb30: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
cb40: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
cb50: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
cb60: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
cb70: 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
cb80: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
cb90: 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
cba0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
cbb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
cbc0: 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a  }.    iOff = 4;.
cbd0: 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
cbe0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69  Leaf->p;.  }.  i
cbf0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
cc00: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
cc10: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
cc20: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70  er->iRowid);.  p
cc30: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cc40: 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  t = iOff;.}../*.
cc50: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
cc60: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
cc70: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
cc80: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
cc90: 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69   the .** "nSuffi
cca0: 78 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65  x" field of a te
ccb0: 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72  rm. Function par
ccc0: 61 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e  ameter nKeep con
ccd0: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a  tains the value.
cce0: 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66  ** of the "nPref
ccf0: 69 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68  ix" field (if th
cd00: 65 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74  ere was one - it
cd10: 20 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20   is passed 0 if 
cd20: 74 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  this is.** the f
cd30: 69 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  irst term in the
cd40: 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a   segment)..**.**
cd50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
cd60: 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  opulates:.**.** 
cd70: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 74 65    Fts5SegIter.te
cd80: 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  rm.**   Fts5SegI
cd90: 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  ter.rowid.**.** 
cda0: 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20  accordingly and 
cdb0: 6c 65 61 76 65 73 20 28 46 74 73 35 53 65 67 49  leaves (Fts5SegI
cdc0: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29  ter.iLeafOffset)
cdd0: 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74   set to the cont
cde0: 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  ent of.** the fi
cdf0: 72 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  rst position lis
ce00: 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20  t. The position 
ce10: 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74  list belonging t
ce20: 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28  o document .** (
ce30: 46 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77  Fts5SegIter.iRow
ce40: 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
ce50: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
ce60: 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65  oadTerm(Fts5Inde
ce70: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
ce80: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b  r *pIter, int nK
ce90: 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  eep){.  u8 *a = 
cea0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
ceb0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
cec0: 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  r to read data f
ced0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  rom */.  int iOf
cee0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
cef0: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
cf00: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
cf10: 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e     /* Bytes of n
cf40: 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f  ew data */..  iO
cf50: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
cf60: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
cf70: 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 69 4f 66  nNew);.  if( iOf
cf80: 66 2b 6e 4e 65 77 3e 70 49 74 65 72 2d 3e 70 4c  f+nNew>pIter->pL
cf90: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 7c 7c 20 6e  eaf->szLeaf || n
cfa0: 4b 65 65 70 3e 70 49 74 65 72 2d 3e 74 65 72 6d  Keep>pIter->term
cfb0: 2e 6e 20 7c 7c 20 6e 4e 65 77 3d 3d 30 20 29 7b  .n || nNew==0 ){
cfc0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
cfd0: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
cfe0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74  eturn;.  }.  pIt
cff0: 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65  er->term.n = nKe
d000: 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  ep;.  fts5Buffer
d010: 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
d020: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
d030: 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
d040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
d050: 72 2d 3e 74 65 72 6d 2e 6e 3c 3d 70 49 74 65 72  r->term.n<=pIter
d060: 2d 3e 74 65 72 6d 2e 6e 53 70 61 63 65 20 29 3b  ->term.nSpace );
d070: 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  .  iOff += nNew;
d080: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
d090: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
d0a0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
d0b0: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
d0c0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70  ->iLeafPgno;.  p
d0d0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d0e0: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28  t = iOff;..  if(
d0f0: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
d100: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
d110: 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >nn ){.    pIter
d120: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
d130: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d140: 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
d150: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
d160: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
d170: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
d180: 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d  rint32(&a[pIter-
d190: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78  >iPgidxOff], nEx
d1a0: 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  tra);.    pIter-
d1b0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b  >iEndofDoclist +
d1c0: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20  = nExtra;.  }.. 
d1d0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
d1e0: 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
d1f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
d200: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
d210: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
d220: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
d230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d240: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76  5SegIterNext_Rev
d250: 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 2a 2c  erse(Fts5Index*,
d260: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
d270: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  nt*);.static voi
d280: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
d290: 74 5f 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65 78  t_None(Fts5Index
d2a0: 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c  *, Fts5SegIter*,
d2b0: 20 69 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20   int*);..static 
d2c0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d2d0: 53 65 74 4e 65 78 74 28 46 74 73 35 49 6e 64 65  SetNext(Fts5Inde
d2e0: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
d2f0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
d300: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
d310: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
d320: 45 52 53 45 20 29 7b 0a 20 20 20 20 70 49 74 65  ERSE ){.    pIte
d330: 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53  r->xNext = fts5S
d340: 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72  egIterNext_Rever
d350: 73 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  se;.  }else if( 
d360: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
d370: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
d380: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49 74  _NONE ){.    pIt
d390: 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  er->xNext = fts5
d3a0: 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65  SegIterNext_None
d3b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d3c0: 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74  Iter->xNext = ft
d3d0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 3b 0a 20  s5SegIterNext;. 
d3e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
d3f0: 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61  ialize the itera
d400: 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72  tor object pIter
d410: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
d420: 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20  ugh the entries 
d430: 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53  in.** segment pS
d440: 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72  eg. The iterator
d450: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
d460: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
d470: 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68  ntry when .** th
d480: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
d490: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  rns..**.** If an
d4a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
d4b0: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
d4c0: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
d4d0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
d4e0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
d4f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
d500: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
d510: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d520: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
d530: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
d540: 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69  d fts5SegIterIni
d550: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
d560: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
d570: 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
d580: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
d590: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
d5a0: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
d5b0: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
d5c0: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
d5d0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d5f0: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
d600: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  te */.){.  if( p
d610: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
d620: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
d630: 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
d640: 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67  segment is being
d650: 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75   used as an inpu
d660: 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t to an incremen
d670: 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65  tal.    ** merge
d680: 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61   and all data ha
d690: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22  s already been "
d6a0: 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75  trimmed". See fu
d6b0: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74  nction.    ** ft
d6c0: 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29  s5TrimSegments()
d6d0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e   for details. In
d6e0: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
d6f0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d   the iterator em
d700: 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  pty..    ** The 
d710: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20  caller will see 
d720: 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61  the (pIter->pLea
d730: 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65  f==0) and assume
d740: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
d750: 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61  .    ** at EOF a
d760: 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61  lready. */.    a
d770: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
d780: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  eaf==0 );.    re
d790: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
d7a0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d7b0: 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  K ){.    memset(
d7c0: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
d7d0: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66  (*pIter));.    f
d7e0: 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78  ts5SegIterSetNex
d7f0: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
d800: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
d810: 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Seg;.    pIter->
d820: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67  iLeafPgno = pSeg
d830: 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20  ->pgnoFirst-1;. 
d840: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
d850: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
d860: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
d870: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d880: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
d890: 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20  fOffset = 4;.   
d8a0: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65   assert_nc( pIte
d8b0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29  r->pLeaf->nn>4 )
d8c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  ;.    assert_nc(
d8d0: 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
d8e0: 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65  rmOff(pIter->pLe
d8f0: 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49  af)==4 );.    pI
d900: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
d910: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
d920: 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66 74 73  zLeaf+1;.    fts
d930: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
d940: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
d950: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
d960: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
d970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
d980: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d990: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
d9a0: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
d9b0: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74  eated by calls t
d9c0: 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75  o.** Fts5IndexQu
d9d0: 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20 46  ery() with the F
d9e0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
d9f0: 45 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ESC flag set..**
da00: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
da10: 20 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61   is in an unusua
da20: 6c 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  l state when thi
da30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
da40: 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73  lled: the.** Fts
da50: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
da60: 66 73 65 74 20 76 61 72 69 61 62 6c 65 20 69 73  fset variable is
da70: 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
da80: 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  et of the start 
da90: 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69  of.** the positi
daa0: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
dab0: 6c 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ld for the first
dac0: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
dad0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  on the page..** 
dae0: 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69  Fts5SegIter.rowi
daf0: 64 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50  d is set, but nP
db00: 6f 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20  os and bDel are 
db10: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  not..**.** This 
db20: 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65  function advance
db30: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  s the iterator s
db40: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
db50: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a   to the last .**
db60: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
db70: 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c  on the page and,
db80: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69   if necessary, i
db90: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a  nitializes the .
dba0: 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  ** aRowidOffset[
dbb0: 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73  ] and iRowidOffs
dbc0: 65 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74  et variables. At
dbd0: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
dbe0: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  iterator.** is i
dbf0: 6e 20 69 74 73 20 72 65 67 75 6c 61 72 20 73 74  n its regular st
dc00: 61 74 65 20 2d 20 46 74 73 35 53 65 67 49 74 65  ate - Fts5SegIte
dc10: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
dc20: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
dc30: 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65  t.** byte of the
dc40: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
dc50: 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65  ontent associate
dc60: 64 20 77 69 74 68 20 73 61 69 64 20 72 6f 77 69  d with said rowi
dc70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
dc80: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
dc90: 65 72 73 65 49 6e 69 74 50 61 67 65 28 46 74 73  erseInitPage(Fts
dca0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
dcb0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
dcc0: 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
dcd0: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
dce0: 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ail;.  int n = p
dcf0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
dd00: 65 61 66 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  eaf;.  int i = p
dd10: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
dd20: 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  t;.  u8 *a = pIt
dd30: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
dd40: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74  int iRowidOffset
dd50: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 70   = 0;..  if( n>p
dd60: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dd70: 69 73 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  ist ){.    n = p
dd80: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dd90: 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41 53 53 45  ist;.  }..  ASSE
dda0: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
ddb0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77 68  er->pLeaf);.  wh
ddc0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
ddd0: 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 0a 20  4 iDelta = 0;.. 
dde0: 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
ddf0: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
de00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64   ){.      /* tod
de10: 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  o */.      if( i
de20: 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 7b  <n && a[i]==0 ){
de30: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
de40: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26        if( i<n &&
de50: 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b 2b 3b 0a   a[i]==0 ) i++;.
de60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
de70: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  e{.      int nPo
de80: 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 75  s;.      int bDu
de90: 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  mmy;.      i += 
dea0: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
deb0: 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c  ze(&a[i], &nPos,
dec0: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
ded0: 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20   i += nPos;.    
dee0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29  }.    if( i>=n )
def0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d   break;.    i +=
df00: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
df10: 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  a[i], (u64*)&iDe
df20: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
df30: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
df40: 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65  a;..    /* If ne
df50: 63 65 73 73 61 72 79 2c 20 67 72 6f 77 20 74 68  cessary, grow th
df60: 65 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e pIter->aRowidO
df70: 66 66 73 65 74 5b 5d 20 61 72 72 61 79 2e 20 2a  ffset[] array. *
df80: 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  /.    if( iRowid
df90: 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e  Offset>=pIter->n
dfa0: 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a 20  RowidOffset ){. 
dfb0: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
dfc0: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
dfd0: 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20 69  set + 8;.      i
dfe0: 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a  nt *aNew = (int*
dff0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
e000: 36 34 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64  64(pIter->aRowid
e010: 4f 66 66 73 65 74 2c 6e 4e 65 77 2a 73 69 7a 65  Offset,nNew*size
e020: 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
e030: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
e040: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
e050: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e070: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d    }.      pIter-
e080: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20  >aRowidOffset = 
e090: 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65  aNew;.      pIte
e0a0: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
e0b0: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20  = nNew;.    }.. 
e0c0: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
e0d0: 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66  Offset[iRowidOff
e0e0: 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e  set++] = pIter->
e0f0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
e100: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e110: 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70  set = i;.  }.  p
e120: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
e130: 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65  et = iRowidOffse
e140: 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  t;.  fts5SegIter
e150: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
e160: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  r);.}../*.**.*/.
e170: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e180: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
e190: 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20  wPage(Fts5Index 
e1a0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
e1b0: 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
e1c0: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
e1d0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
e1e0: 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65  EVERSE );.  asse
e1f0: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
e200: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
e210: 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74  ONETERM );..  ft
e220: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
e230: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
e240: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
e250: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
e260: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
e270: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70  ter->iLeafPgno>p
e280: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
e290: 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44  gno ){.    Fts5D
e2a0: 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ata *pNew;.    p
e2b0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
e2c0: 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74  -;.    pNew = ft
e2d0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
e2e0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
e2f0: 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  (.          pIte
e300: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  r->pSeg->iSegid,
e310: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
e320: 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66  o.    ));.    if
e330: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
e340: 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  /* iTermLeafOffs
e350: 65 74 20 6d 61 79 20 62 65 20 65 71 75 61 6c 20  et may be equal 
e360: 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74 68 65  to szLeaf if the
e370: 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73   term is the las
e380: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e 67  t.      ** thing
e390: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d 20 69   on the page - i
e3a0: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 72 6f  .e. the first ro
e3b0: 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20 66 6f  wid is on the fo
e3c0: 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a 20 20  llowing page..  
e3d0: 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
e3e0: 61 73 65 20 6c 65 61 76 65 20 70 49 74 65 72 2d  ase leave pIter-
e3f0: 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69 73 20  >pLeaf==0, this 
e400: 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
e410: 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  OF. */.      if(
e420: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
e430: 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  o==pIter->iTermL
e440: 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
e450: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
e460: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  ->pLeaf==0 );.  
e470: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
e480: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
e490: 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 29 7b  <pNew->szLeaf ){
e4a0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e4b0: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
e4c0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e4d0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  >iLeafOffset = p
e4e0: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
e4f0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
e500: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e510: 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
e520: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 52 6f  Off;.        iRo
e530: 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61  widOff = fts5Lea
e540: 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
e550: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
e560: 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20  ( iRowidOff ){. 
e570: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e580: 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20  pLeaf = pNew;.  
e590: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e5a0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52 6f  LeafOffset = iRo
e5b0: 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  widOff;.        
e5c0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e5d0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
e5e0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  f ){.        u8 
e5f0: 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65  *a = &pIter->pLe
e600: 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65  af->p[pIter->iLe
e610: 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20  afOffset];.     
e620: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e630: 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74  ffset += fts5Get
e640: 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29  Varint(a, (u64*)
e650: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
e660: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e670: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e680: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
e690: 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
e6a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e6b0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
e6c0: 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
e6d0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
e6e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
e6f0: 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  +1;.    fts5SegI
e700: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
e710: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
e720: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
e730: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
e740: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
e750: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e760: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a  ment currently.*
e770: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65  * points to a de
e780: 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20 64  lete marker. A d
e790: 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73 20  elete marker is 
e7a0: 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
e7b0: 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69  0 byte.** positi
e7c0: 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  on-list..*/.stat
e7d0: 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
e7e0: 49 74 65 72 49 73 45 6d 70 74 79 28 46 74 73 35  IterIsEmpty(Fts5
e7f0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74  Index *p, Fts5It
e800: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74  er *pIter){.  Ft
e810: 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
e820: 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  = &pIter->aSeg[p
e830: 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
e840: 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75 72  iFirst];.  retur
e850: 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
e860: 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c 65  _OK && pSeg->pLe
e870: 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73  af && pSeg->nPos
e880: 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ==0);.}../*.** A
e890: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
e8a0: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
e8b0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
e8c0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  his version of f
e8d0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29  ts5SegIterNext()
e8e0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
e8f0: 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f   reverse iterato
e900: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
e910: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
e920: 78 74 5f 52 65 76 65 72 73 65 28 0a 20 20 46 74  xt_Reverse(.  Ft
e930: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e950: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
e960: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
e970: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
e980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
e990: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
e9a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55 6e 75   */.  int *pbUnu
e9b0: 73 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  sed             
e9c0: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
e9d0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
e9e0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
e9f0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
ea00: 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RSE );.  assert(
ea10: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
ea20: 66 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  f==0 );.  UNUSED
ea30: 5f 50 41 52 41 4d 28 70 62 55 6e 75 73 65 64 29  _PARAM(pbUnused)
ea40: 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
ea50: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
ea60: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49  {.    u8 *a = pI
ea70: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
ea80: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
ea90: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
eaa0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
eab0: 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49 74  ffset--;.    pIt
eac0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
ead0: 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  = pIter->aRowidO
eae0: 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f  ffset[pIter->iRo
eaf0: 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  widOffset];.    
eb00: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
eb10: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
eb20: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
eb30: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
eb40: 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
eb50: 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f  ->eDetail!=FTS5_
eb60: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
eb70: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 49 74       iOff += pIt
eb80: 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a  er->nPos;.    }.
eb90: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
eba0: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
ebb0: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
ebc0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d  pIter->iRowid -=
ebd0: 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65   iDelta;.  }else
ebe0: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
ebf0: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
ec00: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
ec10: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
ec20: 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74  iterator pIter t
ec30: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
ec40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ..**.** This ver
ec50: 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49  sion of fts5SegI
ec60: 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c  terNext() is onl
ec70: 79 20 75 73 65 64 20 69 66 20 64 65 74 61 69 6c  y used if detail
ec80: 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a 2a  =none and the.**
ec90: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74   iterator is not
eca0: 20 61 20 72 65 76 65 72 73 65 20 64 69 72 65 63   a reverse direc
ecb0: 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a 2a  tion iterator..*
ecc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
ecd0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f  s5SegIterNext_No
ece0: 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ne(.  Fts5Index 
ecf0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ed00: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
ed10: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
ed20: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
ed30: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
ed40: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
ed50: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
ed60: 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ed80: 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65   OUT: Set for ne
ed90: 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69  w term */.){.  i
eda0: 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  nt iOff;..  asse
edb0: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
edc0: 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
edd0: 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  ( (pIter->flags 
ede0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
edf0: 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20 20  EVERSE)==0 );.  
ee00: 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
ee10: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
ee20: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
ee30: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
ee40: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
ee50: 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49 74  f);.  iOff = pIt
ee60: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
ee70: 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ..  /* Next entr
ee80: 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65 78 74  y is on the next
ee90: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
eea0: 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20 69 4f  Iter->pSeg && iO
eeb0: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
eec0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
eed0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
eee0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
eef0: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c 20     if( p->rc || 
ef00: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
ef10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 49  ) return;.    pI
ef20: 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b  ter->iRowid = 0;
ef30: 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20  .    iOff = 4;. 
ef40: 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70   }..  if( iOff<p
ef50: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
ef60: 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ist ){.    /* Ne
ef70: 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74  xt entry is on t
ef80: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
ef90: 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  */.    i64 iDelt
efa0: 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73  a;.    iOff += s
efb0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
efc0: 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  int(&pIter->pLea
efd0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
efe0: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
eff0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f000: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 70  et = iOff;.    p
f010: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
f020: 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 20  iDelta;.  }else 
f030: 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  if( (pIter->flag
f040: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
f050: 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29 7b 0a  _ONETERM)==0 ){.
f060: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
f070: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Seg ){.      int
f080: 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
f090: 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35    if( iOff!=fts5
f0a0: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
f0b0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 20 29  (pIter->pLeaf) )
f0c0: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
f0d0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
f0e0: 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
f0f0: 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  >p[iOff], nKeep)
f100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f110: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f120: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
f130: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
f140: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e  Term(p, pIter, n
f150: 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Keep);.    }else
f160: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  {.      const u8
f170: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
f180: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f190: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
f1a0: 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  int nList;.     
f1b0: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
f1c0: 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73  ScanNext(p->pHas
f1d0: 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
f1e0: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
f1f0: 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54  ry(p->pHash, &zT
f200: 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
f210: 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ist);.      if( 
f220: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
f230: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
f240: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
f250: 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73  f->p = (u8*)pLis
f260: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
f270: 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73  pLeaf->nn = nLis
f280: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
f290: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20  pLeaf->szLeaf = 
f2a0: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74  nList;.      pIt
f2b0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
f2c0: 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  t = nList;.     
f2d0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
f2e0: 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26 70 49  erSet(&p->rc,&pI
f2f0: 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29  ter->term, (int)
f300: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28  strlen(zTerm), (
f310: 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
f320: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
f330: 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
f340: 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34  rint(pList, (u64
f350: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
f360: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
f370: 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70  ( pbNewTerm ) *p
f380: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
f390: 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74 6f 20  }else{.    goto 
f3a0: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
f3b0: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
f3c0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
f3d0: 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b 0a  er);..  return;.
f3e0: 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a   next_none_eof:.
f3f0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f400: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f410: 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
f420: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
f430: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
f440: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
f450: 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
f460: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
f470: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
f480: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
f490: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
f4a0: 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20  code. It .** is 
f4b0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
f4c0: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
f4d0: 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
f4e0: 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  EOF. If an error
f4f0: 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
f500: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
f510: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
f520: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
f530: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
f540: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
f550: 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64  rNext(.  Fts5Ind
f560: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
f570: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
f580: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
f590: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
f5a0: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
f5b0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
f5c0: 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
f5d0: 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20   int *pbNewTerm 
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72   /* OUT: Set for
f600: 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a   new term */.){.
f610: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
f620: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
f630: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20  ;.  int iOff;.  
f640: 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
f650: 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20  ;.  int nKeep = 
f660: 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e  0;.  u8 *a;.  in
f670: 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t n;..  assert( 
f680: 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20  pbNewTerm==0 || 
f690: 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b  *pbNewTerm==0 );
f6a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
f6b0: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d  onfig->eDetail!=
f6c0: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
f6d0: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68   );..  /* Search
f6e0: 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
f6f0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
f700: 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  t within the cur
f710: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
f720: 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  a = pLeaf->p;.  
f730: 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  n = pLeaf->szLea
f740: 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c  f;..  ASSERT_SZL
f750: 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
f760: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
f770: 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49 74  LeafOffset + pIt
f780: 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66 28  er->nPos;..  if(
f790: 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 2f   iOff<n ){.    /
f7a0: 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79  * The next entry
f7b0: 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65   is on the curre
f7c0: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
f7d0: 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c  assert_nc( iOff<
f7e0: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
f7f0: 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69 66 28  clist );.    if(
f800: 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69 45   iOff>=pIter->iE
f810: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ndofDoclist ){. 
f820: 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20       bNewTerm = 
f830: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  1;.      if( iOf
f840: 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74  f!=fts5LeafFirst
f850: 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29  TermOff(pLeaf) )
f860: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
f870: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
f880: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
f890: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
f8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 36 34  }else{.      u64
f8b0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
f8c0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
f8d0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
f8e0: 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a  Off], &iDelta);.
f8f0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
f900: 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  wid += iDelta;. 
f910: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
f920: 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20  iDelta>0 );.    
f930: 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  }.    pIter->iLe
f940: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
f950: 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ..  }else if( pI
f960: 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a  ter->pSeg==0 ){.
f970: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c      const u8 *pL
f980: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ist = 0;.    con
f990: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
f9a0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73   0;.    int nLis
f9b0: 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  t = 0;.    asser
f9c0: 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  t( (pIter->flags
f9d0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
f9e0: 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e 65  ONETERM) || pbNe
f9f0: 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28  wTerm );.    if(
fa00: 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67   0==(pIter->flag
fa10: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
fa20: 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20  _ONETERM) ){.   
fa30: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
fa40: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48  shScanNext(p->pH
fa50: 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ash);.      sqli
fa60: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
fa70: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
fa80: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
fa90: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nList);.    }.  
faa0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
fab0: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
fac0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
fad0: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74  Leaf);.      pIt
fae0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
faf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fb00: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20  pIter->pLeaf->p 
fb10: 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20  = (u8*)pList;.  
fb20: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
fb30: 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  ->nn = nList;.  
fb40: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
fb50: 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74  ->szLeaf = nList
fb60: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
fb70: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e  EndofDoclist = n
fb80: 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20 73 71  List+1;.      sq
fb90: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
fba0: 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
fbb0: 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74  r->term, (int)st
fbc0: 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20  rlen(zTerm),.   
fbd0: 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72         (u8*)zTer
fbe0: 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  m);.      pIter-
fbf0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
fc00: 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69  ts5GetVarint(pLi
fc10: 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  st, (u64*)&pIter
fc20: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
fc30: 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b   *pbNewTerm = 1;
fc40: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
fc50: 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20      iOff = 0;.  
fc60: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
fc70: 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
fc80: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
fc90: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30    while( iOff==0
fca0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
fcb0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
fcc0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70   pIter);.      p
fcd0: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
fce0: 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eaf;.      if( p
fcf0: 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
fd00: 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a  .      ASSERT_SZ
fd10: 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a  LEAF_OK(pLeaf);.
fd20: 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20        if( (iOff 
fd30: 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
fd40: 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20  owidOff(pLeaf)) 
fd50: 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73  && iOff<pLeaf->s
fd60: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
fd70: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
fd80: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
fd90: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Leaf->p[iOff], (
fda0: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
fdb0: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49  wid);.        pI
fdc0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
fdd0: 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20   = iOff;..      
fde0: 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e    if( pLeaf->nn>
fdf0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
fe00: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
fe10: 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c  ->iPgidxOff = pL
fe20: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74  eaf->szLeaf + ft
fe30: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20  s5GetVarint32(. 
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c               &pL
fe50: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
fe60: 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45  Leaf], pIter->iE
fe70: 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20  ndofDoclist.    
fe80: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
fe90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
fea0: 20 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d   else if( pLeaf-
feb0: 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  >nn>pLeaf->szLea
fec0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  f ){.        pIt
fed0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
fee0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20  pLeaf->szLeaf + 
fef0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
ff00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c  .            &pL
ff10: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
ff20: 4c 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20 20 20  Leaf], iOff.    
ff30: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
ff40: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ff50: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
ff60: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
ff70: 6f 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b 0a 20  oclist = iOff;. 
ff80: 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20         bNewTerm 
ff90: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
ffa0: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f     assert_nc( iO
ffb0: 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  ff<pLeaf->szLeaf
ffc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   );.      if( iO
ffd0: 66 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  ff>pLeaf->szLeaf
ffe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
fff0: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
10000 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
10010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10020 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
10030 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
10040 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49  is now at EOF. I
10050 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72  f so, return ear
10060 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74  ly. */.  if( pIt
10070 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
10080 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b   if( bNewTerm ){
10090 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
100a0 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
100b0 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
100c0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
100d0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
100e0 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  >pLeaf);.       
100f0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
10100 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
10110 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
10120 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
10130 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Iter, nKeep);.  
10140 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
10150 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
10160 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
10170 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62   pbNewTerm ) *pb
10180 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
10190 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
101a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
101b0 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62 65 20  lowing could be 
101c0 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
101d0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
101e0 50 6f 73 28 29 2e 20 42 75 74 0a 20 20 20 20 20  Pos(). But.     
101f0 20 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 69   ** this block i
10200 73 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20 70  s particularly p
10210 65 72 66 6f 72 6d 61 6e 63 65 20 63 72 69 74 69  erformance criti
10220 63 61 6c 2c 20 73 6f 20 65 71 75 69 76 61 6c 65  cal, so equivale
10230 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  nt.      ** code
10240 20 69 73 20 69 6e 6c 69 6e 65 64 2e 20 0a 20 20   is inlined. .  
10250 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10260 4c 61 74 65 72 3a 20 53 77 69 74 63 68 65 64 20  Later: Switched 
10270 62 61 63 6b 20 74 6f 20 66 74 73 35 53 65 67 49  back to fts5SegI
10280 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 20 62 65  terLoadNPos() be
10290 63 61 75 73 65 20 69 74 20 73 75 70 70 6f 72 74  cause it support
102a0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69  s.      ** detai
102b0 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20 4e 6f 74  l=none mode. Not
102c0 20 69 64 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2f   ideal..      */
102d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a  .      int nSz;.
102e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
102f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
10300 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10310 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10320 65 74 3c 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  et<=pIter->pLeaf
10330 2d 3e 6e 6e 20 29 3b 0a 20 20 20 20 20 20 66 74  ->nn );.      ft
10340 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
10350 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  2(pIter->pLeaf->
10360 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  p, pIter->iLeafO
10370 66 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20  ffset, nSz);.   
10380 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d     pIter->bDel =
10390 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b   (nSz & 0x0001);
103a0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50  .      pIter->nP
103b0 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20  os = nSz>>1;.   
103c0 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49     assert_nc( pI
103d0 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a  ter->nPos>=0 );.
103e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65      }.  }.}..#de
103f0 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20  fine SWAPVAL(T, 
10400 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74  a, b) { T tmp; t
10410 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70  mp=a; a=b; b=tmp
10420 3b 20 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  ; }..#define fts
10430 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74  5IndexSkipVarint
10440 28 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20 20  (a, iOff) {     
10450 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 69         \.  int i
10460 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20  End = iOff+9;   
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 77             \.  w
10490 68 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d  hile( (a[iOff++]
104a0 20 26 20 30 78 38 30 29 20 26 26 20 69 4f 66 66   & 0x80) && iOff
104b0 3c 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20 5c  <iEnd );       \
104c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74  .}../*.** Iterat
104d0 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  or pIter current
104e0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
104f0 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20   first rowid in 
10500 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a  a doclist. This.
10510 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  ** function sets
10520 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75 70   the iterator up
10530 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74 65   so that iterate
10540 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  s in reverse ord
10550 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68  er through.** th
10560 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74  e doclist..*/.st
10570 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
10580 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74 73  gIterReverse(Fts
10590 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
105a0 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
105b0 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
105c0 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  *pDlidx = pIter-
105d0 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35 44  >pDlidx;.  Fts5D
105e0 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a  ata *pLast = 0;.
105f0 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d    int pgnoLast =
10600 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69 64   0;..  if( pDlid
10610 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  x ){.    int iSe
10620 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  gid = pIter->pSe
10630 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70  g->iSegid;.    p
10640 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44 6c  gnoLast = fts5Dl
10650 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
10660 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d  dx);.    pLast =
10670 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
10680 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
10690 57 49 44 28 69 53 65 67 69 64 2c 20 70 67 6e 6f  WID(iSegid, pgno
106a0 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Last));.  }else{
106b0 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
106c0 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
106d0 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eaf;         /* 
106e0 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
106f0 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72  a */..    /* Cur
10700 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49  rently, Fts5SegI
10710 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
10720 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
10730 72 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20  rst byte of.    
10740 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
10750 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65   content for the
10760 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20   current rowid. 
10770 42 61 63 6b 20 69 74 20 75 70 20 73 6f 20 74 68  Back it up so th
10780 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69  at it.    ** poi
10790 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
107a0 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
107b0 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
107c0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 6f  . */.    int iPo
107d0 73 6c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  slist;.    if( p
107e0 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
107f0 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno==pIter->iLea
10800 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 69  fPgno ){.      i
10810 50 6f 73 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Poslist = pIter-
10820 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
10830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10840 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 34 3b     iPoslist = 4;
10850 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49  .    }.    fts5I
10860 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28 70  ndexSkipVarint(p
10870 4c 65 61 66 2d 3e 70 2c 20 69 50 6f 73 6c 69 73  Leaf->p, iPoslis
10880 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  t);.    pIter->i
10890 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 50 6f  LeafOffset = iPo
108a0 73 6c 69 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  slist;..    /* I
108b0 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  f this condition
108c0 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 74 68   is true then th
108d0 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20  e largest rowid 
108e0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
108f0 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20      ** term may 
10900 6e 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e  not be stored on
10910 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
10920 65 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72  e. So search for
10930 77 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73  ward to.    ** s
10940 65 65 20 77 68 65 72 65 20 73 61 69 64 20 72 6f  ee where said ro
10950 77 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20  wid really is.  
10960 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  */.    if( pIter
10970 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3e  ->iEndofDoclist>
10980 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
10990 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f  {.      int pgno
109a0 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  ;.      Fts5Stru
109b0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
109c0 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
109d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
109e0 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  last rowid in th
109f0 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f  e doclist may no
10a00 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72 72  t be on the curr
10a10 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63 68  ent page. Search
10a20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61 72  .      ** forwar
10a30 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70 61  d to find the pa
10a40 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
10a50 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20 2a  e last rowid.  *
10a60 2f 0a 20 20 20 20 20 20 66 6f 72 28 70 67 6e 6f  /.      for(pgno
10a70 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
10a80 6f 2b 31 3b 20 21 70 2d 3e 72 63 20 26 26 20 70  o+1; !p->rc && p
10a90 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  gno<=pSeg->pgnoL
10aa0 61 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20  ast; pgno++){.  
10ab0 20 20 20 20 20 20 69 36 34 20 69 41 62 73 20 3d        i64 iAbs =
10ac0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
10ad0 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
10ae0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
10af0 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20   Fts5Data *pNew 
10b00 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
10b10 2c 20 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20  , iAbs);.       
10b20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
10b30 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
10b40 64 2c 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20  d, bTermless;.  
10b50 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
10b60 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
10b70 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20  widOff(pNew);.  
10b80 20 20 20 20 20 20 20 20 62 54 65 72 6d 6c 65 73          bTermles
10b90 73 20 3d 20 66 74 73 35 4c 65 61 66 49 73 54 65  s = fts5LeafIsTe
10ba0 72 6d 6c 65 73 73 28 70 4e 65 77 29 3b 0a 20 20  rmless(pNew);.  
10bb0 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
10bc0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
10bd0 20 20 53 57 41 50 56 41 4c 28 46 74 73 35 44 61    SWAPVAL(Fts5Da
10be0 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74  ta*, pNew, pLast
10bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
10c00 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a  gnoLast = pgno;.
10c10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10c20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
10c30 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
10c40 20 20 20 20 20 20 20 69 66 28 20 62 54 65 72 6d         if( bTerm
10c50 6c 65 73 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b  less==0 ) break;
10c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10c70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
10c80 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e  /* If pLast is N
10c90 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ULL at this poin
10ca0 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  t, then the last
10cb0 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   rowid for this 
10cc0 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65  doclist.  ** lie
10cd0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75  s on the page cu
10ce0 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65  rrently indicate
10cf0 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
10d00 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
10d10 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65  .  ** pIter->iLe
10d20 61 66 4f 66 66 73 65 74 20 69 73 20 61 6c 72 65  afOffset is alre
10d30 61 64 79 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ady set to point
10d40 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
10d50 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20  -list size.  ** 
10d60 66 69 65 6c 64 20 61 73 73 6f 63 69 61 74 65 64  field associated
10d70 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
10d80 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f  relevant rowid o
10d90 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  n the page..  **
10da0 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61  .  ** Or, if pLa
10db0 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  st is non-NULL, 
10dc0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 70  then it is the p
10dd0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
10de0 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20  s the last.  ** 
10df0 72 6f 77 69 64 2e 20 49 6e 20 74 68 69 73 20 63  rowid. In this c
10e00 61 73 65 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ase configure th
10e10 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68  e iterator so th
10e20 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
10e30 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 72  the.  ** first r
10e40 6f 77 69 64 20 6f 6e 20 74 68 69 73 20 70 61 67  owid on this pag
10e50 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  e..  */.  if( pL
10e60 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ast ){.    int i
10e70 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61 74  Off;.    fts5Dat
10e80 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
10e90 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65  pLeaf);.    pIte
10ea0 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73 74  r->pLeaf = pLast
10eb0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
10ec0 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73  afPgno = pgnoLas
10ed0 74 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74  t;.    iOff = ft
10ee0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
10ef0 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20  Off(pLast);.    
10f00 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
10f10 61 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b  arint(&pLast->p[
10f20 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
10f30 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
10f40 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
10f50 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20  fset = iOff;..  
10f60 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49 73    if( fts5LeafIs
10f70 54 65 72 6d 6c 65 73 73 28 70 4c 61 73 74 29 20  Termless(pLast) 
10f80 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
10f90 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
10fa0 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20  pLast->nn+1;.   
10fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
10fc0 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
10fd0 73 74 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  st = fts5LeafFir
10fe0 73 74 54 65 72 6d 4f 66 66 28 70 4c 61 73 74 29  stTermOff(pLast)
10ff0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20  ;.    }..  }..  
11000 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
11010 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
11020 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ter);.}../*.** I
11030 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
11040 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
11050 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
11060 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a  d of a doclist..
11070 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 64 6f  ** There is a do
11080 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f  clist-index asso
11090 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
110a0 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68  final term on th
110b0 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61  e current .** pa
110c0 67 65 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ge. If the curre
110d0 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c  nt term is the l
110e0 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  ast term on the 
110f0 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a  page, load the .
11100 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
11110 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69   from disk and i
11120 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65  nitialize an ite
11130 72 61 74 6f 72 20 61 74 20 28 70 49 74 65 72 2d  rator at (pIter-
11140 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61  >pDlidx)..*/.sta
11150 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
11160 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74  IterLoadDlidx(Ft
11170 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
11180 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
11190 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70 49  .  int iSeg = pI
111a0 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
111b0 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20  d;.  int bRev = 
111c0 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
111d0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
111e0 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61 74  ERSE);.  Fts5Dat
111f0 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
11200 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72  ->pLeaf; /* Curr
11210 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
11220 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
11230 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
11240 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
11250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
11260 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b  er->pDlidx==0 );
11270 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
11280 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
11290 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73  ist ends on this
112a0 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65   page. If it doe
112b0 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65  s, return.  ** e
112c0 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61  arly without loa
112d0 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74  ding the doclist
112e0 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62 65  -index (as it be
112f0 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65  longs to a diffe
11300 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  rent.  ** term. 
11310 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
11320 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70  iTermLeafPgno==p
11330 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
11340 0a 20 20 20 26 26 20 70 49 74 65 72 2d 3e 69 45  .   && pIter->iE
11350 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 4c 65 61  ndofDoclist<pLea
11360 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a  f->szLeaf .  ){.
11370 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11380 0a 20 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  .  pIter->pDlidx
11390 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
113a0 49 6e 69 74 28 70 2c 20 62 52 65 76 2c 20 69 53  Init(p, bRev, iS
113b0 65 67 2c 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  eg, pIter->iTerm
113c0 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  LeafPgno);.}../*
113d0 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
113e0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
113f0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
11400 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ument currently 
11410 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76  contains.** no v
11420 61 6c 69 64 20 76 61 6c 75 65 73 20 65 78 63 65  alid values exce
11430 70 74 20 66 6f 72 20 74 68 65 20 46 74 73 35 53  pt for the Fts5S
11440 65 67 49 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d  egIter.pLeaf mem
11450 62 65 72 20 76 61 72 69 61 62 6c 65 2e 20 54 68  ber variable. Th
11460 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  is.** function s
11470 65 61 72 63 68 65 73 20 74 68 65 20 6c 65 61 66  earches the leaf
11480 20 70 61 67 65 20 66 6f 72 20 61 20 74 65 72 6d   page for a term
11490 20 6d 61 74 63 68 69 6e 67 20 28 70 54 65 72 6d   matching (pTerm
114a0 2f 6e 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49  /nTerm)..**.** I
114b0 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
114c0 74 65 72 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e  term is found on
114d0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
114e0 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
114f0 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  left.** pointing
11500 20 74 6f 20 69 74 2e 20 49 66 20 61 72 67 75 6d   to it. If argum
11510 65 6e 74 20 62 47 65 20 69 73 20 7a 65 72 6f 20  ent bGe is zero 
11520 61 6e 64 20 74 68 65 20 74 65 72 6d 20 69 73 20  and the term is 
11530 6e 6f 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68  not found,.** th
11540 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
11550 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 45  ft pointing at E
11560 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65  OF..**.** If bGe
11570 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
11580 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
11590 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  erm is not found
115a0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74  , then the.** it
115b0 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
115c0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 73  ointing to the s
115d0 6d 61 6c 6c 65 73 74 20 74 65 72 6d 20 69 6e 20  mallest term in 
115e0 74 68 65 20 73 65 67 6d 65 6e 74 20 74 68 61 74  the segment that
115f0 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68  .** is larger th
11600 61 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  an the specified
11610 20 74 65 72 6d 2c 20 65 76 65 6e 20 69 66 20 74   term, even if t
11620 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
11630 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
11640 74 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  t page..*/.stati
11650 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66 53  c void fts5LeafS
11660 65 65 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  eek(.  Fts5Index
11670 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11680 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20         /* Leave 
11690 61 6e 79 20 65 72 72 6f 72 20 63 6f 64 65 20 68  any error code h
116a0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65  ere */.  int bGe
116b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
116c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
116d0 20 66 6f 72 20 61 20 3e 3d 20 73 65 61 72 63 68   for a >= search
116e0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
116f0 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
11700 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
11710 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63  r to seek */.  c
11720 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
11730 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 2f  int nTerm      /
11740 2a 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68  * Term to search
11750 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   for */.){.  int
11760 20 69 4f 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75   iOff;.  const u
11770 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
11780 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 73 7a  eaf->p;.  int sz
11790 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
117a0 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69  eaf->szLeaf;.  i
117b0 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
117c0 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 75 33 32 20  eaf->nn;..  u32 
117d0 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 75 33  nMatch = 0;.  u3
117e0 32 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75  2 nKeep = 0;.  u
117f0 33 32 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 75  32 nNew = 0;.  u
11800 33 32 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69  32 iTermOff;.  i
11810 6e 74 20 69 50 67 69 64 78 3b 20 20 20 20 20 20  nt iPgidx;      
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11830 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
11840 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20 69   in pgidx */.  i
11850 6e 74 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20  nt bEndOfPage = 
11860 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
11870 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
11880 3b 0a 0a 20 20 69 50 67 69 64 78 20 3d 20 73 7a  ;..  iPgidx = sz
11890 4c 65 61 66 3b 0a 20 20 69 50 67 69 64 78 20 2b  Leaf;.  iPgidx +
118a0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
118b0 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 69 54  2(&a[iPgidx], iT
118c0 65 72 6d 4f 66 66 29 3b 0a 20 20 69 4f 66 66 20  ermOff);.  iOff 
118d0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 66  = iTermOff;.  if
118e0 28 20 69 4f 66 66 3e 6e 20 29 7b 0a 20 20 20 20  ( iOff>n ){.    
118f0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
11900 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  RUPT;.    return
11910 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
11920 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  1 ){..    /* Fig
11930 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
11940 20 6e 65 77 20 62 79 74 65 73 20 61 72 65 20 69   new bytes are i
11950 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  n this term */. 
11960 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
11970 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20  rint32(a, iOff, 
11980 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e  nNew);.    if( n
11990 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20  Keep<nMatch ){. 
119a0 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68       goto search
119b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
119c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65      assert( nKee
119d0 70 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20  p>=nMatch );.   
119e0 20 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74   if( nKeep==nMat
119f0 63 68 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  ch ){.      u32 
11a00 6e 43 6d 70 3b 0a 20 20 20 20 20 20 75 33 32 20  nCmp;.      u32 
11a10 69 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20  i;.      nCmp = 
11a20 28 75 33 32 29 4d 49 4e 28 6e 4e 65 77 2c 20 6e  (u32)MIN(nNew, n
11a30 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20  Term-nMatch);.  
11a40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11a50 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cmp; i++){.     
11a60 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d     if( a[iOff+i]
11a70 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69  !=pTerm[nMatch+i
11a80 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
11a90 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68 20   }.      nMatch 
11aa0 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28  += i;..      if(
11ab0 20 28 75 33 32 29 6e 54 65 72 6d 3d 3d 6e 4d 61   (u32)nTerm==nMa
11ac0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69  tch ){.        i
11ad0 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20  f( i==nNew ){.  
11ae0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61          goto sea
11af0 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20 20 20  rch_success;.   
11b00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11b10 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
11b20 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
11b30 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
11b40 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b  if( i<nNew && a[
11b50 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d  iOff+i]>pTerm[nM
11b60 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20 20 20  atch] ){.       
11b70 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
11b80 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
11b90 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50 67 69   }..    if( iPgi
11ba0 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62  dx>=n ){.      b
11bb0 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20  EndOfPage = 1;. 
11bc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11bd0 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d  }..    iPgidx +=
11be0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
11bf0 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65  (&a[iPgidx], nKe
11c00 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66  ep);.    iTermOf
11c10 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20  f += nKeep;.    
11c20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
11c30 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  ..    if( iOff>=
11c40 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  n ){.      p->rc
11c50 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
11c60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
11c70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61     }..    /* Rea
11c80 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65 6c  d the nKeep fiel
11c90 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65  d of the next te
11ca0 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 46  rm. */.    fts5F
11cb0 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61  astGetVarint32(a
11cc0 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a  , iOff, nKeep);.
11cd0 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69    }.. search_fai
11ce0 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d  led:.  if( bGe==
11cf0 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74  0 ){.    fts5Dat
11d00 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
11d10 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65  pLeaf);.    pIte
11d20 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
11d30 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
11d40 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67 65  e if( bEndOfPage
11d50 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
11d60 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
11d70 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
11d80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
11d90 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  r->pLeaf==0 ) re
11da0 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20  turn;.      a = 
11db0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
11dc0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 4c  .      if( fts5L
11dd0 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 49  eafIsTermless(pI
11de0 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29  ter->pLeaf)==0 )
11df0 7b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64 78  {.        iPgidx
11e00 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
11e10 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 20  >szLeaf;.       
11e20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
11e30 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
11e40 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67 69  r->pLeaf->p[iPgi
11e50 64 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20  dx], iOff);.    
11e60 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c      if( iOff<4 |
11e70 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  | iOff>=pIter->p
11e80 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
11e90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
11ea0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
11eb0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11ec0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11ed0 0a 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65 70  .          nKeep
11ee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
11ef0 69 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b  iTermOff = iOff;
11f00 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70  .          n = p
11f10 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b  Iter->pLeaf->nn;
11f20 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
11f30 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
11f40 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65  32(&a[iOff], nNe
11f50 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  w);.          br
11f60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
11f80 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65  e( 1 );.  }.. se
11f90 61 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 20 20  arch_success:.  
11fa0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
11fb0 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77  et = iOff + nNew
11fc0 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  ;.  if( pIter->i
11fd0 4c 65 61 66 4f 66 66 73 65 74 3e 6e 20 7c 7c 20  LeafOffset>n || 
11fe0 6e 4e 65 77 3c 31 20 29 7b 0a 20 20 20 20 70 2d  nNew<1 ){.    p-
11ff0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
12000 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
12010 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 54 65    }.  pIter->iTe
12020 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  rmLeafOffset = p
12030 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
12040 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  t;.  pIter->iTer
12050 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  mLeafPgno = pIte
12060 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20  r->iLeafPgno;.. 
12070 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
12080 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
12090 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72  erm, nKeep, pTer
120a0 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  m);.  fts5Buffer
120b0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
120c0 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
120d0 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
120e0 3b 0a 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e  ;..  if( iPgidx>
120f0 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  =n ){.    pIter-
12100 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
12110 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
12120 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n+1;.  }else{.  
12130 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20    int nExtra;.  
12140 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
12150 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
12160 50 67 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b  Pgidx], nExtra);
12170 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
12180 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72  ofDoclist = iTer
12190 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20  mOff + nExtra;. 
121a0 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69   }.  pIter->iPgi
121b0 64 78 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a  dxOff = iPgidx;.
121c0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
121d0 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72  adRowid(p, pIter
121e0 29 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  );.  fts5SegIter
121f0 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
12200 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71  r);.}..static sq
12210 6c 69 74 65 33 5f 73 74 6d 74 20 2a 66 74 73 35  lite3_stmt *fts5
12220 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 46 74  IdxSelectStmt(Ft
12230 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
12240 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  f( p->pIdxSelect
12250 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
12260 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
12270 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
12280 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
12290 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
122a0 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33  xSelect, sqlite3
122b0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
122c0 20 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f      "SELECT pgno
122d0 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69   FROM '%q'.'%q_i
122e0 64 78 27 20 57 48 45 52 45 20 22 0a 20 20 20 20  dx' WHERE ".    
122f0 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41        "segid=? A
12300 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52  ND term<=? ORDER
12310 20 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49   BY term DESC LI
12320 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20  MIT 1",.        
12330 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
12340 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
12350 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74     ));.  }.  ret
12360 75 72 6e 20 70 2d 3e 70 49 64 78 53 65 6c 65 63  urn p->pIdxSelec
12370 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  t;.}../*.** Init
12380 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
12390 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
123a0 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
123b0 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d  Term within segm
123c0 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20  ent.** pSeg. If 
123d0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
123e0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64   term in the ind
123f0 65 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  ex, the iterator
12400 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a   is set to EOF..
12410 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
12420 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
12430 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
12440 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
12450 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
12460 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
12470 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
12480 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
12490 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
124a0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
124b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
124c0 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74  5SegIterSeekInit
124d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
124e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
124f0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
12500 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  end */.  const u
12510 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
12520 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
12530 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
12540 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
12570 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20  INDEX_XXX flags 
12580 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
12590 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
125a0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
125b0 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
125c0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
125d0 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
125e0 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
125f0 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
12600 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20    int iPg = 1;. 
12610 20 69 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67   int bGe = (flag
12620 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
12630 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74  ERY_SCAN);.  int
12640 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20   bDlidx = 0;    
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12660 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
12670 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
12680 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
12690 6d 74 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d  mt *pIdxSelect =
126a0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62   0;..  assert( b
126b0 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  Ge==0 || (flags 
126c0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
126d0 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20  Y_DESC)==0 );.  
126e0 61 73 73 65 72 74 28 20 70 54 65 72 6d 20 26 26  assert( pTerm &&
126f0 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73   nTerm );.  mems
12700 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
12710 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
12720 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
12730 65 67 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  eg;..  /* This b
12740 6c 6f 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20  lock sets stack 
12750 76 61 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20  variable iPg to 
12760 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75  the leaf page nu
12770 6d 62 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20  mber that may.  
12780 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20  ** contain term 
12790 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69  (pTerm/nTerm), i
127a0 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 20  f it is present 
127b0 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20  in the segment. 
127c0 2a 2f 0a 20 20 70 49 64 78 53 65 6c 65 63 74 20  */.  pIdxSelect 
127d0 3d 20 66 74 73 35 49 64 78 53 65 6c 65 63 74 53  = fts5IdxSelectS
127e0 74 6d 74 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  tmt(p);.  if( p-
127f0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
12800 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
12810 28 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20  (pIdxSelect, 1, 
12820 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
12830 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
12840 6f 62 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32  ob(pIdxSelect, 2
12850 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , pTerm, nTerm, 
12860 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
12870 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
12880 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
12890 49 64 78 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  IdxSelect) ){.  
128a0 20 20 69 36 34 20 76 61 6c 20 3d 20 73 71 6c 69    i64 val = sqli
128b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
128c0 49 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  IdxSelect, 0);. 
128d0 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76     iPg = (int)(v
128e0 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69  al>>1);.    bDli
128f0 64 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30  dx = (val & 0x00
12900 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  01);.  }.  p->rc
12910 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
12920 28 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20  (pIdxSelect);.  
12930 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
12940 6c 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 29  l(pIdxSelect, 2)
12950 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65  ;..  if( iPg<pSe
12960 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a  g->pgnoFirst ){.
12970 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e      iPg = pSeg->
12980 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62  pgnoFirst;.    b
12990 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Dlidx = 0;.  }..
129a0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
129b0 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20  no = iPg - 1;.  
129c0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
129d0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  age(p, pIter);..
129e0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
129f0 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65  af ){.    fts5Le
12a00 61 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70  afSeek(p, bGe, p
12a10 49 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65  Iter, pTerm, nTe
12a20 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rm);.  }..  if( 
12a30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12a40 20 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20   && bGe==0 ){.  
12a50 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
12a60 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
12a70 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
12a80 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
12a90 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
12aa0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
12ab0 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
12ac0 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
12ad0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
12ae0 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a  EVERSE;.      }.
12af0 20 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78        if( bDlidx
12b00 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
12b10 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78  SegIterLoadDlidx
12b20 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12b30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c    }.      if( fl
12b40 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
12b50 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
12b60 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12b70 72 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65  rReverse(p, pIte
12b80 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
12b90 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  }.  }..  fts5Seg
12ba0 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70  IterSetNext(p, p
12bb0 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 69 74  Iter);..  /* Eit
12bc0 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  her:.  **.  **  
12bd0 20 31 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73   1) an error has
12be0 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20   occurred, or.  
12bf0 2a 2a 20 20 20 32 29 20 74 68 65 20 69 74 65 72  **   2) the iter
12c00 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45  ator points to E
12c10 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29  OF, or.  **   3)
12c20 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12c30 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
12c40 20 77 69 74 68 20 74 65 72 6d 20 28 70 54 65 72   with term (pTer
12c50 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a  m/nTerm), or.  *
12c60 2a 20 20 20 34 29 20 74 68 65 20 46 54 53 35 49  *   4) the FTS5I
12c70 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
12c80 66 6c 61 67 20 77 61 73 20 73 65 74 20 61 6e 64  flag was set and
12c90 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12ca0 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74  ints.  **      t
12cb0 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  o an entry with 
12cc0 61 20 74 65 72 6d 20 67 72 65 61 74 65 72 20 74  a term greater t
12cd0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
12ce0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20  (pTerm/nTerm).. 
12cf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 5f 6e 63 28   */.  assert_nc(
12d00 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
12d10 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d30 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a          /* 1 */.
12d40 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65     || pIter->pLe
12d50 61 66 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  af==0           
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c      /* 2 */.   |
12d90 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  | fts5BufferComp
12da0 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e  areBlob(&pIter->
12db0 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  term, pTerm, nTe
12dc0 72 6d 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  rm)==0          
12dd0 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62  /* 3 */.   || (b
12de0 47 65 20 26 26 20 66 74 73 35 42 75 66 66 65 72  Ge && fts5Buffer
12df0 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74  CompareBlob(&pIt
12e00 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c  er->term, pTerm,
12e10 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34   nTerm)>0)  /* 4
12e20 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   */.  );.}../*.*
12e30 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
12e40 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
12e50 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70   point to term p
12e60 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69  Term/nTerm withi
12e70 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  n the.** in-memo
12e80 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49  ry hash table. I
12e90 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
12ea0 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68  ch term in the h
12eb0 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a  ash-table, the .
12ec0 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  ** iterator is s
12ed0 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
12ee0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12ef0 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
12f00 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
12f10 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12f20 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
12f30 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
12f40 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
12f50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12f60 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
12f70 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12f80 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
12f90 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46  terHashInit(.  F
12fa0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12fc0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
12fd0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
12fe0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
12ff0 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
13000 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
13010 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
13020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
13030 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
13040 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
13050 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
13060 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
13070 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
13080 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ulate */.){.  in
13090 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63  t nList = 0;.  c
130a0 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a  onst u8 *z = 0;.
130b0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 46    int n = 0;.  F
130c0 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
130d0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
130e0 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73  ->pHash );.  ass
130f0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
13100 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
13110 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61  pTerm==0 || (fla
13120 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
13130 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20  UERY_SCAN) ){.  
13140 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73    const u8 *pLis
13150 74 20 3d 20 30 3b 0a 0a 20 20 20 20 70 2d 3e 72  t = 0;..    p->r
13160 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
13170 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70  ashScanInit(p->p
13180 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
13190 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  r*)pTerm, nTerm)
131a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
131b0 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
131c0 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20  ->pHash, (const 
131d0 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73  char**)&z, &pLis
131e0 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
131f0 6e 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73 74  n = (z ? (int)st
13200 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72  rlen((const char
13210 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 20 20 69  *)z) : 0);.    i
13220 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
13230 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49 64    pLeaf = fts5Id
13240 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
13250 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20 20  f(Fts5Data));.  
13260 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
13270 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 2d 3e  .        pLeaf->
13280 70 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  p = pList;.     
13290 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
132a0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
132b0 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75 65  lite3Fts5HashQue
132c0 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 73 69 7a  ry(p->pHash, siz
132d0 65 6f 66 28 46 74 73 35 44 61 74 61 29 2c 20 0a  eof(Fts5Data), .
132e0 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
132f0 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72  har*)pTerm, nTer
13300 6d 2c 20 28 76 6f 69 64 2a 2a 29 26 70 4c 65 61  m, (void**)&pLea
13310 66 2c 20 26 6e 4c 69 73 74 0a 20 20 20 20 29 3b  f, &nList.    );
13320 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29  .    if( pLeaf )
13330 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 2d 3e 70  {.      pLeaf->p
13340 20 3d 20 28 75 38 2a 29 26 70 4c 65 61 66 5b 31   = (u8*)&pLeaf[1
13350 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d  ];.    }.    z =
13360 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20   pTerm;.    n = 
13370 6e 54 65 72 6d 3b 0a 20 20 20 20 70 49 74 65 72  nTerm;.    pIter
13380 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
13390 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b  SEGITER_ONETERM;
133a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 65 61  .  }..  if( pLea
133b0 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  f ){.    sqlite3
133c0 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  Fts5BufferSet(&p
133d0 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
133e0 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70  rm, n, z);.    p
133f0 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66  Leaf->nn = pLeaf
13400 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74  ->szLeaf = nList
13410 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  ;.    pIter->pLe
13420 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20  af = pLeaf;.    
13430 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
13440 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
13450 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36  nt(pLeaf->p, (u6
13460 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
13470 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  d);.    pIter->i
13480 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
13490 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 20 20 69  Leaf->nn;..    i
134a0 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
134b0 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
134c0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
134d0 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
134e0 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
134f0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
13500 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
13510 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
13520 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
13530 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
13540 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
13550 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
13560 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49  terSetNext(p, pI
13570 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a  ter);.}../*.** Z
13580 65 72 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72  ero the iterator
13590 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
135a0 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
135b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
135c0 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 46 74  5SegIterClear(Ft
135d0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
135e0 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  ){.  fts5BufferF
135f0 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  ree(&pIter->term
13600 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  );.  fts5DataRel
13610 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
13620 66 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65  f);.  fts5DataRe
13630 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65  lease(pIter->pNe
13640 78 74 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44  xtLeaf);.  fts5D
13650 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74  lidxIterFree(pIt
13660 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73  er->pDlidx);.  s
13670 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
13680 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29  r->aRowidOffset)
13690 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  ;.  memset(pIter
136a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
136b0 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69  SegIter));.}..#i
136c0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
136d0 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  G../*.** This fu
136e0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
136f0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 62 69  s part of the bi
13700 67 20 61 73 73 65 72 74 28 29 20 70 72 6f 63 65  g assert() proce
13710 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  dure implemented
13720 20 62 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72   by.** fts5Asser
13730 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
13740 29 2e 20 49 74 20 65 6e 73 75 72 65 73 20 74 68  ). It ensures th
13750 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 63 75  at the result cu
13760 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a  rrently stored.*
13770 2a 20 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68  * in *pRes is th
13780 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74  e correct result
13790 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68   of comparing th
137a0 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
137b0 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77  ons of the.** tw
137c0 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a  o iterators..*/.
137d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
137e0 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
137f0 52 65 73 75 6c 74 28 0a 20 20 46 74 73 35 49 74  Result(.  Fts5It
13800 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74  er *pIter, .  Ft
13810 73 35 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20  s5SegIter *p1,. 
13820 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
13830 2c 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  ,.  Fts5CResult 
13840 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69  *pRes.){.  int i
13850 31 20 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e  1 = p1 - pIter->
13860 61 53 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d  aSeg;.  int i2 =
13870 20 70 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65   p2 - pIter->aSe
13880 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c  g;..  if( p1->pL
13890 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66  eaf || p2->pLeaf
138a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e   ){.    if( p1->
138b0 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
138c0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
138d0 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20  iFirst==i2 );.  
138e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e    }else if( p2->
138f0 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
13900 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13910 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20  iFirst==i1 );.  
13920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
13930 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31  nt nMin = MIN(p1
13940 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65  ->term.n, p2->te
13950 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74  rm.n);.      int
13960 20 72 65 73 20 3d 20 66 74 73 35 4d 65 6d 63 6d   res = fts5Memcm
13970 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32  p(p1->term.p, p2
13980 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b  ->term.p, nMin);
13990 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
139a0 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65  0 ) res = p1->te
139b0 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e  rm.n - p2->term.
139c0 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65  n;..      if( re
139d0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
139e0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54  assert( pRes->bT
139f0 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20  ermEq==1 );.    
13a00 20 20 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e      assert( p1->
13a10 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77  iRowid!=p2->iRow
13a20 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  id );.        re
13a30 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
13a40 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
13a50 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
13a60 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  1 : 1;.      }el
13a70 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
13a80 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  rt( pRes->bTermE
13a90 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  q==0 );.      }.
13aa0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
13ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13ac0 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74  rt( pRes->iFirst
13ad0 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65  ==i1 );.      }e
13ae0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
13af0 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13b00 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d  t==i2 );.      }
13b10 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
13b20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13b30 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c  n is a no-op unl
13b40 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47  ess SQLITE_DEBUG
13b50 20 69 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e   is defined when
13b60 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20   this module.** 
13b70 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20  is compiled. In 
13b80 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20  that case, this 
13b90 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65  function is esse
13ba0 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72  ntially an asser
13bb0 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
13bc0 74 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  t used to verify
13bd0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
13be0 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d  ts of the pIter-
13bf0 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a  >aFirst[] array.
13c00 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a  ** are correct..
13c10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
13c20 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
13c30 65 72 53 65 74 75 70 28 46 74 73 35 49 6e 64 65  erSetup(Fts5Inde
13c40 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a  x *p, Fts5Iter *
13c50 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
13c60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13c70 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
13c80 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74  r *pFirst = &pIt
13c90 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13ca0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
13cb0 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ];.    int i;.
13cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 46  .    assert( (pF
13cd0 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d  irst->pLeaf==0)=
13ce0 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f  =pIter->base.bEo
13cf0 66 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  f );..    /* Che
13d00 63 6b 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69  ck that pIter->i
13d10 53 77 69 74 63 68 52 6f 77 69 64 20 69 73 20 73  SwitchRowid is s
13d20 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
13d30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13d40 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b  pIter->nSeg; i++
13d50 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
13d60 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65  Iter *p1 = &pIte
13d70 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20  r->aSeg[i];.    
13d80 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46    assert( p1==pF
13d90 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  irst .          
13da0 20 7c 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30   || p1->pLeaf==0
13db0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13dc0 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
13dd0 65 28 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c  e(&pFirst->term,
13de0 20 26 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20   &p1->term) .   
13df0 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69          || p1->i
13e00 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53  Rowid==pIter->iS
13e10 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20  witchRowid.     
13e20 20 20 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52        || (p1->iR
13e30 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69  owid<pIter->iSwi
13e40 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  tchRowid)==pIter
13e50 2d 3e 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a  ->bRev.      );.
13e60 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
13e70 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
13e80 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  g; i+=2){.      
13e90 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
13ea0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13eb0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
13ec0 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
13ed0 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20  r->aSeg[i+1];.  
13ee0 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
13ef0 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
13f00 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e  aFirst[(pIter->n
13f10 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20  Seg + i) / 2];. 
13f20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43       fts5AssertC
13f30 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
13f40 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70  pIter, p1, p2, p
13f50 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Res);.    }..   
13f60 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74   for(i=1; i<(pIt
13f70 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69  er->nSeg / 2); i
13f80 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  +=2){.      Fts5
13f90 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70  SegIter *p1 = &p
13fa0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
13fb0 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69  r->aFirst[i*2].i
13fc0 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
13fd0 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d  ts5SegIter *p2 =
13fe0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
13ff0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32  Iter->aFirst[i*2
14000 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  +1].iFirst ];.  
14010 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
14020 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
14030 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20  aFirst[i];.     
14040 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
14050 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65  risonResult(pIte
14060 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29  r, p1, p2, pRes)
14070 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
14080 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
14090 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
140a0 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69  Setup(x,y).#endi
140b0 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20  f../*.** Do the 
140c0 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73  comparison neces
140d0 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65  sary to populate
140e0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
140f0 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Out]..**.** If t
14100 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
14110 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
14120 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e  hen it is the in
14130 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a  dex of an entry.
14140 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d  ** in the pIter-
14150 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68  >aSeg[] array th
14160 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74  at is (a) not at
14170 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f   EOF, and (b) po
14180 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b  inting.** to a k
14190 65 79 20 74 68 61 74 20 69 73 20 61 20 64 75 70  ey that is a dup
141a0 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
141b0 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72 69  r, higher priori
141c0 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d  ty, .** segment-
141d0 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  iterator in the 
141e0 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72  pSeg->aSeg[] arr
141f0 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
14200 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  t fts5MultiIterD
14210 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 49 74 65  oCompare(Fts5Ite
14220 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f  r *pIter, int iO
14230 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20  ut){.  int i1;  
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14250 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
14260 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73  of left-hand Fts
14270 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e  5SegIter */.  in
14280 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20  t i2;           
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
142a0 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
142b0 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
142c0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a   */.  int iRes;.
142d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
142e0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
142f0 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46    /* Left-hand F
14300 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
14310 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b  Fts5SegIter *p2;
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74  /* Right-hand Ft
14340 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46  s5SegIter */.  F
14350 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
14360 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
14370 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65  t[iOut];..  asse
14380 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e  rt( iOut<pIter->
14390 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29  nSeg && iOut>0 )
143a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
143b0 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49  r->bRev==0 || pI
143c0 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a  ter->bRev==1 );.
143d0 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49  .  if( iOut>=(pI
143e0 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a  ter->nSeg/2) ){.
143f0 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d      i1 = (iOut -
14400 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20   pIter->nSeg/2) 
14410 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31  * 2;.    i2 = i1
14420 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   + 1;.  }else{. 
14430 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61     i1 = pIter->a
14440 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46  First[iOut*2].iF
14450 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70  irst;.    i2 = p
14460 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
14470 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20  t*2+1].iFirst;. 
14480 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72   }.  p1 = &pIter
14490 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32  ->aSeg[i1];.  p2
144a0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
144b0 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54  i2];..  pRes->bT
144c0 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28  ermEq = 0;.  if(
144d0 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p1->pLeaf==0 ){
144e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
144f0 20 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f   p1 is at EOF */
14500 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a  .    iRes = i2;.
14510 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e    }else if( p2->
14520 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20  pLeaf==0 ){     
14530 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74 20 45  /* If p2 is at E
14540 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d  OF */.    iRes =
14550 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   i1;.  }else{.  
14560 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35    int res = fts5
14570 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70  BufferCompare(&p
14580 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65  1->term, &p2->te
14590 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  rm);.    if( res
145a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
145b0 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20  ert( i2>i1 );.  
145c0 20 20 20 20 61 73 73 65 72 74 28 20 69 32 21 3d      assert( i2!=
145d0 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d  0 );.      pRes-
145e0 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20  >bTermEq = 1;.  
145f0 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77      if( p1->iRow
14600 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id==p2->iRowid )
14610 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44  {.        p1->bD
14620 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20  el = p2->bDel;. 
14630 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 32         return i2
14640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14650 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
14660 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
14670 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
14680 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a   -1 : +1;.    }.
14690 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21      assert( res!
146a0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  =0 );.    if( re
146b0 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65  s<0 ){.      iRe
146c0 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73  s = i1;.    }els
146d0 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  e{.      iRes = 
146e0 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i2;.    }.  }.. 
146f0 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20   pRes->iFirst = 
14700 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74  (u16)iRes;.  ret
14710 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
14720 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65  Move the seg-ite
14730 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
14740 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
14750 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid on page i
14760 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20  LeafPgno..** It 
14770 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c  is an error if l
14780 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f  eaf iLeafPgno do
14790 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
147a0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69  contains no rowi
147b0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
147c0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47 6f  id fts5SegIterGo
147d0 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  toPage(.  Fts5In
147e0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
147f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
14800 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
14810 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
14820 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
14830 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
14840 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
14850 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a    int iLeafPgno.
14860 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ){.  assert( iLe
14870 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c  afPgno>pIter->iL
14880 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66  eafPgno );..  if
14890 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
148a0 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  r->pSeg->pgnoLas
148b0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  t ){.    p->rc =
148c0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
148d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
148e0 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
148f0 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
14900 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
14910 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  eaf = 0;.    pIt
14920 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
14930 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20  iLeafPgno-1;.   
14940 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
14950 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
14960 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
14970 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
14980 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14990 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ==iLeafPgno );..
149a0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
149b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
149c0 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
149d0 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
149e0 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20  >pLeaf->p;.     
149f0 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
14a00 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a  pLeaf->szLeaf;..
14a10 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
14a20 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
14a30 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
14a40 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
14a50 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b  <4 || iOff>=n ){
14a60 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
14a70 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
14a80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14a90 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
14aa0 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
14ab0 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
14ac0 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
14ad0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
14ae0 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
14af0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
14b00 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
14b10 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
14b20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14b30 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
14b40 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
14b50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14b60 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61  nt until it is a
14b70 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f  t or .** past ro
14b80 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72  wid iFrom. Regar
14b90 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
14ba0 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65  ue of iFrom, the
14bb0 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20   iterator is.** 
14bc0 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20  always advanced 
14bd0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a  at least once..*
14be0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
14bf0 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
14c00 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
14c10 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14c20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
14c30 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
14c40 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
14c50 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
14c60 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
14c70 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34  advance */.  i64
14c80 20 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20   iMatch         
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ca0 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
14cb0 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66   at least this f
14cc0 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  ar */.){.  int b
14cd0 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
14ce0 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
14cf0 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
14d00 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
14d10 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
14d20 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61  lidx;.  int iLea
14d30 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
14d40 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
14d50 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73  bMove = 1;..  as
14d60 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
14d70 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
14d80 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
14d90 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
14da0 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74  lidx );.  assert
14db0 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
14dc0 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30  ;..  if( bRev==0
14dd0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   ){.    while( !
14de0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
14df0 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
14e00 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49  Match>fts5DlidxI
14e10 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
14e20 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50   ){.      iLeafP
14e30 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
14e40 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
14e50 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
14e60 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
14e70 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dx);.    }.    a
14e80 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50  ssert_nc( iLeafP
14e90 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno>=pIter->iLea
14ea0 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29  fPgno || p->rc )
14eb0 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ;.    if( iLeafP
14ec0 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
14ed0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74  Pgno ){.      ft
14ee0 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
14ef0 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61  e(p, pIter, iLea
14f00 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d  fPgno);.      bM
14f10 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
14f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
14f30 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  rt( pIter->pNext
14f40 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Leaf==0 );.    a
14f50 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49  ssert( iMatch<pI
14f60 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20  ter->iRowid );. 
14f70 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
14f80 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
14f90 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
14fa0 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  <fts5DlidxIterRo
14fb0 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
14fc0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
14fd0 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78  erPrev(p, pDlidx
14fe0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65  );.    }.    iLe
14ff0 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  afPgno = fts5Dli
15000 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
15010 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  x);..    assert(
15020 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
15030 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20  f(p, pDlidx) || 
15040 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72  iLeafPgno<=pIter
15050 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ->iLeafPgno );..
15060 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
15070 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o<pIter->iLeafPg
15080 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  no ){.      pIte
15090 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
150a0 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20  LeafPgno+1;.    
150b0 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
150c0 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
150d0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Iter);.      bMo
150e0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
150f0 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  }..  do{.    if(
15100 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63 3d   bMove && p->rc=
15110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49 74  =SQLITE_OK ) pIt
15120 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49 74  er->xNext(p, pIt
15130 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
15140 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
15150 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
15160 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65   bRev==0 && pIte
15170 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  r->iRowid>=iMatc
15180 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
15190 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49  f( bRev!=0 && pI
151a0 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61  ter->iRowid<=iMa
151b0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
151c0 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77   bMove = 1;.  }w
151d0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
151e0 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a  ITE_OK );.}.../*
151f0 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74 65  .** Free the ite
15200 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
15210 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
15220 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
15230 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
15240 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74 73  ultiIterFree(Fts
15250 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  5Iter *pIter){. 
15260 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
15270 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
15280 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
15290 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Seg; i++){.     
152a0 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61   fts5SegIterClea
152b0 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  r(&pIter->aSeg[i
152c0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ]);.    }.    ft
152d0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
152e0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
152f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15300 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  pIter);.  }.}..s
15310 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
15320 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
15330 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15350 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
15360 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
15370 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 49  ithin */.  Fts5I
15380 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
15390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
153a0 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65  erator to update
153b0 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20   aFirst[] array 
153c0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68  for */.  int iCh
153d0 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20  anged,          
153e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
153f0 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f  x of sub-iterato
15400 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20  r just advanced 
15410 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65 74  */.  int iMinset
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
15440 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74 5b  entry in aFirst[
15450 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  ] to set */.){. 
15460 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
15470 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68  (pIter->nSeg+iCh
15480 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69  anged)/2; i>=iMi
15490 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53  nset && p->rc==S
154a0 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29  QLITE_OK; i=i/2)
154b0 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20  {.    int iEq;. 
154c0 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
154d0 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
154e0 70 61 72 65 28 70 49 74 65 72 2c 20 69 29 29 20  pare(pIter, i)) 
154f0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
15500 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
15510 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a  ter->aSeg[iEq];.
15520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15530 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15540 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e  ;.      pSeg->xN
15550 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b  ext(p, pSeg, 0);
15560 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74 65 72  .      i = pIter
15570 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20  ->nSeg + iEq;.  
15580 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15590 20 53 75 62 2d 69 74 65 72 61 74 6f 72 20 69 43   Sub-iterator iC
155a0 68 61 6e 67 65 64 20 6f 66 20 69 74 65 72 61 74  hanged of iterat
155b0 6f 72 20 70 49 74 65 72 20 68 61 73 20 6a 75 73  or pIter has jus
155c0 74 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64 2e  t been advanced.
155d0 20 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69   It still.** poi
155e0 6e 74 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  nts to the same 
155f0 74 65 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a 75  term though - ju
15600 73 74 20 61 20 64 69 66 66 65 72 65 6e 74 20 72  st a different r
15610 6f 77 69 64 2e 20 54 68 69 73 20 66 75 6e 63 74  owid. This funct
15620 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ion.** attempts 
15630 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f  to update the co
15640 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49  ntents of the pI
15650 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 63  ter->aFirst[] ac
15660 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66  cordingly..** If
15670 20 69 74 20 64 6f 65 73 20 73 6f 20 73 75 63 63   it does so succ
15680 65 73 73 66 75 6c 6c 79 2c 20 30 20 69 73 20 72  essfully, 0 is r
15690 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
156a0 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  se 1..**.** If n
156b0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
156c0 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
156d0 73 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73 35  should call fts5
156e0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
156f0 64 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 74  d().** on the it
15700 65 72 61 74 6f 72 20 69 6e 73 74 65 61 64 2e 20  erator instead. 
15710 54 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 64 6f  That function do
15720 65 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  es the same as t
15730 68 69 73 20 6f 6e 65 2c 20 65 78 63 65 70 74 0a  his one, except.
15740 2a 2a 20 74 68 61 74 20 69 74 20 64 65 61 6c 73  ** that it deals
15750 20 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   with more compl
15760 69 63 61 74 65 64 20 63 61 73 65 73 20 61 73 20  icated cases as 
15770 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  well..*/ .static
15780 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74   int fts5MultiIt
15790 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 0a  erAdvanceRowid(.
157a0 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
157b0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
157c0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
157d0 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
157e0 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
157f0 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20  int iChanged,   
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
15820 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
15830 76 61 6e 63 65 64 20 2a 2f 0a 20 20 46 74 73 35  vanced */.  Fts5
15840 53 65 67 49 74 65 72 20 2a 2a 70 70 46 69 72 73  SegIter **ppFirs
15850 74 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74  t.){.  Fts5SegIt
15860 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74 65  er *pNew = &pIte
15870 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64  r->aSeg[iChanged
15880 5d 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  ];..  if( pNew->
15890 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69  iRowid==pIter->i
158a0 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20 7c  SwitchRowid.   |
158b0 7c 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3c  | (pNew->iRowid<
158c0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
158d0 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
158e0 76 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  v.  ){.    int i
158f0 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  ;.    Fts5SegIte
15900 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49 74  r *pOther = &pIt
15910 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65  er->aSeg[iChange
15920 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20 20 20  d ^ 0x0001];.   
15930 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52   pIter->iSwitchR
15940 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 62 52  owid = pIter->bR
15950 65 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  ev ? SMALLEST_IN
15960 54 36 34 20 3a 20 4c 41 52 47 45 53 54 5f 49 4e  T64 : LARGEST_IN
15970 54 36 34 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  T64;.    for(i=(
15980 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61  pIter->nSeg+iCha
15990 6e 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d 69 2f  nged)/2; 1; i=i/
159a0 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 52  2){.      Fts5CR
159b0 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
159c0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b  Iter->aFirst[i];
159d0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
159e0 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20  pNew->pLeaf );. 
159f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
15a00 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c  s->bTermEq==0 ||
15a10 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20 29   pOther->pLeaf )
15a20 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  ;..      if( pRe
15a30 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20 20  s->bTermEq ){.  
15a40 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
15a50 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e  iRowid==pOther->
15a60 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
15a70 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15a80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15a90 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e  (pOther->iRowid>
15aa0 70 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70  pNew->iRowid)==p
15ab0 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20  Iter->bRev ){.  
15ac0 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
15ad0 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 4f  SwitchRowid = pO
15ae0 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  ther->iRowid;.  
15af0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
15b00 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20 7d  Other;.        }
15b10 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72  else if( (pOther
15b20 2d 3e 69 52 6f 77 69 64 3e 70 49 74 65 72 2d 3e  ->iRowid>pIter->
15b30 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70  iSwitchRowid)==p
15b40 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20  Iter->bRev ){.  
15b50 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
15b60 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 4f  SwitchRowid = pO
15b70 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  ther->iRowid;.  
15b80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15b90 20 20 20 20 20 20 70 52 65 73 2d 3e 69 46 69 72        pRes->iFir
15ba0 73 74 20 3d 20 28 75 31 36 29 28 70 4e 65 77 20  st = (u16)(pNew 
15bb0 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b 0a  - pIter->aSeg);.
15bc0 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29        if( i==1 )
15bd0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70   break;..      p
15be0 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  Other = &pIter->
15bf0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
15c00 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e  rst[i ^ 0x0001].
15c10 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d 0a  iFirst ];.    }.
15c20 20 20 7d 0a 0a 20 20 2a 70 70 46 69 72 73 74 20    }..  *ppFirst 
15c30 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e  = pNew;.  return
15c40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
15c50 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f 66   the pIter->bEof
15c60 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 64 20   variable based 
15c70 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  on the state of 
15c80 74 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f 72  the sub-iterator
15c90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
15ca0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53  d fts5MultiIterS
15cb0 65 74 45 6f 66 28 46 74 73 35 49 74 65 72 20 2a  etEof(Fts5Iter *
15cc0 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65  pIter){.  Fts5Se
15cd0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
15ce0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
15cf0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
15d00 72 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d 3e  rst ];.  pIter->
15d10 62 61 73 65 2e 62 45 6f 66 20 3d 20 70 53 65 67  base.bEof = pSeg
15d20 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70 49  ->pLeaf==0;.  pI
15d30 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
15d40 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64  d = pSeg->iRowid
15d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
15d60 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
15d70 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
15d80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
15d90 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
15da0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
15db0 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
15dc0 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  . It is not .** 
15dd0 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
15de0 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61  ror if the itera
15df0 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c  tor reaches EOF,
15e00 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72   or if it is alr
15e10 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20  eady at .** EOF 
15e20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
15e30 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
15e40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15e50 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a  5MultiIterNext(.
15e60 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
15e70 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
15e80 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c  er,.  int bFrom,
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ea0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15eb0 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20   argument iFrom 
15ec0 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36  is valid */.  i6
15ed0 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20 20  4 iFrom         
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ef0 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61 73   Advance at leas
15f00 74 20 61 73 20 66 61 72 20 61 73 20 74 68 69 73  t as far as this
15f10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 55 73   */.){.  int bUs
15f20 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20  eFrom = bFrom;. 
15f30 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
15f40 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29 3b 0a  base.bEof==0 );.
15f50 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
15f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15f70 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49   int iFirst = pI
15f80 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
15f90 46 69 72 73 74 3b 0a 20 20 20 20 69 6e 74 20 62  First;.    int b
15fa0 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
15fb0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
15fc0 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
15fd0 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 61  g[iFirst];.    a
15fe0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
15ff0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69  LITE_OK );.    i
16000 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70  f( bUseFrom && p
16010 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20  Seg->pDlidx ){. 
16020 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
16030 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65 67  NextFrom(p, pSeg
16040 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d 65  , iFrom);.    }e
16050 6c 73 65 7b 0a 20 20 20 20 20 20 70 53 65 67 2d  lse{.      pSeg-
16060 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  >xNext(p, pSeg, 
16070 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20  &bNewTerm);.    
16080 7d 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  }..    if( pSeg-
16090 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65  >pLeaf==0 || bNe
160a0 77 54 65 72 6d 20 0a 20 20 20 20 20 7c 7c 20 66  wTerm .     || f
160b0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
160c0 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20  nceRowid(pIter, 
160d0 69 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20  iFirst, &pSeg). 
160e0 20 20 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35     ){.      fts5
160f0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
16100 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
16110 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 66 74  st, 1);.      ft
16120 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
16130 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  f(pIter);.      
16140 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
16150 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73  Seg[pIter->aFirs
16160 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20  t[1].iFirst];.  
16170 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c      if( pSeg->pL
16180 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  eaf==0 ) return;
16190 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
161a0 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
161b0 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a  etup(p, pIter);.
161c0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
161d0 3d 3d 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  ==&pIter->aSeg[p
161e0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
161f0 69 46 69 72 73 74 5d 20 26 26 20 70 53 65 67 2d  iFirst] && pSeg-
16200 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 69 66  >pLeaf );.    if
16210 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
16220 70 74 79 3d 3d 30 20 7c 7c 20 70 53 65 67 2d 3e  pty==0 || pSeg->
16230 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 70 49  nPos ){.      pI
16240 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
16250 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a 20  (pIter, pSeg);. 
16260 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
16270 20 7d 0a 20 20 20 20 62 55 73 65 46 72 6f 6d 20   }.    bUseFrom 
16280 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 0;.  }.}..stat
16290 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
162a0 69 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46 74  iIterNext2(.  Ft
162b0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
162c0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a  ts5Iter *pIter,.
162d0 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d    int *pbNewTerm
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162f0 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69    /* OUT: True i
16300 66 20 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65 77  f *might* be new
16310 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73   term */.){.  as
16320 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 53 6b  sert( pIter->bSk
16330 69 70 45 6d 70 74 79 20 29 3b 0a 20 20 69 66 28  ipEmpty );.  if(
16340 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16350 4b 20 29 7b 0a 20 20 20 20 2a 70 62 4e 65 77 54  K ){.    *pbNewT
16360 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b  erm = 0;.    do{
16370 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69 72 73  .      int iFirs
16380 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  t = pIter->aFirs
16390 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20  t[1].iFirst;.   
163a0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
163b0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
163c0 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20  Seg[iFirst];.   
163d0 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20     int bNewTerm 
163e0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  = 0;..      asse
163f0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
16400 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53  E_OK );.      pS
16410 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65  eg->xNext(p, pSe
16420 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20  g, &bNewTerm);. 
16430 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
16440 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54  Leaf==0 || bNewT
16450 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66  erm .       || f
16460 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
16470 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20  nceRowid(pIter, 
16480 69 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20  iFirst, &pSeg). 
16490 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
164a0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
164b0 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20  anced(p, pIter, 
164c0 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20  iFirst, 1);.    
164d0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
164e0 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a  rSetEof(pIter);.
164f0 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65          *pbNewTe
16500 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rm = 1;.      }.
16510 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
16520 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70  MultiIterSetup(p
16530 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 7d  , pIter);..    }
16540 77 68 69 6c 65 28 20 66 74 73 35 4d 75 6c 74 69  while( fts5Multi
16550 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
16560 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  Iter) );.  }.}..
16570 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
16580 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
16590 6f 6f 70 28 46 74 73 35 49 74 65 72 20 2a 70 55  oop(Fts5Iter *pU
165a0 6e 75 73 65 64 31 2c 20 46 74 73 35 53 65 67 49  nused1, Fts5SegI
165b0 74 65 72 20 2a 70 55 6e 75 73 65 64 32 29 7b 0a  ter *pUnused2){.
165c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28    UNUSED_PARAM2(
165d0 70 55 6e 75 73 65 64 31 2c 20 70 55 6e 75 73 65  pUnused1, pUnuse
165e0 64 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46  d2);.}..static F
165f0 74 73 35 49 74 65 72 20 2a 66 74 73 35 4d 75 6c  ts5Iter *fts5Mul
16600 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46  tiIterAlloc(.  F
16610 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16630 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
16640 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
16650 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29   */.  int nSeg.)
16660 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e  {.  Fts5Iter *pN
16670 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b  ew;.  int nSlot;
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16690 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20 6f        /* Power o
166a0 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f  f two >= nSeg */
166b0 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b  ..  for(nSlot=2;
166c0 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c   nSlot<nSeg; nSl
166d0 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 70  ot=nSlot*2);.  p
166e0 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  New = fts5IdxMal
166f0 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73 69  loc(p, .      si
16700 7a 65 6f 66 28 46 74 73 35 49 74 65 72 29 20 2b  zeof(Fts5Iter) +
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16720 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20    /* pNew */.   
16730 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65     sizeof(Fts5Se
16740 67 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f 74 2d  gIter) * (nSlot-
16750 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77 2d 3e  1) +   /* pNew->
16760 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20  aSeg[] */.      
16770 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65 73 75  sizeof(Fts5CResu
16780 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20  lt) * nSlot     
16790 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69      /* pNew->aFi
167a0 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20  rst[] */.  );.  
167b0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
167c0 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c  pNew->nSeg = nSl
167d0 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 46  ot;.    pNew->aF
167e0 69 72 73 74 20 3d 20 28 46 74 73 35 43 52 65 73  irst = (Fts5CRes
167f0 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65 67  ult*)&pNew->aSeg
16800 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70 4e 65  [nSlot];.    pNe
16810 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20  w->pIndex = p;. 
16820 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74     pNew->xSetOut
16830 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
16840 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 3b 0a  etOutputs_Noop;.
16850 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
16860 77 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  w;.}..static voi
16870 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c  d fts5PoslistCal
16880 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64  lback(.  Fts5Ind
16890 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a 20 20  ex *pUnused, .  
168a0 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20  void *pContext, 
168b0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68  .  const u8 *pCh
168c0 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a  unk, int nChunk.
168d0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
168e0 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73  M(pUnused);.  as
168f0 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e  sert_nc( nChunk>
16900 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75  =0 );.  if( nChu
16910 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35  nk>0 ){.    fts5
16920 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
16930 42 6c 6f 62 28 28 46 74 73 35 42 75 66 66 65 72  Blob((Fts5Buffer
16940 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70 43 68 75  *)pContext, pChu
16950 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d  nk, nChunk);.  }
16960 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  .}..typedef stru
16970 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ct PoslistCallba
16980 63 6b 43 74 78 20 50 6f 73 6c 69 73 74 43 61 6c  ckCtx PoslistCal
16990 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72 75 63 74  lbackCtx;.struct
169a0 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
169b0 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66  Ctx {.  Fts5Buff
169c0 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20  er *pBuf;       
169d0 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e          /* Appen
169e0 64 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  d to this buffer
169f0 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
16a00 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20   *pColset;      
16a10 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
16a20 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69  t matches to thi
16a30 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  s column */.  in
16a40 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  t eState;       
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16a60 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 7d 3b   See above */.};
16a70 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
16a80 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43   PoslistOffsetsC
16a90 74 78 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  tx PoslistOffset
16aa0 73 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73  sCtx;.struct Pos
16ab0 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 7b  listOffsetsCtx {
16ac0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
16ad0 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
16ae0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
16af0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
16b00 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
16b10 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  lset;           
16b20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
16b30 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c  ches to this col
16b40 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  umn */.  int iRe
16b50 61 64 3b 0a 20 20 69 6e 74 20 69 57 72 69 74 65  ad;.  int iWrite
16b60 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f  ;.};../*.** TODO
16b70 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72 65  : Make this more
16b80 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a 73   efficient!.*/.s
16b90 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
16ba0 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 46 74  dexColsetTest(Ft
16bb0 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
16bc0 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  t, int iCol){.  
16bd0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
16be0 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  ; i<pColset->nCo
16bf0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
16c00 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b   pColset->aiCol[
16c10 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75 72  i]==iCol ) retur
16c20 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
16c30 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n 0;.}..static v
16c40 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 4f  oid fts5PoslistO
16c50 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 28 0a  ffsetsCallback(.
16c60 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e    Fts5Index *pUn
16c70 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70  used, .  void *p
16c80 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73  Context, .  cons
16c90 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
16ca0 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f  t nChunk.){.  Po
16cb0 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20  slistOffsetsCtx 
16cc0 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74  *pCtx = (Poslist
16cd0 4f 66 66 73 65 74 73 43 74 78 2a 29 70 43 6f 6e  OffsetsCtx*)pCon
16ce0 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50  text;.  UNUSED_P
16cf0 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20  ARAM(pUnused);. 
16d00 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75   assert_nc( nChu
16d10 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  nk>=0 );.  if( n
16d20 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69  Chunk>0 ){.    i
16d30 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68  nt i = 0;.    wh
16d40 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b  ile( i<nChunk ){
16d50 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 3b  .      int iVal;
16d60 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35  .      i += fts5
16d70 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 68  GetVarint32(&pCh
16d80 75 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20  unk[i], iVal);. 
16d90 20 20 20 20 20 69 56 61 6c 20 2b 3d 20 70 43 74       iVal += pCt
16da0 78 2d 3e 69 52 65 61 64 20 2d 20 32 3b 0a 20 20  x->iRead - 2;.  
16db0 20 20 20 20 70 43 74 78 2d 3e 69 52 65 61 64 20      pCtx->iRead 
16dc0 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 66  = iVal;.      if
16dd0 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65  ( fts5IndexColse
16de0 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c  tTest(pCtx->pCol
16df0 73 65 74 2c 20 69 56 61 6c 29 20 29 7b 0a 20 20  set, iVal) ){.  
16e00 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
16e10 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
16e20 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 69 56 61  (pCtx->pBuf, iVa
16e30 6c 20 2b 20 32 20 2d 20 70 43 74 78 2d 3e 69 57  l + 2 - pCtx->iW
16e40 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70  rite);.        p
16e50 43 74 78 2d 3e 69 57 72 69 74 65 20 3d 20 69 56  Ctx->iWrite = iV
16e60 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
16e70 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
16e80 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74  void fts5Poslist
16e90 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 28 0a  FilterCallback(.
16ea0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e    Fts5Index *pUn
16eb0 75 73 65 64 2c 0a 20 20 76 6f 69 64 20 2a 70 43  used,.  void *pC
16ec0 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74  ontext, .  const
16ed0 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74   u8 *pChunk, int
16ee0 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73   nChunk.){.  Pos
16ef0 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
16f00 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74  *pCtx = (Poslist
16f10 43 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70 43 6f  CallbackCtx*)pCo
16f20 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44 5f  ntext;.  UNUSED_
16f30 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a  PARAM(pUnused);.
16f40 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68    assert_nc( nCh
16f50 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unk>=0 );.  if( 
16f60 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  nChunk>0 ){.    
16f70 2f 2a 20 53 65 61 72 63 68 20 74 68 72 6f 75 67  /* Search throug
16f80 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69  h to find the fi
16f90 72 73 74 20 76 61 72 69 6e 74 20 77 69 74 68 20  rst varint with 
16fa0 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20 69 73  value 1. This is
16fb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72   the.    ** star
16fc0 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 63 6f  t of the next co
16fd0 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f 0a 20  lumns hits. */. 
16fe0 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
16ff0 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d 20 30    int iStart = 0
17000 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  ;..    if( pCtx-
17010 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a 20 20  >eState==2 ){.  
17020 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
17030 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56      fts5FastGetV
17040 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20  arint32(pChunk, 
17050 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  i, iCol);.      
17060 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  if( fts5IndexCol
17070 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43  setTest(pCtx->pC
17080 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29 7b 0a  olset, iCol) ){.
17090 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53          pCtx->eS
170a0 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tate = 1;.      
170b0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
170c0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74  AppendVarint(pCt
170d0 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20 20  x->pBuf, 1);.   
170e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
170f0 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
17100 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
17110 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  }..    do {.    
17120 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e    while( i<nChun
17130 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21 3d  k && pChunk[i]!=
17140 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20  0x01 ){.        
17150 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69 5d  while( pChunk[i]
17160 20 26 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20   & 0x80 ) i++;. 
17170 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
17180 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43    }.      if( pC
17190 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  tx->eState ){.  
171a0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
171b0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
171c0 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75  Ctx->pBuf, &pChu
171d0 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53  nk[iStart], i-iS
171e0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tart);.      }. 
171f0 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68 75 6e       if( i<nChun
17200 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  k ){.        int
17210 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   iCol;.        i
17220 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  Start = i;.     
17230 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
17240 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b  if( i>=nChunk ){
17250 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d  .          pCtx-
17260 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20  >eState = 2;.   
17270 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17280 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65        fts5FastGe
17290 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b  tVarint32(pChunk
172a0 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  , i, iCol);.    
172b0 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
172c0 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f  te = fts5IndexCo
172d0 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70  lsetTest(pCtx->p
172e0 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a 20  Colset, iCol);. 
172f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74           if( pCt
17300 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  x->eState ){.   
17310 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
17320 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
17330 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70  b(pCtx->pBuf, &p
17340 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69  Chunk[iStart], i
17350 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  -iStart);.      
17360 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
17370 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17390 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 43      }while( i<nC
173a0 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  hunk );.  }.}..s
173b0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43  tatic void fts5C
173c0 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20 20 46  hunkIterate(.  F
173d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
173f0 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  * Index object *
17400 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
17410 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20 20  *pSeg,          
17420 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 6f      /* Poslist o
17430 66 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  f this iterator 
17440 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  */.  void *pCtx,
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
17470 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 68 75  pointer for xChu
17480 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  nk callback */. 
17490 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29 28   void (*xChunk)(
174a0 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69 64  Fts5Index*, void
174b0 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e  *, const u8*, in
174c0 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d  t).){.  int nRem
174d0 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20 20   = pSeg->nPos;  
174e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
174f0 72 20 6f 66 20 62 79 74 65 73 20 73 74 69 6c 6c  r of bytes still
17500 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46 74   to come */.  Ft
17510 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  s5Data *pData = 
17520 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b 20  0;.  u8 *pChunk 
17530 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  = &pSeg->pLeaf->
17540 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66  p[pSeg->iLeafOff
17550 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68 75  set];.  int nChu
17560 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70  nk = MIN(nRem, p
17570 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  Seg->pLeaf->szLe
17580 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61 66  af - pSeg->iLeaf
17590 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74 20 70  Offset);.  int p
175a0 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61  gno = pSeg->iLea
175b0 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67 6e  fPgno;.  int pgn
175c0 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oSave = 0;..  /*
175d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
175e0 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b 20 77 69 74  oes notmwork wit
175f0 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 64 61  h detail=none da
17600 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 61 73  tabases. */.  as
17610 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67  sert( p->pConfig
17620 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f  ->eDetail!=FTS5_
17630 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a  DETAIL_NONE );..
17640 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66 6c 61    if( (pSeg->fla
17650 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
17660 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 7b  R_REVERSE)==0 ){
17670 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d 20  .    pgnoSave = 
17680 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77  pgno+1;.  }..  w
17690 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 78  hile( 1 ){.    x
176a0 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70  Chunk(p, pCtx, p
176b0 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
176c0 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75      nRem -= nChu
176d0 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  nk;.    fts5Data
176e0 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
176f0 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20      if( nRem<=0 
17700 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
17710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17720 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70   pgno++;.      p
17730 44 61 74 61 20 3d 20 66 74 73 35 4c 65 61 66 52  Data = fts5LeafR
17740 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
17750 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
17760 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67  pSeg->iSegid, pg
17770 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  no));.      if( 
17780 70 44 61 74 61 3d 3d 30 20 29 20 62 72 65 61 6b  pData==0 ) break
17790 3b 0a 20 20 20 20 20 20 70 43 68 75 6e 6b 20 3d  ;.      pChunk =
177a0 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20   &pData->p[4];. 
177b0 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49       nChunk = MI
177c0 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d 3e 73  N(nRem, pData->s
177d0 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20 20 20  zLeaf - 4);.    
177e0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f    if( pgno==pgno
177f0 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Save ){.        
17800 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 4e  assert( pSeg->pN
17810 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  extLeaf==0 );.  
17820 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e 65 78        pSeg->pNex
17830 74 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20  tLeaf = pData;. 
17840 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30         pData = 0
17850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17860 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    }.}../*.** Ite
17870 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72  rator pIter curr
17880 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
17890 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e  a valid entry (n
178a0 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a  ot EOF). This.**
178b0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
178c0 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
178d0 69 73 74 20 64 61 74 61 20 66 6f 72 20 74 68 65  ist data for the
178e0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 74   current entry t
178f0 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
17900 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  . It does not ma
17910 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
17920 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
17930 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f  ize.** field..*/
17940 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17950 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
17960 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
17970 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
17980 70 53 65 67 2c 0a 20 20 46 74 73 35 43 6f 6c 73  pSeg,.  Fts5Cols
17990 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46  et *pColset,.  F
179a0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
179b0 29 7b 0a 20 20 69 66 28 20 30 3d 3d 66 74 73 35  ){.  if( 0==fts5
179c0 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
179d0 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e  c, pBuf, pSeg->n
179e0 50 6f 73 2b 46 54 53 35 5f 44 41 54 41 5f 5a 45  Pos+FTS5_DATA_ZE
179f0 52 4f 5f 50 41 44 44 49 4e 47 29 20 29 7b 0a 20  RO_PADDING) ){. 
17a00 20 20 20 6d 65 6d 73 65 74 28 26 70 42 75 66 2d     memset(&pBuf-
17a10 3e 70 5b 70 42 75 66 2d 3e 6e 2b 70 53 65 67 2d  >p[pBuf->n+pSeg-
17a20 3e 6e 50 6f 73 5d 2c 20 30 2c 20 46 54 53 35 5f  >nPos], 0, FTS5_
17a30 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e  DATA_ZERO_PADDIN
17a40 47 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  G);.    if( pCol
17a50 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
17a60 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
17a70 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a  (p, pSeg, (void*
17a80 29 70 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69  )pBuf, fts5Posli
17a90 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  stCallback);.   
17aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
17ab0 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
17ac0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
17ad0 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20  IL_FULL ){.     
17ae0 20 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61     PoslistCallba
17af0 63 6b 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20  ckCtx sCtx;.    
17b00 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20      sCtx.pBuf = 
17b10 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43  pBuf;.        sC
17b20 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f  tx.pColset = pCo
17b30 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 73 43  lset;.        sC
17b40 74 78 2e 65 53 74 61 74 65 20 3d 20 66 74 73 35  tx.eState = fts5
17b50 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
17b60 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20  pColset, 0);.   
17b70 20 20 20 20 20 61 73 73 65 72 74 28 20 73 43 74       assert( sCt
17b80 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73  x.eState==0 || s
17b90 43 74 78 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b  Ctx.eState==1 );
17ba0 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75  .        fts5Chu
17bb0 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
17bc0 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c  g, (void*)&sCtx,
17bd0 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74   fts5PoslistFilt
17be0 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  erCallback);.   
17bf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17c00 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73    PoslistOffsets
17c10 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20  Ctx sCtx;.      
17c20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20    memset(&sCtx, 
17c30 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29  0, sizeof(sCtx))
17c40 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
17c50 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20  Buf = pBuf;.    
17c60 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74      sCtx.pColset
17c70 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20   = pColset;.    
17c80 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
17c90 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76  rate(p, pSeg, (v
17ca0 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35  oid*)&sCtx, fts5
17cb0 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61  PoslistOffsetsCa
17cc0 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d  llback);.      }
17cd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
17ce0 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d  .** IN/OUT param
17cf0 65 74 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74  eter (*pa) point
17d00 73 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20  s to a position 
17d10 6c 69 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20  list n bytes in 
17d20 73 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20  size. If.** the 
17d30 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
17d40 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66  ntains entries f
17d50 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
17d60 74 68 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65  then (*pa) is se
17d70 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f  t.** to point to
17d80 20 74 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f   the sub-positio
17d90 6e 2d 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20  n-list for that 
17da0 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e  column and the n
17db0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65  umber of.** byte
17dc0 73 20 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64  s in it returned
17dd0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67  . Or, if the arg
17de0 75 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  ument position l
17df0 69 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ist does not.** 
17e00 63 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72  contain any entr
17e10 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69  ies for column i
17e20 43 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  Col, return 0..*
17e30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
17e40 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
17e50 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70  (.  const u8 **p
17e60 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
17e70 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
17e80 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73  ointer to poslis
17e90 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  t */.  int n,   
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69         /* IN: Si
17ec0 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e  ze of poslist in
17ed0 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
17ee0 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17f00 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
17f10 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f   from poslist */
17f20 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65  .){.  int iCurre
17f30 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
17f40 20 20 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e        /* Anythin
17f50 67 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  g before the fir
17f60 73 74 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30  st 0x01 is col 0
17f70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
17f80 70 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74  p = *pa;.  const
17f90 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e   u8 *pEnd = &p[n
17fa0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ];         /* On
17fb0 65 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20  e byte past end 
17fc0 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  of position list
17fd0 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 43   */..  while( iC
17fe0 6f 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b 0a 20  ol>iCurrent ){. 
17ff0 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f     /* Advance po
18000 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74  inter p until it
18010 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20   points to pEnd 
18020 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20  or an 0x01 byte 
18030 74 68 61 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e  that is.    ** n
18040 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72  ot part of a var
18050 69 6e 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 69  int. Note that i
18060 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
18070 65 20 66 6f 72 20 61 20 6e 65 67 61 74 69 76 65  e for a negative
18080 0a 20 20 20 20 2a 2a 20 6f 72 20 65 78 74 72 65  .    ** or extre
18090 6d 65 6c 79 20 6c 61 72 67 65 20 76 61 72 69 6e  mely large varin
180a0 74 20 74 6f 20 6f 63 63 75 72 20 77 69 74 68 69  t to occur withi
180b0 6e 20 61 6e 20 75 6e 63 6f 72 72 75 70 74 65 64  n an uncorrupted
180c0 20 70 6f 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a   position .    *
180d0 2a 20 6c 69 73 74 2e 20 53 6f 20 74 68 65 20 6c  * list. So the l
180e0 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68  ast byte of each
180f0 20 76 61 72 69 6e 74 20 6d 61 79 20 62 65 20 61   varint may be a
18100 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
18110 20 63 6c 65 61 72 0a 20 20 20 20 2a 2a 20 30 78   clear.    ** 0x
18120 38 30 20 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20  80 bit.  */.    
18130 77 68 69 6c 65 28 20 2a 70 21 3d 30 78 30 31 20  while( *p!=0x01 
18140 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
18150 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20  *p++ & 0x80 );. 
18160 20 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64       if( p>=pEnd
18170 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
18180 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b   }.    *pa = p++
18190 3b 0a 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d  ;.    iCurrent =
181a0 20 2a 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69   *p++;.    if( i
181b0 43 75 72 72 65 6e 74 20 26 20 30 78 38 30 20 29  Current & 0x80 )
181c0 7b 0a 20 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20  {.      p--;.   
181d0 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56     p += fts5GetV
181e0 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72  arint32(p, iCurr
181f0 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
18200 20 20 69 66 28 20 69 43 6f 6c 21 3d 69 43 75 72    if( iCol!=iCur
18210 72 65 6e 74 20 29 20 72 65 74 75 72 6e 20 30 3b  rent ) return 0;
18220 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70  ..  /* Advance p
18230 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69  ointer p until i
18240 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64  t points to pEnd
18250 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65   or an 0x01 byte
18260 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f   that is.  ** no
18270 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69  t part of a vari
18280 6e 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  nt */.  while( p
18290 3c 70 45 6e 64 20 26 26 20 2a 70 21 3d 30 78 30  <pEnd && *p!=0x0
182a0 31 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  1 ){.    while( 
182b0 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20  *p++ & 0x80 );. 
182c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 20 2d   }..  return p -
182d0 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69   (*pa);.}..stati
182e0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
182f0 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28 0a 20  ExtractColset(. 
18300 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73   int *pRc,.  Fts
18310 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
18320 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18330 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72  Colset to filter
18340 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   on */.  const u
18350 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f  8 *pPos, int nPo
18360 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69  s,       /* Posi
18370 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46  tion list */.  F
18380 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 20  ts5Buffer *pBuf 
18390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
183a0 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
183b0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  */.){.  if( *pRc
183c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
183d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 74     int i;.    ft
183e0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75  s5BufferZero(pBu
183f0 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  f);.    for(i=0;
18400 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c   i<pColset->nCol
18410 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
18420 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70  nst u8 *pSub = p
18430 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Pos;.      int n
18440 53 75 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45  Sub = fts5IndexE
18450 78 74 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c  xtractCol(&pSub,
18460 20 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e   nPos, pColset->
18470 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  aiCol[i]);.     
18480 20 69 66 28 20 6e 53 75 62 20 29 7b 0a 20 20 20   if( nSub ){.   
18490 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
184a0 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70  ppendBlob(pRc, p
184b0 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62 29  Buf, nSub, pSub)
184c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
184d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65    }.}../*.** xSe
184e0 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
184f0 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  k used by detail
18500 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f  =none tables..*/
18510 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18520 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18530 4e 6f 6e 65 28 46 74 73 35 49 74 65 72 20 2a 70  None(Fts5Iter *p
18540 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
18550 72 20 2a 70 53 65 67 29 7b 0a 20 20 61 73 73 65  r *pSeg){.  asse
18560 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
18570 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
18580 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
18590 5f 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65 72  _NONE );.  pIter
185a0 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
185b0 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pSeg->iRowid;.  
185c0 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
185d0 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a  a = pSeg->nPos;.
185e0 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
185f0 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
18600 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c  ed by detail=ful
18610 6c 20 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c  l and detail=col
18620 20 74 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a   tables when no.
18630 2a 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72  ** column filter
18640 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2e  s are specified.
18650 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18660 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
18670 74 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35  ts_Nocolset(Fts5
18680 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
18690 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
186a0 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69  .  pIter->base.i
186b0 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
186c0 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62  owid;.  pIter->b
186d0 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67  ase.nData = pSeg
186e0 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72  ->nPos;..  asser
186f0 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18700 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18710 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
18720 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
18730 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  ( pIter->pColset
18740 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
18750 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
18760 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67  pSeg->nPos<=pSeg
18770 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
18780 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61  ){.    /* All da
18790 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20  ta is stored on 
187a0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
187b0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
187c0 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61  utput .    ** va
187d0 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74  riables to point
187e0 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
187f0 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  f the page objec
18800 74 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d  t. */.    pIter-
18810 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 26 70  >base.pData = &p
18820 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
18830 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
18840 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
18850 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69  * The data is di
18860 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74  stributed over t
18870 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  wo or more pages
18880 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74  . Copy it into t
18890 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74  he.    ** Fts5It
188a0 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65  er.poslist buffe
188b0 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74  r and then set t
188c0 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65  he output pointe
188d0 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a  r to point.    *
188e0 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  * to this buffer
188f0 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  .  */.    fts5Bu
18900 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
18910 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
18920 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
18930 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
18940 20 70 53 65 67 2c 20 30 2c 20 26 70 49 74 65 72   pSeg, 0, &pIter
18950 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
18960 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
18970 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
18980 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st.p;.  }.}../*.
18990 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
189a0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65  allback used whe
189b0 6e 20 74 68 65 20 46 74 73 35 43 6f 6c 73 65 74  n the Fts5Colset
189c0 20 6f 62 6a 65 63 74 20 68 61 73 20 6e 43 6f 6c   object has nCol
189d0 3d 3d 30 20 28 6d 61 74 63 68 0a 2a 2a 20 61 67  ==0 (match.** ag
189e0 61 69 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d 6e 73  ainst no columns
189f0 20 61 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73 74 61   at all)..*/.sta
18a00 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
18a10 72 53 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f  rSetOutputs_Zero
18a20 43 6f 6c 73 65 74 28 46 74 73 35 49 74 65 72 20  Colset(Fts5Iter 
18a30 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
18a40 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 55 4e  ter *pSeg){.  UN
18a50 55 53 45 44 5f 50 41 52 41 4d 28 70 53 65 67 29  USED_PARAM(pSeg)
18a60 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
18a70 6e 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nData = 0;.}../*
18a80 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
18a90 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
18aa0 20 64 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65 6e   detail=col when
18ab0 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75   there is a colu
18ac0 6d 6e 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e 64  mn filter.** and
18ad0 20 74 68 65 72 65 20 61 72 65 20 31 30 30 20 6f   there are 100 o
18ae0 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  r more columns. 
18af0 41 6c 73 6f 20 63 61 6c 6c 65 64 20 61 73 20 61  Also called as a
18b00 20 66 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a   fallback from.*
18b10 2a 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  * fts5IterSetOut
18b20 70 75 74 73 5f 43 6f 6c 31 30 30 20 69 66 20 74  puts_Col100 if t
18b30 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73  he column-list s
18b40 70 61 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  pans more than o
18b50 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ne page..*/.stat
18b60 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
18b70 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 46  SetOutputs_Col(F
18b80 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
18b90 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
18ba0 67 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72  g){.  fts5Buffer
18bb0 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
18bc0 6c 69 73 74 29 3b 0a 20 20 66 74 73 35 53 65 67  list);.  fts5Seg
18bd0 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65  iterPoslist(pIte
18be0 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c  r->pIndex, pSeg,
18bf0 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2c   pIter->pColset,
18c00 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
18c10 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  );.  pIter->base
18c20 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
18c30 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d  iRowid;.  pIter-
18c40 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
18c50 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
18c60 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
18c70 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
18c80 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  list.n;.}../*.**
18c90 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c   xSetOutputs cal
18ca0 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e 3a  lback used when:
18cb0 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74 61   .**.**   * deta
18cc0 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74  il=col,.**   * t
18cd0 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  here is a column
18ce0 20 66 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a 20   filter, and.** 
18cf0 20 20 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f    * the table co
18d00 6e 74 61 69 6e 73 20 31 30 30 20 6f 72 20 66 65  ntains 100 or fe
18d10 77 65 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a  wer columns. .**
18d20 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69  .** The last poi
18d30 6e 74 20 69 73 20 74 6f 20 65 6e 73 75 72 65 20  nt is to ensure 
18d40 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  all column numbe
18d50 72 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 73  rs are stored as
18d60 20 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74 65   .** single-byte
18d70 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61   varints..*/.sta
18d80 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
18d90 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31  rSetOutputs_Col1
18da0 30 30 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  00(Fts5Iter *pIt
18db0 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  er, Fts5SegIter 
18dc0 2a 70 53 65 67 29 7b 0a 0a 20 20 61 73 73 65 72  *pSeg){..  asser
18dd0 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18de0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18df0 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
18e00 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73 73  COLUMNS );.  ass
18e10 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c  ert( pIter->pCol
18e20 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  set );..  if( pS
18e30 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
18e40 70 53 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d  pSeg->nPos>pSeg-
18e50 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
18e60 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53 65  {.    fts5IterSe
18e70 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 70 49 74  tOutputs_Col(pIt
18e80 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65 6c  er, pSeg);.  }el
18e90 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20  se{.    u8 *a = 
18ea0 28 75 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65 61  (u8*)&pSeg->pLea
18eb0 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
18ec0 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 75 38 20  Offset];.    u8 
18ed0 2a 70 45 6e 64 20 3d 20 28 75 38 2a 29 26 61 5b  *pEnd = (u8*)&a[
18ee0 70 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20  pSeg->nPos]; .  
18ef0 20 20 69 6e 74 20 69 50 72 65 76 20 3d 20 30 3b    int iPrev = 0;
18f00 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20  .    int *aiCol 
18f10 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  = pIter->pColset
18f20 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  ->aiCol;.    int
18f30 20 2a 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61 69   *aiColEnd = &ai
18f40 43 6f 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c 73  Col[pIter->pCols
18f50 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20  et->nCol];..    
18f60 75 38 20 2a 61 4f 75 74 20 3d 20 70 49 74 65 72  u8 *aOut = pIter
18f70 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
18f80 20 69 6e 74 20 69 50 72 65 76 4f 75 74 20 3d 20   int iPrevOut = 
18f90 30 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  0;..    pIter->b
18fa0 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65  ase.iRowid = pSe
18fb0 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20  g->iRowid;..    
18fc0 77 68 69 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b  while( a<pEnd ){
18fd0 0a 20 20 20 20 20 20 69 50 72 65 76 20 2b 3d 20  .      iPrev += 
18fe0 28 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b  (int)a++[0] - 2;
18ff0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 61  .      while( *a
19000 69 43 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20 20  iCol<iPrev ){.  
19010 20 20 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20        aiCol++;. 
19020 20 20 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c         if( aiCol
19030 3d 3d 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f 74  ==aiColEnd ) got
19040 6f 20 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c  o setoutputs_col
19050 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
19060 20 20 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d 3d      if( *aiCol==
19070 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
19080 20 2a 61 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28   *aOut++ = (u8)(
19090 28 69 50 72 65 76 20 2d 20 69 50 72 65 76 4f 75  (iPrev - iPrevOu
190a0 74 29 20 2b 20 32 29 3b 0a 20 20 20 20 20 20 20  t) + 2);.       
190b0 20 69 50 72 65 76 4f 75 74 20 3d 20 69 50 72 65   iPrevOut = iPre
190c0 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  v;.      }.    }
190d0 0a 0a 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c  ..setoutputs_col
190e0 5f 6f 75 74 3a 0a 20 20 20 20 70 49 74 65 72 2d  _out:.    pIter-
190f0 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
19100 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
19110 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
19120 6e 44 61 74 61 20 3d 20 61 4f 75 74 20 2d 20 70  nData = aOut - p
19130 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
19140 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  .  }.}../*.** xS
19150 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
19160 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69  ck used by detai
19170 6c 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68 65 72  l=full when ther
19180 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69  e is a column fi
19190 6c 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lter..*/.static 
191a0 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
191b0 4f 75 74 70 75 74 73 5f 46 75 6c 6c 28 46 74 73  Outputs_Full(Fts
191c0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
191d0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
191e0 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  {.  Fts5Colset *
191f0 70 43 6f 6c 73 65 74 20 3d 20 70 49 74 65 72 2d  pColset = pIter-
19200 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65  >pColset;.  pIte
19210 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d  r->base.iRowid =
19220 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a   pSeg->iRowid;..
19230 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
19240 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
19250 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
19260 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20  DETAIL_FULL );. 
19270 20 61 73 73 65 72 74 28 20 70 43 6f 6c 73 65 74   assert( pColset
19280 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d   );..  if( pSeg-
19290 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65  >iLeafOffset+pSe
192a0 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70  g->nPos<=pSeg->p
192b0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
192c0 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20      /* All data 
192d0 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  is stored on the
192e0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50   current page. P
192f0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70  opulate the outp
19300 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  ut .    ** varia
19310 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e  bles to point in
19320 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
19330 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20  he page object. 
19340 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  */.    const u8 
19350 2a 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61  *a = &pSeg->pLea
19360 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
19370 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28  Offset];.    if(
19380 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d   pColset->nCol==
19390 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  1 ){.      pIter
193a0 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 66  ->base.nData = f
193b0 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
193c0 6f 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f  ol(&a, pSeg->nPo
193d0 73 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  s,pColset->aiCol
193e0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  [0]);.      pIte
193f0 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
19400 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  a;.    }else{.  
19410 20 20 20 20 69 6e 74 20 2a 70 52 63 20 3d 20 26      int *pRc = &
19420 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
19430 63 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  c;.      fts5Buf
19440 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
19450 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  poslist);.      
19460 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74  fts5IndexExtract
19470 43 6f 6c 73 65 74 28 70 52 63 2c 20 70 43 6f 6c  Colset(pRc, pCol
19480 73 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e 50  set, a, pSeg->nP
19490 6f 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c  os, &pIter->posl
194a0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ist);.      pIte
194b0 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
194c0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
194d0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
194e0 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65  ase.nData = pIte
194f0 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20  r->poslist.n;.  
19500 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
19510 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20   /* The data is 
19520 64 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72  distributed over
19530 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67   two or more pag
19540 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f  es. Copy it into
19550 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35   the.    ** Fts5
19560 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66  Iter.poslist buf
19570 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74  fer and then set
19580 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e   the output poin
19590 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20  ter to point.   
195a0 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66   ** to this buff
195b0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35  er.  */.    fts5
195c0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
195d0 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
195e0 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
195f0 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
19600 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74  x, pSeg, pColset
19610 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
19620 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  t);.    pIter->b
19630 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
19640 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
19650 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
19660 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
19670 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73  list.n;.  }.}..s
19680 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
19690 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 69  terSetOutputCb(i
196a0 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 49 74 65  nt *pRc, Fts5Ite
196b0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
196c0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
196d0 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
196e0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 49  ig *pConfig = pI
196f0 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f  ter->pIndex->pCo
19700 6e 66 69 67 3b 0a 20 20 20 20 69 66 28 20 70 43  nfig;.    if( pC
19710 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
19720 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
19730 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
19740 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66  >xSetOutputs = f
19750 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
19760 73 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20  s_None;.    }.. 
19770 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65     else if( pIte
19780 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b  r->pColset==0 ){
19790 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53  .      pIter->xS
197a0 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
197b0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
197c0 6f 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a  ocolset;.    }..
197d0 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74      else if( pIt
197e0 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  er->pColset->nCo
197f0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  l==0 ){.      pI
19800 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
19810 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
19820 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74  tputs_ZeroColset
19830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73  ;.    }..    els
19840 65 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65  e if( pConfig->e
19850 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
19860 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  AIL_FULL ){.    
19870 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74    pIter->xSetOut
19880 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
19890 65 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 3b 0a  etOutputs_Full;.
198a0 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 7b      }..    else{
198b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
198c0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
198d0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c  =FTS5_DETAIL_COL
198e0 55 4d 4e 53 20 29 3b 0a 20 20 20 20 20 20 69 66  UMNS );.      if
198f0 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c  ( pConfig->nCol<
19900 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
19910 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75  pIter->xSetOutpu
19920 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74  ts = fts5IterSet
19930 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 3b 0a  Outputs_Col100;.
19940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
19950 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 70 52  ts5BufferSize(pR
19960 63 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  c, &pIter->posli
19970 73 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  st, pConfig->nCo
19980 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
19990 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
199a0 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
199b0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
199c0 5f 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _Col;.      }.  
199d0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
199e0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
199f0 20 46 74 73 35 49 74 65 72 20 6f 62 6a 65 63 74   Fts5Iter object
19a00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
19a10 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75  object will be u
19a20 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
19a30 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73  hrough data in s
19a40 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
19a50 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69  ..** If iLevel i
19a60 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20  s -ve, then all 
19a70 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d  data in all segm
19a80 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20  ents is merged. 
19a90 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a  Or, if iLevel.**
19aa0 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61   is zero or grea
19ab0 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74  ter, data from t
19ac0 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e  he first nSegmen
19ad0 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65  t segments on le
19ae0 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73  vel iLevel.** is
19af0 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   merged..**.** T
19b00 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74  he iterator init
19b10 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ially points to 
19b20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72  the first term/r
19b30 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68  owid entry in th
19b40 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64  e .** iterated d
19b50 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
19b60 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
19b70 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65  rNew(.  Fts5Inde
19b80 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
19b90 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
19ba0 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
19bb0 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
19bc0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
19bd0 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f  truct,         /
19be0 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66 20 73  * Structure of s
19bf0 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f  pecific index */
19c00 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c20 20 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f     /* FTS5INDEX_
19c30 51 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20  QUERY_XXX flags 
19c40 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
19c50 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
19c60 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74       /* Colset t
19c70 6f 20 66 69 6c 74 65 72 20 6f 6e 20 28 6f 72 20  o filter on (or 
19c80 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  NULL) */.  const
19c90 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
19ca0 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
19cb0 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
19cc0 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
19cd0 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19cf0 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
19d00 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
19d10 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
19d20 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
19d30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19d40 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
19d50 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
19d60 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a  */.  Fts5Iter **
19d70 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
19d80 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
19d90 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
19da0 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Seg = 0;        
19db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19dc0 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d  mber of segment-
19dd0 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a  iters in use */.
19de0 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b    int iIter = 0;
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53    /* */.  int iS
19e10 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
19e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
19e30 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
19e40 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
19e50 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
19e60 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46  Level *pLvl;.  F
19e70 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  ts5Iter *pNew;..
19e80 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
19e90 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
19ea0 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
19eb0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
19ec0 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
19ed0 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
19ee0 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tor. */.  if( p-
19ef0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19f00 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c  {.    if( iLevel
19f10 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
19f20 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
19f30 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
19f40 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
19f50 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
19f60 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75      nSeg = pStru
19f70 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
19f80 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e      nSeg += (p->
19f90 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a  pHash ? 1 : 0);.
19fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19fb0 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72   nSeg = MIN(pStr
19fc0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
19fd0 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65  el].nSeg, nSegme
19fe0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nt);.    }.  }. 
19ff0 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d   *ppOut = pNew =
1a000 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c   fts5MultiIterAl
1a010 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20  loc(p, nSeg);.  
1a020 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
1a030 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52  turn;.  pNew->bR
1a040 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20  ev = (0!=(flags 
1a050 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
1a060 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77  Y_DESC));.  pNew
1a070 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 28  ->bSkipEmpty = (
1a080 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35  0!=(flags & FTS5
1a090 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50  INDEX_QUERY_SKIP
1a0a0 45 4d 50 54 59 29 29 3b 0a 20 20 70 4e 65 77 2d  EMPTY));.  pNew-
1a0b0 3e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73  >pColset = pCols
1a0c0 65 74 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73  et;.  if( (flags
1a0d0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
1a0e0 52 59 5f 4e 4f 4f 55 54 50 55 54 29 3d 3d 30 20  RY_NOOUTPUT)==0 
1a0f0 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53  ){.    fts5IterS
1a100 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72  etOutputCb(&p->r
1a110 63 2c 20 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  c, pNew);.  }.. 
1a120 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65   /* Initialize e
1a130 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  ach of the compo
1a140 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65  nent segment ite
1a150 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28  rators. */.  if(
1a160 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a170 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65  K ){.    if( iLe
1a180 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 46  vel<0 ){.      F
1a190 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
1a1a0 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74 72 75  l *pEnd = &pStru
1a1b0 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75  ct->aLevel[pStru
1a1c0 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20  ct->nLevel];.   
1a1d0 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20     if( p->pHash 
1a1e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ){.        /* Ad
1a1f0 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74 65 72  d a segment iter
1a200 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72  ator for the cur
1a210 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
1a220 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
1a230 20 2a 2f 0a 20 20 20 20 20 20 20 20 46 74 73 35   */.        Fts5
1a240 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
1a250 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
1a260 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 66  er++];.        f
1a270 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
1a280 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65  it(p, pTerm, nTe
1a290 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72  rm, flags, pIter
1a2a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a2b0 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75   for(pLvl=&pStru
1a2c0 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70  ct->aLevel[0]; p
1a2d0 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b  Lvl<pEnd; pLvl++
1a2e0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
1a2f0 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31  Seg=pLvl->nSeg-1
1a300 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
1a310 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74  -){.          Ft
1a320 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1a330 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
1a340 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
1a350 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
1a360 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
1a370 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
1a380 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1a390 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20   pTerm==0 ){.   
1a3a0 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
1a3b0 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67  IterInit(p, pSeg
1a3c0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
1a3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a3e0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1a3f0 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20 70 54  erSeekInit(p, pT
1a400 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
1a410 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  s, pSeg, pIter);
1a420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a450 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
1a460 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b  >aLevel[iLevel];
1a470 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d  .      for(iSeg=
1a480 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b  nSeg-1; iSeg>=0;
1a490 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20   iSeg--){.      
1a4a0 20 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69    fts5SegIterIni
1a4b0 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  t(p, &pLvl->aSeg
1a4c0 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61  [iSeg], &pNew->a
1a4d0 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20  Seg[iIter++]);. 
1a4e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a4f0 20 61 73 73 65 72 74 28 20 69 49 74 65 72 3d 3d   assert( iIter==
1a500 6e 53 65 67 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nSeg );.  }..  /
1a510 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 77  * If the above w
1a520 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65  as successful, e
1a530 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74  ach component it
1a540 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e  erators now poin
1a550 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ts .  ** to the 
1a560 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69  first entry in i
1a570 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74  ts segment. In t
1a580 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c  his case initial
1a590 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46  ize the .  ** aF
1a5a0 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72  irst[] array. Or
1a5b0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  , if an error ha
1a5c0 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65  s occurred, free
1a5d0 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20   the iterator.  
1a5e0 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65  ** object and se
1a5f0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
1a600 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20  iable to NULL.  
1a610 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
1a620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a630 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65 77 2d   for(iIter=pNew-
1a640 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72 3e 30  >nSeg-1; iIter>0
1a650 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20  ; iIter--){.    
1a660 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20    int iEq;.     
1a670 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35   if( (iEq = fts5
1a680 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
1a690 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29  re(pNew, iIter))
1a6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
1a6b0 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
1a6c0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d  &pNew->aSeg[iEq]
1a6d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
1a6e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a6f0 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20   pSeg->xNext(p, 
1a700 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSeg, 0);.      
1a710 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
1a720 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c  dvanced(p, pNew,
1a730 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a 20 20   iEq, iIter);.  
1a740 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a750 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
1a760 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 66  Eof(pNew);.    f
1a770 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
1a780 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65 77 29  erSetup(p, pNew)
1a790 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
1a7a0 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66  >bSkipEmpty && f
1a7b0 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d  ts5MultiIterIsEm
1a7c0 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a  pty(p, pNew) ){.
1a7d0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1a7e0 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c  terNext(p, pNew,
1a7f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
1a800 65 20 69 66 28 20 70 4e 65 77 2d 3e 62 61 73 65  e if( pNew->base
1a810 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  .bEof==0 ){.    
1a820 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1a830 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  Seg = &pNew->aSe
1a840 67 5b 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31  g[pNew->aFirst[1
1a850 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  ].iFirst];.     
1a860 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74 70 75   pNew->xSetOutpu
1a870 74 73 28 70 4e 65 77 2c 20 70 53 65 67 29 3b 0a  ts(pNew, pSeg);.
1a880 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
1a890 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1a8a0 72 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  rFree(pNew);.   
1a8b0 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d   *ppOut = 0;.  }
1a8c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1a8d0 20 61 6e 20 46 74 73 35 49 74 65 72 20 74 68 61   an Fts5Iter tha
1a8e0 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
1a8f0 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74 20 70  gh the doclist p
1a900 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20 74 68  rovided.** as th
1a910 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1a920 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1a930 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
1a940 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ew2(.  Fts5Index
1a950 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1a960 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1a970 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
1a980 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
1a990 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c 20 20  s5Data *pData,  
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a9b0 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74 65 72   Doclist to iter
1a9c0 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  ate through */. 
1a9d0 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20   int bDesc,     
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64 65 73   /* True for des
1aa00 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
1aa10 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49 74 65  der */.  Fts5Ite
1aa20 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20  r **ppOut       
1aa30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1aa40 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
1aa50 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20  ts5Iter *pNew;. 
1aa60 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74   pNew = fts5Mult
1aa70 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 32 29  iIterAlloc(p, 2)
1aa80 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
1aa90 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1aaa0 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
1aab0 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20 70 49  aSeg[1];..    pI
1aac0 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53  ter->flags = FTS
1aad0 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
1aae0 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  M;.    if( pData
1aaf0 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a 20 20  ->szLeaf>0 ){.  
1ab00 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
1ab10 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
1ab20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
1ab30 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
1ab40 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28 75 36  nt(pData->p, (u6
1ab50 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
1ab60 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  d);.      pIter-
1ab70 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
1ab80 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20 20 20   pData->nn;.    
1ab90 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31    pNew->aFirst[1
1aba0 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  ].iFirst = 1;.  
1abb0 20 20 20 20 69 66 28 20 62 44 65 73 63 20 29 7b      if( bDesc ){
1abc0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 62  .        pNew->b
1abd0 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Rev = 1;.       
1abe0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
1abf0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
1ac00 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 66  VERSE;.        f
1ac10 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
1ac20 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
1ac30 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
1ac40 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
1ac50 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
1ac60 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
1ac70 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30  .      pData = 0
1ac80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ac90 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45     pNew->base.bE
1aca0 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
1acb0 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74    fts5SegIterSet
1acc0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
1acd0 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e  .    *ppOut = pN
1ace0 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  ew;.  }..  fts5D
1acf0 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
1ad00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1ad10 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
1ad20 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
1ad30 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  F or if an error
1ad40 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
1ad50 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  ** False otherwi
1ad60 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1ad70 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  t fts5MultiIterE
1ad80 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
1ad90 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
1ada0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
1adb0 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 49  rc .      || (pI
1adc0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
1add0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1ade0 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d  st ].pLeaf==0)==
1adf0 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66  pIter->base.bEof
1ae00 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20   .  );.  return 
1ae10 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
1ae20 3e 62 61 73 65 2e 62 45 6f 66 29 3b 0a 7d 0a 0a  >base.bEof);.}..
1ae30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ae40 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e   rowid of the en
1ae50 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65  try that the ite
1ae60 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  rator currently 
1ae70 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66  points.** to. If
1ae80 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
1ae90 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e  ints to EOF when
1aea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1aeb0 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20  s called the.** 
1aec0 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65  results are unde
1aed0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
1aee0 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74   i64 fts5MultiIt
1aef0 65 72 52 6f 77 69 64 28 46 74 73 35 49 74 65 72  erRowid(Fts5Iter
1af00 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
1af10 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  rt( pIter->aSeg[
1af20 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
1af30 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
1af40 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74   );.  return pIt
1af50 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
1af60 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
1af70 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  t ].iRowid;.}../
1af80 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
1af90 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
1afa0 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66  xt entry at or f
1afb0 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e  ollowing iMatch.
1afc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1afd0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
1afe0 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
1aff0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74  ex *p, .  Fts5It
1b000 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36  er *pIter, .  i6
1b010 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68  4 iMatch.){.  wh
1b020 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
1b030 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74  4 iRowid;.    ft
1b040 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
1b050 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61  p, pIter, 1, iMa
1b060 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74  tch);.    if( ft
1b070 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
1b080 2c 20 70 49 74 65 72 29 20 29 20 62 72 65 61 6b  , pIter) ) break
1b090 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66  ;.    iRowid = f
1b0a0 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
1b0b0 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  d(pIter);.    if
1b0c0 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30  ( pIter->bRev==0
1b0d0 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74   && iRowid>=iMat
1b0e0 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
1b0f0 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21  if( pIter->bRev!
1b100 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d  =0 && iRowid<=iM
1b110 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
1b120 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1b130 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1b140 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1b150 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f  ng the term asso
1b160 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1b170 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74  .** entry that t
1b180 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
1b190 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1b1a0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1b1b0 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74   u8 *fts5MultiIt
1b1c0 65 72 54 65 72 6d 28 46 74 73 35 49 74 65 72 20  erTerm(Fts5Iter 
1b1d0 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
1b1e0 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
1b1f0 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  *p = &pIter->aSe
1b200 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1b210 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
1b220 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b  *pn = p->term.n;
1b230 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72  .  return p->ter
1b240 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  m.p;.}../*.** Al
1b250 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67  locate a new seg
1b260 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20  ment-id for the 
1b270 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
1b280 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65  t. The new segme
1b290 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62 65  nt.** id must be
1b2a0 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 36   between 1 and 6
1b2b0 35 33 33 35 20 69 6e 63 6c 75 73 69 76 65 2c 20  5335 inclusive, 
1b2c0 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  and must not be 
1b2d0 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20  used by .** any 
1b2e0 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 69  currently existi
1b2f0 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 61  ng segment. If a
1b300 20 66 72 65 65 20 73 65 67 6d 65 6e 74 20 69 64   free segment id
1b310 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
1b320 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
1b330 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1b340 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1b350 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
1b360 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
1b370 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1b380 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  0 is .** returne
1b390 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
1b3a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1b3b0 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
1b3c0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1b3d0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1b3e0 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 53 65  ruct){.  int iSe
1b3f0 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  gid = 0;..  if( 
1b400 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1b410 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72   ){.    if( pStr
1b420 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46  uct->nSegment>=F
1b430 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20  TS5_MAX_SEGMENT 
1b440 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1b450 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1b460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1b470 2a 20 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45  * FTS5_MAX_SEGME
1b480 4e 54 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  NT is currently 
1b490 64 65 66 69 6e 65 64 20 61 73 20 32 30 30 30 2e  defined as 2000.
1b4a0 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   So the followin
1b4b0 67 0a 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79  g.      ** array
1b4c0 20 69 73 20 36 33 20 65 6c 65 6d 65 6e 74 73 2c   is 63 elements,
1b4d0 20 6f 72 20 32 35 32 20 62 79 74 65 73 2c 20 69   or 252 bytes, i
1b4e0 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20  n size.  */.    
1b4f0 20 20 75 33 32 20 61 55 73 65 64 5b 28 46 54 53    u32 aUsed[(FTS
1b500 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 2b 33 31  5_MAX_SEGMENT+31
1b510 29 20 2f 20 33 32 5d 3b 0a 20 20 20 20 20 20 69  ) / 32];.      i
1b520 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
1b530 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1b540 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20    u32 mask;.    
1b550 20 20 6d 65 6d 73 65 74 28 61 55 73 65 64 2c 20    memset(aUsed, 
1b560 30 2c 20 73 69 7a 65 6f 66 28 61 55 73 65 64 29  0, sizeof(aUsed)
1b570 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76  );.      for(iLv
1b580 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
1b590 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
1b5a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +){.        for(
1b5b0 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74  iSeg=0; iSeg<pSt
1b5c0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b5d0 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l].nSeg; iSeg++)
1b5e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1b5f0 69 49 64 20 3d 20 70 53 74 72 75 63 74 2d 3e 61  iId = pStruct->a
1b600 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
1b610 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 3b 0a 20  [iSeg].iSegid;. 
1b620 20 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64           if( iId
1b630 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45  <=FTS5_MAX_SEGME
1b640 4e 54 20 26 26 20 69 49 64 3e 30 20 29 7b 0a 20  NT && iId>0 ){. 
1b650 20 20 20 20 20 20 20 20 20 20 20 61 55 73 65 64             aUsed
1b660 5b 28 69 49 64 2d 31 29 20 2f 20 33 32 5d 20 7c  [(iId-1) / 32] |
1b670 3d 20 28 75 33 32 29 31 20 3c 3c 20 28 28 69 49  = (u32)1 << ((iI
1b680 64 2d 31 29 20 25 20 33 32 29 3b 0a 20 20 20 20  d-1) % 32);.    
1b690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b6a0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
1b6b0 20 66 6f 72 28 69 3d 30 3b 20 61 55 73 65 64 5b   for(i=0; aUsed[
1b6c0 69 5d 3d 3d 30 78 46 46 46 46 46 46 46 46 3b 20  i]==0xFFFFFFFF; 
1b6d0 69 2b 2b 29 3b 0a 20 20 20 20 20 20 6d 61 73 6b  i++);.      mask
1b6e0 20 3d 20 61 55 73 65 64 5b 69 5d 3b 0a 20 20 20   = aUsed[i];.   
1b6f0 20 20 20 66 6f 72 28 69 53 65 67 69 64 3d 30 3b     for(iSegid=0;
1b700 20 6d 61 73 6b 20 26 20 28 28 75 33 32 29 31 20   mask & ((u32)1 
1b710 3c 3c 20 69 53 65 67 69 64 29 3b 20 69 53 65 67  << iSegid); iSeg
1b720 69 64 2b 2b 29 3b 0a 20 20 20 20 20 20 69 53 65  id++);.      iSe
1b730 67 69 64 20 2b 3d 20 31 20 2b 20 69 2a 33 32 3b  gid += 1 + i*32;
1b740 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1b750 44 45 42 55 47 0a 20 20 20 20 20 20 66 6f 72 28  DEBUG.      for(
1b760 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
1b770 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
1b780 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  vl++){.        f
1b790 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
1b7a0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1b7b0 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
1b7c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
1b7d0 73 73 65 72 74 5f 6e 63 28 20 69 53 65 67 69 64  ssert_nc( iSegid
1b7e0 21 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  !=pStruct->aLeve
1b7f0 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
1b800 67 5d 2e 69 53 65 67 69 64 20 29 3b 0a 20 20 20  g].iSegid );.   
1b810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b820 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
1b830 69 53 65 67 69 64 3e 30 20 26 26 20 69 53 65 67  iSegid>0 && iSeg
1b840 69 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47  id<=FTS5_MAX_SEG
1b850 4d 45 4e 54 20 29 3b 0a 0a 20 20 20 20 20 20 7b  MENT );..      {
1b860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b870 5f 73 74 6d 74 20 2a 70 49 64 78 53 65 6c 65 63  _stmt *pIdxSelec
1b880 74 20 3d 20 66 74 73 35 49 64 78 53 65 6c 65 63  t = fts5IdxSelec
1b890 74 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20  tStmt(p);.      
1b8a0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1b8b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b8c0 20 20 20 20 75 38 20 61 42 6c 6f 62 5b 32 5d 20      u8 aBlob[2] 
1b8d0 3d 20 7b 30 78 66 66 2c 20 30 78 66 66 7d 3b 0a  = {0xff, 0xff};.
1b8e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b8f0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78 53  3_bind_int(pIdxS
1b900 65 6c 65 63 74 2c 20 31 2c 20 69 53 65 67 69 64  elect, 1, iSegid
1b910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1b920 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
1b930 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 61 42  IdxSelect, 2, aB
1b940 6c 6f 62 2c 20 32 2c 20 53 51 4c 49 54 45 5f 53  lob, 2, SQLITE_S
1b950 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
1b960 20 20 61 73 73 65 72 74 5f 6e 63 28 20 73 71 6c    assert_nc( sql
1b970 69 74 65 33 5f 73 74 65 70 28 70 49 64 78 53 65  ite3_step(pIdxSe
1b980 6c 65 63 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f  lect)!=SQLITE_RO
1b990 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  W );.          p
1b9a0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
1b9b0 65 73 65 74 28 70 49 64 78 53 65 6c 65 63 74 29  eset(pIdxSelect)
1b9c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1b9d0 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49  te3_bind_null(pI
1b9e0 64 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a 20 20  dxSelect, 2);.  
1b9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ba00 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1ba10 0a 0a 20 20 72 65 74 75 72 6e 20 69 53 65 67 69  ..  return iSegi
1ba20 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  d;.}../*.** Disc
1ba30 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72  ard all data cur
1ba40 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e  rently cached in
1ba50 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73   the hash-tables
1ba60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ba70 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72   fts5IndexDiscar
1ba80 64 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20  dData(Fts5Index 
1ba90 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
1baa0 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50  ->pHash || p->nP
1bab0 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b  endingData==0 );
1bac0 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20  .  if( p->pHash 
1bad0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
1bae0 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70  s5HashClear(p->p
1baf0 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50  Hash);.    p->nP
1bb00 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
1bb10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1bb20 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1bb30 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62  the prefix, in b
1bb40 79 74 65 73 2c 20 74 68 61 74 20 62 75 66 66 65  ytes, that buffe
1bb50 72 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e  r .** (pNew/<len
1bb60 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68  gth-unknown>) sh
1bb70 61 72 65 73 20 77 69 74 68 20 62 75 66 66 65 72  ares with buffer
1bb80 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a   (pOld/nOld)..**
1bb90 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 4e 65 77  .** Buffer (pNew
1bba0 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e  /<length-unknown
1bbb0 3e 29 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  >) is guaranteed
1bbc0 20 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 0a   to be greater .
1bbd0 2a 2a 20 74 68 61 6e 20 62 75 66 66 65 72 20 28  ** than buffer (
1bbe0 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73  pOld/nOld)..*/.s
1bbf0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 72  tatic int fts5Pr
1bc00 65 66 69 78 43 6f 6d 70 72 65 73 73 28 69 6e 74  efixCompress(int
1bc10 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20   nOld, const u8 
1bc20 2a 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20  *pOld, const u8 
1bc30 2a 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20 69 3b  *pNew){.  int i;
1bc40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
1bc50 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ld; i++){.    if
1bc60 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b  ( pOld[i]!=pNew[
1bc70 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  i] ) break;.  }.
1bc80 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73    return i;.}..s
1bc90 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1bca0 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a  riteDlidxClear(.
1bcb0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1bcc0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1bcd0 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74   *pWriter,.  int
1bce0 20 62 46 6c 75 73 68 20 20 20 20 20 20 20 20 20   bFlush         
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd00 49 66 20 74 72 75 65 2c 20 77 72 69 74 65 20 64  If true, write d
1bd10 6c 69 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a  lidx to disk */.
1bd20 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
1bd30 73 65 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20  sert( bFlush==0 
1bd40 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c  || (pWriter->nDl
1bd50 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72  idx>0 && pWriter
1bd60 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1bd70 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  n>0) );.  for(i=
1bd80 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44  0; i<pWriter->nD
1bd90 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lidx; i++){.    
1bda0 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
1bdb0 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74  *pDlidx = &pWrit
1bdc0 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20  er->aDlidx[i];. 
1bdd0 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62     if( pDlidx->b
1bde0 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b  uf.n==0 ) break;
1bdf0 0a 20 20 20 20 69 66 28 20 62 46 6c 75 73 68 20  .    if( bFlush 
1be00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1be10 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30   pDlidx->pgno!=0
1be20 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61   );.      fts5Da
1be30 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20  taWrite(p, .    
1be40 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
1be50 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e  _ROWID(pWriter->
1be60 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64  iSegid, i, pDlid
1be70 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20  x->pgno),.      
1be80 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e      pDlidx->buf.
1be90 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  p, pDlidx->buf.n
1bea0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
1beb0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1bec0 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64  ufferZero(&pDlid
1bed0 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c  x->buf);.    pDl
1bee0 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
1bef0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1bf00 2a 20 47 72 6f 77 20 74 68 65 20 70 57 72 69 74  * Grow the pWrit
1bf10 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72  er->aDlidx[] arr
1bf20 61 79 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e  ay to at least n
1bf30 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  Lvl elements in 
1bf40 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77  size..** Any new
1bf50 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20   array elements 
1bf60 61 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72  are zeroed befor
1bf70 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1bf80 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57  static int fts5W
1bf90 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20  riteDlidxGrow(. 
1bfa0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
1bfb0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1bfc0 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e  pWriter,.  int n
1bfd0 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Lvl.){.  if( p->
1bfe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1bff0 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e   nLvl>=pWriter->
1c000 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74  nDlidx ){.    Ft
1c010 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61  s5DlidxWriter *a
1c020 44 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69  Dlidx = (Fts5Dli
1c030 64 78 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65  dxWriter*)sqlite
1c040 33 5f 72 65 61 6c 6c 6f 63 36 34 28 0a 20 20 20  3_realloc64(.   
1c050 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44       pWriter->aD
1c060 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46 74 73  lidx, sizeof(Fts
1c070 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20  5DlidxWriter) * 
1c080 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  nLvl.    );.    
1c090 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b  if( aDlidx==0 ){
1c0a0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
1c0b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1c0c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1c0d0 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
1c0e0 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
1c0f0 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69  ) * (nLvl - pWri
1c100 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20  ter->nDlidx);.  
1c110 20 20 20 20 6d 65 6d 73 65 74 28 26 61 44 6c 69      memset(&aDli
1c120 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  dx[pWriter->nDli
1c130 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  dx], 0, nByte);.
1c140 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61        pWriter->a
1c150 44 6c 69 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a  Dlidx = aDlidx;.
1c160 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e        pWriter->n
1c170 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20  Dlidx = nLvl;.  
1c180 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c190 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
1c1a0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1c1b0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 63  doclist-index ac
1c1c0 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e 20 70 57  cumulating in pW
1c1d0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20  riter->aDlidx[] 
1c1e0 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  is large.** enou
1c1f0 67 68 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20  gh, flush it to 
1c200 64 69 73 6b 20 61 6e 64 20 72 65 74 75 72 6e 20  disk and return 
1c210 31 2e 20 4f 74 68 65 72 77 69 73 65 20 64 69 73  1. Otherwise dis
1c220 63 61 72 64 20 69 74 20 61 6e 64 20 72 65 74 75  card it and retu
1c230 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rn.** zero..*/.s
1c240 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72  tatic int fts5Wr
1c250 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 46 74  iteFlushDlidx(Ft
1c260 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1c270 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1c280 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67  er){.  int bFlag
1c290 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 0;..  /* If t
1c2a0 68 65 72 65 20 77 65 72 65 20 46 54 53 35 5f 4d  here were FTS5_M
1c2b0 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72  IN_DLIDX_SIZE or
1c2c0 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65 61 66   more empty leaf
1c2d0 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 20   pages written. 
1c2e0 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
1c2f0 61 73 65 2c 20 61 6c 73 6f 20 77 72 69 74 65 20  ase, also write 
1c300 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
1c310 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20  x to disk.  */. 
1c320 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 61 44   if( pWriter->aD
1c330 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20  lidx[0].buf.n>0 
1c340 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  && pWriter->nEmp
1c350 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ty>=FTS5_MIN_DLI
1c360 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 62  DX_SIZE ){.    b
1c370 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Flag = 1;.  }.  
1c380 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c  fts5WriteDlidxCl
1c390 65 61 72 28 70 2c 20 70 57 72 69 74 65 72 2c 20  ear(p, pWriter, 
1c3a0 62 46 6c 61 67 29 3b 0a 20 20 70 57 72 69 74 65  bFlag);.  pWrite
1c3b0 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20  r->nEmpty = 0;. 
1c3c0 20 72 65 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d   return bFlag;.}
1c3d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1c3e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1c3f0 77 68 65 6e 65 76 65 72 20 70 72 6f 63 65 73 73  whenever process
1c400 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  ing of the docli
1c410 73 74 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c  st for the .** l
1c420 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66  ast term on leaf
1c430 20 70 61 67 65 20 28 70 57 72 69 74 65 72 2d 3e   page (pWriter->
1c440 69 42 74 50 61 67 65 29 20 69 73 20 63 6f 6d 70  iBtPage) is comp
1c450 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  leted. .**.** Th
1c460 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
1c470 66 6f 72 20 74 68 61 74 20 74 65 72 6d 20 69 73  for that term is
1c480 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1c490 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68  d in-memory with
1c4a0 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65  in the.** Fts5Se
1c4b0 67 57 72 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d  gWriter.aDlidx[]
1c4c0 20 61 72 72 61 79 2e 20 49 66 20 69 74 20 69 73   array. If it is
1c4d0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20 74   large enough, t
1c4e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1c4f0 77 72 69 74 65 73 20 69 74 20 6f 75 74 20 74 6f  writes it out to
1c500 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74   disk. Or, if it
1c510 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f   is too small to
1c520 20 62 6f 74 68 65 72 20 77 69 74 68 2c 20 64 69   bother with, di
1c530 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a  scards.** it..**
1c540 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74 65  .** Fts5SegWrite
1c550 72 2e 62 74 74 65 72 6d 20 63 75 72 72 65 6e 74  r.btterm current
1c560 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ly contains the 
1c570 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61  first term on pa
1c580 67 65 20 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73  ge iBtPage..*/.s
1c590 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1c5a0 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 46  riteFlushBtree(F
1c5b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
1c5c0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1c5d0 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61  ter){.  int bFla
1c5e0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  g;..  assert( pW
1c5f0 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 7c  riter->iBtPage |
1c600 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74  | pWriter->nEmpt
1c610 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 57  y==0 );.  if( pW
1c620 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d  riter->iBtPage==
1c630 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 62 46  0 ) return;.  bF
1c640 6c 61 67 20 3d 20 66 74 73 35 57 72 69 74 65 46  lag = fts5WriteF
1c650 6c 75 73 68 44 6c 69 64 78 28 70 2c 20 70 57 72  lushDlidx(p, pWr
1c660 69 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d  iter);..  if( p-
1c670 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1c680 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1c690 20 2a 7a 20 3d 20 28 70 57 72 69 74 65 72 2d 3e   *z = (pWriter->
1c6a0 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73  btterm.n>0?(cons
1c6b0 74 20 63 68 61 72 2a 29 70 57 72 69 74 65 72 2d  t char*)pWriter-
1c6c0 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20  >btterm.p:"");. 
1c6d0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
1c6e0 69 6e 67 20 77 61 73 20 61 6c 72 65 61 64 79 20  ing was already 
1c6f0 64 6f 6e 65 20 69 6e 20 66 74 73 35 57 72 69 74  done in fts5Writ
1c700 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20  eInit(): */.    
1c710 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  /* sqlite3_bind_
1c720 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65  int(p->pIdxWrite
1c730 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69  r, 1, pWriter->i
1c740 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73  Segid); */.    s
1c750 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
1c760 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1c770 32 2c 20 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62  2, z, pWriter->b
1c780 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f  tterm.n, SQLITE_
1c790 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
1c7a0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
1c7b0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 33  p->pIdxWriter, 3
1c7c0 2c 20 62 46 6c 61 67 20 2b 20 28 28 69 36 34 29  , bFlag + ((i64)
1c7d0 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1c7e0 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  <<1));.    sqlit
1c7f0 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 57  e3_step(p->pIdxW
1c800 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  riter);.    p->r
1c810 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
1c820 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29  t(p->pIdxWriter)
1c830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
1c840 6e 64 5f 6e 75 6c 6c 28 70 2d 3e 70 49 64 78 57  nd_null(p->pIdxW
1c850 72 69 74 65 72 2c 20 32 29 3b 0a 20 20 7d 0a 20  riter, 2);.  }. 
1c860 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
1c870 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
1c880 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f  This is called o
1c890 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c 65 61  nce for each lea
1c8a0 66 20 70 61 67 65 20 65 78 63 65 70 74 20 74 68  f page except th
1c8b0 65 20 66 69 72 73 74 20 74 68 61 74 20 63 6f 6e  e first that con
1c8c0 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73  tains.** at leas
1c8d0 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67 75  t one term. Argu
1c8e0 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65 72  ment (nTerm/pTer
1c8f0 6d 29 20 69 73 20 74 68 65 20 73 70 6c 69 74 2d  m) is the split-
1c900 6b 65 79 20 2d 20 61 20 74 65 72 6d 20 74 68 61  key - a term tha
1c910 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74  t.** is larger t
1c920 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77 72  han all terms wr
1c930 69 74 74 65 6e 20 74 6f 20 65 61 72 6c 69 65 72  itten to earlier
1c940 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 65 71 75   leaves, and equ
1c950 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c  al to or.** smal
1c960 6c 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72  ler than the fir
1c970 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e  st term on the n
1c980 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49  ew leaf..**.** I
1c990 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1c9a0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1c9b0 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35   is left in Fts5
1c9c0 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61 6e 20  Index.rc. If an 
1c9d0 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72  error.** has alr
1c9e0 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
1c9f0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1ca00 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
1ca10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1ca20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1ca30 69 74 65 42 74 72 65 65 54 65 72 6d 28 0a 20 20  iteBtreeTerm(.  
1ca40 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca60 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1ca70 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
1ca80 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1ca90 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er,         /* W
1caa0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1cab0 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
1cac0 73 74 20 75 38 20 2a 70 54 65 72 6d 20 20 20 20  st u8 *pTerm    
1cad0 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20    /* First term 
1cae0 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29  on new page */.)
1caf0 7b 0a 20 20 66 74 73 35 57 72 69 74 65 46 6c 75  {.  fts5WriteFlu
1cb00 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74  shBtree(p, pWrit
1cb10 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er);.  if( p->rc
1cb20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cb30 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
1cb40 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
1cb50 72 2d 3e 62 74 74 65 72 6d 2c 20 6e 54 65 72 6d  r->btterm, nTerm
1cb60 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 57  , pTerm);.    pW
1cb70 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d  riter->iBtPage =
1cb80 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1cb90 2e 70 67 6e 6f 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .pgno;.  }.}../*
1cba0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1cbb0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
1cbc0 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66   flushing a leaf
1cbd0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1cbe0 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20  ins no.** terms 
1cbf0 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a  at all to disk..
1cc00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1cc10 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
1cc20 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
1cc30 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1cc40 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1cc50 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1cc60 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1cc70 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20   *pWriter       
1cc80 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
1cc90 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49  ect */.){.  /* I
1cca0 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
1ccb0 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65  rowids on the le
1ccc0 61 66 20 70 61 67 65 20 65 69 74 68 65 72 20 61  af page either a
1ccd0 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  nd the doclist-i
1cce0 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c  ndex.  ** has al
1ccf0 72 65 61 64 79 20 62 65 65 6e 20 73 74 61 72 74  ready been start
1cd00 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78  ed, append an 0x
1cd10 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20  00 byte to it.  
1cd20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  */.  if( pWriter
1cd30 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1cd40 61 67 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e  age && pWriter->
1cd50 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e  aDlidx[0].buf.n>
1cd60 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  0 ){.    Fts5Dli
1cd70 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78  dxWriter *pDlidx
1cd80 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
1cd90 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  idx[0];.    asse
1cda0 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65  rt( pDlidx->bPre
1cdb0 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71  vValid );.    sq
1cdc0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1cdd0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1cde0 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
1cdf0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
1ce00 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e  Increment the "n
1ce10 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74  umber of sequent
1ce20 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f  ial leaves witho
1ce30 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74  ut a term" count
1ce40 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72  er. */.  pWriter
1ce50 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73  ->nEmpty++;.}..s
1ce60 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c  tatic i64 fts5Dl
1ce70 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52  idxExtractFirstR
1ce80 6f 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20  owid(Fts5Buffer 
1ce90 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52  *pBuf){.  i64 iR
1cea0 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66  owid;.  int iOff
1ceb0 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20  ;..  iOff = 1 + 
1cec0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
1ced0 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a  Buf->p[1], (u64*
1cee0 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66 74 73  )&iRowid);.  fts
1cef0 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66  5GetVarint(&pBuf
1cf00 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
1cf10 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72 65 74  )&iRowid);.  ret
1cf20 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  urn iRowid;.}../
1cf30 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77 69  *.** Rowid iRowi
1cf40 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  d has just been 
1cf50 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
1cf60 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
1cf70 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20  e. It is the.** 
1cf80 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70 61 67  first on the pag
1cf90 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1cfa0 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70 70 72   appends an appr
1cfb0 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20 74 6f  opriate entry to
1cfc0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1cfd0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
1cfe0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1cff0 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
1d000 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nd(.  Fts5Index 
1d010 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1d020 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
1d030 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a    i64 iRowid.){.
1d040 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62    int i;.  int b
1d050 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  Done = 0;..  for
1d060 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
1d070 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d  ITE_OK && bDone=
1d080 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36  =0; i++){.    i6
1d090 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74 73 35  4 iVal;.    Fts5
1d0a0 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c  DlidxWriter *pDl
1d0b0 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1d0c0 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20  aDlidx[i];..    
1d0d0 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  if( pDlidx->buf.
1d0e0 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
1d0f0 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  gsz ){.      /* 
1d100 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  The current docl
1d110 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69  ist-index page i
1d120 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74  s full. Write it
1d130 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70 75 73   to disk and pus
1d140 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70  h.      ** a cop
1d150 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77 68 69  y of iRowid (whi
1d160 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ch will become t
1d170 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1d180 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  n the next.     
1d190 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65   ** doclist-inde
1d1a0 78 20 6c 65 61 66 20 70 61 67 65 29 20 75 70 20  x leaf page) up 
1d1b0 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 65  into the next le
1d1c0 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72 65  vel of the b-tre
1d1d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69 65 72  e .      ** hier
1d1e0 61 72 63 68 79 2e 20 49 66 20 74 68 65 20 6e 6f  archy. If the no
1d1f0 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65 64  de being flushed
1d200 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68   is currently th
1d210 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20  e root node,.   
1d220 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20     ** also push 
1d230 69 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20  its first rowid 
1d240 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20  upwards. */.    
1d250 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b    pDlidx->buf.p[
1d260 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a  0] = 0x01;    /*
1d270 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f   Not the root no
1d280 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35  de */.      fts5
1d290 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20  DataWrite(p, .  
1d2a0 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
1d2b0 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  DX_ROWID(pWriter
1d2c0 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c  ->iSegid, i, pDl
1d2d0 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20  idx->pgno),.    
1d2e0 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75        pDlidx->bu
1d2f0 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66  f.p, pDlidx->buf
1d300 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .n.      );.    
1d310 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1d320 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c  Grow(p, pWriter,
1d330 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70 44 6c   i+2);.      pDl
1d340 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1d350 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20  aDlidx[i];.     
1d360 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1d370 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b  TE_OK && pDlidx[
1d380 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20  1].buf.n==0 ){. 
1d390 20 20 20 20 20 20 20 69 36 34 20 69 46 69 72 73         i64 iFirs
1d3a0 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45 78 74  t = fts5DlidxExt
1d3b0 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28 26  ractFirstRowid(&
1d3c0 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20  pDlidx->buf);.. 
1d3d0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 77         /* This w
1d3e0 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  as the root node
1d3f0 2e 20 50 75 73 68 20 69 74 73 20 66 69 72 73 74  . Push its first
1d400 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74 68 65   rowid up to the
1d410 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20   new root. */.  
1d420 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e        pDlidx[1].
1d430 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70  pgno = pDlidx->p
1d440 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  gno;.        sql
1d450 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1d460 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1d470 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75  c, &pDlidx[1].bu
1d480 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  f, 0);.        s
1d490 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d4a0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d4b0 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e  >rc, &pDlidx[1].
1d4c0 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e  buf, pDlidx->pgn
1d4d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
1d4e0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1d4f0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d500 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  , &pDlidx[1].buf
1d510 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20  , iFirst);.     
1d520 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72     pDlidx[1].bPr
1d530 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  evValid = 1;.   
1d540 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69       pDlidx[1].i
1d550 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b 0a 20  Prev = iFirst;. 
1d560 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
1d570 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
1d580 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66  ero(&pDlidx->buf
1d590 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  );.      pDlidx-
1d5a0 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b  >bPrevValid = 0;
1d5b0 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 70  .      pDlidx->p
1d5c0 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  gno++;.    }else
1d5d0 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20  {.      bDone = 
1d5e0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
1d5f0 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56  ( pDlidx->bPrevV
1d600 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69 56  alid ){.      iV
1d610 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20 70 44  al = iRowid - pD
1d620 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20  lidx->iPrev;.   
1d630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
1d640 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20  4 iPgno = (i==0 
1d650 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  ? pWriter->write
1d660 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b  r.pgno : pDlidx[
1d670 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  -1].pgno);.     
1d680 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
1d690 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  >buf.n==0 );.   
1d6a0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d6b0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1d6c0 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1d6d0 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a  ->buf, !bDone);.
1d6e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1d6f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d700 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
1d710 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29  idx->buf, iPgno)
1d720 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69  ;.      iVal = i
1d730 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  Rowid;.    }..  
1d740 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d750 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d760 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
1d770 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20  >buf, iVal);.   
1d780 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
1d790 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c  lid = 1;.    pDl
1d7a0 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f  idx->iPrev = iRo
1d7b0 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  wid;.  }.}..stat
1d7c0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1d7d0 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49  eFlushLeaf(Fts5I
1d7e0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
1d7f0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
1d800 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1d810 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30   u8 zero[] = { 0
1d820 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
1d830 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50   0x00 };.  Fts5P
1d840 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
1d850 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1d860 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  ter;.  i64 iRowi
1d870 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  d;..  assert( (p
1d880 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30  Page->pgidx.n==0
1d890 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62 46 69  )==(pWriter->bFi
1d8a0 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29 20 29  rstTermInPage) )
1d8b0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1d8c0 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69  szLeaf header fi
1d8d0 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  eld. */.  assert
1d8e0 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36 28  ( 0==fts5GetU16(
1d8f0 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d  &pPage->buf.p[2]
1d900 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74 55 31  ) );.  fts5PutU1
1d910 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
1d920 32 5d 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e  2], (u16)pPage->
1d930 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70  buf.n);..  if( p
1d940 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1d950 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  rmInPage ){.    
1d960 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77  /* No term was w
1d970 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70  ritten to this p
1d980 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
1d990 72 74 28 20 70 50 61 67 65 2d 3e 70 67 69 64 78  rt( pPage->pgidx
1d9a0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73  .n==0 );.    fts
1d9b0 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72  5WriteBtreeNoTer
1d9c0 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  m(p, pWriter);. 
1d9d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
1d9e0 70 70 65 6e 64 20 74 68 65 20 70 67 69 64 78 20  ppend the pgidx 
1d9f0 74 6f 20 74 68 65 20 70 61 67 65 20 62 75 66 66  to the page buff
1da00 65 72 2e 20 53 65 74 20 74 68 65 20 73 7a 4c 65  er. Set the szLe
1da10 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e  af header field.
1da20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66   */.    fts5Buff
1da30 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1da40 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1da50 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  , pPage->pgidx.n
1da60 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 70  , pPage->pgidx.p
1da70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  );.  }..  /* Wri
1da80 74 65 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  te the page out 
1da90 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f  to disk */.  iRo
1daa0 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
1dab0 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
1dac0 2d 3e 69 53 65 67 69 64 2c 20 70 50 61 67 65 2d  ->iSegid, pPage-
1dad0 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61  >pgno);.  fts5Da
1dae0 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69  taWrite(p, iRowi
1daf0 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c  d, pPage->buf.p,
1db00 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a   pPage->buf.n);.
1db10 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1db20 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20   the next page. 
1db30 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a  */.  fts5BufferZ
1db40 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29  ero(&pPage->buf)
1db50 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  ;.  fts5BufferZe
1db60 72 6f 28 26 70 50 61 67 65 2d 3e 70 67 69 64 78  ro(&pPage->pgidx
1db70 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
1db80 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1db90 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34  , &pPage->buf, 4
1dba0 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67 65  , zero);.  pPage
1dbb0 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 30  ->iPrevPgidx = 0
1dbc0 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b  ;.  pPage->pgno+
1dbd0 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73  +;..  /* Increas
1dbe0 65 20 74 68 65 20 6c 65 61 76 65 73 20 77 72 69  e the leaves wri
1dbf0 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  tten counter */.
1dc00 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66    pWriter->nLeaf
1dc10 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a  Written++;..  /*
1dc20 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20 68 6f   The new leaf ho
1dc30 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20  lds no terms or 
1dc40 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57 72 69  rowids */.  pWri
1dc50 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1dc60 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72  nPage = 1;.  pWr
1dc70 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1dc80 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a  dInPage = 1;.}..
1dc90 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 72  /*.** Append ter
1dca0 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f  m pTerm/nTerm to
1dcb0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69   the segment bei
1dcc0 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20 74 68  ng written by th
1dcd0 65 20 77 72 69 74 65 72 20 70 61 73 73 65 64 0a  e writer passed.
1dce0 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
1dcf0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
1dd00 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1dd10 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
1dd20 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
1dd30 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
1dd40 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
1dd50 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1dd60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1dd70 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1dd80 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1dd90 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73 35  pendTerm(.  Fts5
1dda0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1ddb0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1ddc0 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d  ter,.  int nTerm
1ddd0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
1dde0 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65  m .){.  int nPre
1ddf0 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
1de00 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
1de10 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72   of prefix compr
1de20 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20  ession for term 
1de30 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  */.  Fts5PageWri
1de40 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
1de50 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1de60 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67   Fts5Buffer *pPg
1de70 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1de80 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 20 20  writer.pgidx;.  
1de90 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70  int nMin = MIN(p
1dea0 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 6e 54  Page->term.n, nT
1deb0 65 72 6d 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  erm);..  assert(
1dec0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ded0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
1dee0 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 34 20 29  Page->buf.n>=4 )
1def0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1df00 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c 20 70 57  e->buf.n>4 || pW
1df10 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1df20 6d 49 6e 50 61 67 65 20 29 3b 0a 0a 20 20 2f 2a  mInPage );..  /*
1df30 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1df40 6c 65 61 66 20 70 61 67 65 20 69 73 20 66 75 6c  leaf page is ful
1df50 6c 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64  l, flush it to d
1df60 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 28 70  isk. */.  if( (p
1df70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50  Page->buf.n + pP
1df80 67 69 64 78 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20  gidx->n + nTerm 
1df90 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  + 2)>=p->pConfig
1dfa0 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 66  ->pgsz ){.    if
1dfb0 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34  ( pPage->buf.n>4
1dfc0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72   ){.      fts5Wr
1dfd0 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
1dfe0 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  pWriter);.      
1dff0 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
1e000 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 20  E_OK ) return;. 
1e010 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66     }.    fts5Buf
1e020 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
1e030 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
1e040 72 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50 41 44  rm+FTS5_DATA_PAD
1e050 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  DING);.  }.  .  
1e060 2f 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61 74 69  /* TODO1: Updati
1e070 6e 67 20 70 67 69 64 78 20 68 65 72 65 2e 20 2a  ng pgidx here. *
1e080 2f 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d  /.  pPgidx->n +=
1e090 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
1e0a0 61 72 69 6e 74 28 0a 20 20 20 20 20 20 26 70 50  arint(.      &pP
1e0b0 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e  gidx->p[pPgidx->
1e0c0 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  n], pPage->buf.n
1e0d0 20 2d 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50   - pPage->iPrevP
1e0e0 67 69 64 78 0a 20 20 29 3b 0a 20 20 70 50 61 67  gidx.  );.  pPag
1e0f0 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20  e->iPrevPgidx = 
1e100 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69  pPage->buf.n;.#i
1e110 66 20 30 0a 20 20 66 74 73 35 50 75 74 55 31 36  f 0.  fts5PutU16
1e120 28 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69  (&pPgidx->p[pPgi
1e130 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62  dx->n], pPage->b
1e140 75 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d  uf.n);.  pPgidx-
1e150 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a  >n += 2;.#endif.
1e160 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
1e170 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1e180 20 29 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20   ){.    nPrefix 
1e190 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
1e1a0 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20  ge->pgno!=1 ){. 
1e1b0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
1e1c0 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
1e1d0 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20 69 73  n a leaf that is
1e1e0 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73   not the leftmos
1e1f0 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20  t leaf in.      
1e200 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  ** the segment b
1e210 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -tree. In this c
1e220 61 73 65 20 69 74 20 69 73 20 6e 65 63 65 73 73  ase it is necess
1e230 61 72 79 20 74 6f 20 61 64 64 20 61 20 74 65 72  ary to add a ter
1e240 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  m to.      ** th
1e250 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  e b-tree hierarc
1e260 68 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6c  hy that is (a) l
1e270 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  arger than the l
1e280 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20  argest term .   
1e290 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72     ** already wr
1e2a0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67  itten to the seg
1e2b0 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61  ment and (b) sma
1e2c0 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ller than or equ
1e2d0 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  al to.      ** t
1e2e0 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68  his term. In oth
1e2f0 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66  er words, a pref
1e300 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65  ix of (pTerm/nTe
1e310 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a  rm) that is one.
1e320 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f        ** byte lo
1e330 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f  nger than the lo
1e340 6e 67 65 73 74 20 70 72 65 66 69 78 20 28 70 54  ngest prefix (pT
1e350 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65  erm/nTerm) share
1e360 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20  s with the.     
1e370 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72   ** previous ter
1e380 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  m. .      **.   
1e390 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74     ** Usually, t
1e3a0 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  he previous term
1e3b0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
1e3c0 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68   pPage->term. Th
1e3d0 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20  e exception.    
1e3e0 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20    ** is if this 
1e3f0 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
1e400 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20  m written in an 
1e410 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67  incremental-merg
1e420 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a  e step..      **
1e430 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1e440 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  e previous term 
1e450 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
1e460 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20  , so just write 
1e470 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
1e480 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  of (pTerm/nTerm)
1e490 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
1e4a0 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73   node. This is s
1e4b0 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a  lightly.      **
1e4c0 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75   inefficient, bu
1e4d0 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e  t still correct.
1e4e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
1e4f0 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20   = nTerm;.      
1e500 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e  if( pPage->term.
1e510 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d  n ){.        n =
1e520 20 31 20 2b 20 66 74 73 35 50 72 65 66 69 78 43   1 + fts5PrefixC
1e530 6f 6d 70 72 65 73 73 28 6e 4d 69 6e 2c 20 70 50  ompress(nMin, pP
1e540 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65  age->term.p, pTe
1e550 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
1e560 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65     fts5WriteBtre
1e570 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72  eTerm(p, pWriter
1e580 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  , n, pTerm);.   
1e590 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
1e5a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1e5b0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1e5c0 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1e5d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1e5e0 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66  .    nPrefix = f
1e5f0 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
1e600 73 28 6e 4d 69 6e 2c 20 70 50 61 67 65 2d 3e 74  s(nMin, pPage->t
1e610 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20  erm.p, pTerm);. 
1e620 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1e630 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1e640 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1e650 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20  Prefix);.  }..  
1e660 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75  /* Append the nu
1e670 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1e680 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20   new data, then 
1e690 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74  the term data it
1e6a0 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65  self.  ** to the
1e6b0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
1e6c0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1e6d0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1e6e0 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
1e6f0 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35  nPrefix);.  fts5
1e700 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1e710 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1e720 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50  >buf, nTerm - nP
1e730 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50  refix, &pTerm[nP
1e740 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55  refix]);..  /* U
1e750 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61  pdate the Fts5Pa
1e760 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69  geWriter.term fi
1e770 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  eld. */.  fts5Bu
1e780 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1e790 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54  &pPage->term, nT
1e7a0 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70  erm, pTerm);.  p
1e7b0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1e7c0 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20  rmInPage = 0;.. 
1e7d0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1e7e0 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
1e7f0 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1e800 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
1e810 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
1e820 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74   p->rc || (pWrit
1e830 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20  er->nDlidx>0 && 
1e840 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1e850 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a  0].buf.n==0) );.
1e860 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
1e870 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67  x[0].pgno = pPag
1e880 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  e->pgno;.}../*.*
1e890 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69 64  * Append a rowid
1e8a0 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   and position-li
1e8b0 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f  st size field to
1e8c0 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74   the writers out
1e8d0 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  put. .*/.static 
1e8e0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1e8f0 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73  pendRowid(.  Fts
1e900 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1e910 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1e920 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77  iter,.  i64 iRow
1e930 69 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  id.){.  if( p->r
1e940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e950 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
1e960 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
1e970 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20  iter->writer;.. 
1e980 20 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62     if( (pPage->b
1e990 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67  uf.n + pPage->pg
1e9a0 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66  idx.n)>=p->pConf
1e9b0 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
1e9c0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1e9d0 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1e9e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e9f0 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65  If this is to be
1ea00 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
1ea10 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1ea20 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20  page, set the . 
1ea30 20 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e     ** rowid-poin
1ea40 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d  ter in the page-
1ea50 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70  header. Also app
1ea60 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74  end a value to t
1ea70 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20  he dlidx.    ** 
1ea80 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20  buffer, in case 
1ea90 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
1eaa0 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  is required.  */
1eab0 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
1eac0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1ead0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73  age ){.      fts
1eae0 35 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62  5PutU16(pPage->b
1eaf0 75 66 2e 70 2c 20 28 75 31 36 29 70 50 61 67 65  uf.p, (u16)pPage
1eb00 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  ->buf.n);.      
1eb10 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
1eb20 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c  pend(p, pWriter,
1eb30 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a   iRowid);.    }.
1eb40 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
1eb50 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20  e rowid. */.    
1eb60 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1eb70 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
1eb80 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  t || pWriter->bF
1eb90 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1eba0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
1ebb0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1ebc0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1ebd0 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  buf, iRowid);.  
1ebe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1ebf0 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 72 63 20  ssert_nc( p->rc 
1ec00 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72 69 74 65  || iRowid>pWrite
1ec10 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b  r->iPrevRowid );
1ec20 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1ec30 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1ec40 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1ec50 66 2c 20 69 52 6f 77 69 64 20 2d 20 70 57 72 69  f, iRowid - pWri
1ec60 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 29  ter->iPrevRowid)
1ec70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 72 69  ;.    }.    pWri
1ec80 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20  ter->iPrevRowid 
1ec90 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 70 57  = iRowid;.    pW
1eca0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1ecb0 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b  idInDoclist = 0;
1ecc0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46  .    pWriter->bF
1ecd0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1ece0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 0;.  }.}..stat
1ecf0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1ed00 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
1ed10 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ta(.  Fts5Index 
1ed20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1ed30 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
1ed40 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74    const u8 *aDat
1ed50 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a  a, .  int nData.
1ed60 29 7b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  ){.  Fts5PageWri
1ed70 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
1ed80 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1ed90 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61   const u8 *a = a
1eda0 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Data;.  int n = 
1edb0 6e 44 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65  nData;.  .  asse
1edc0 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  rt( p->pConfig->
1edd0 70 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c  pgsz>0 );.  whil
1ede0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1edf0 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 28 70 50  _OK .     && (pP
1ee00 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61  age->buf.n + pPa
1ee10 67 65 2d 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29  ge->pgidx.n + n)
1ee20 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  >=p->pConfig->pg
1ee30 73 7a 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  sz .  ){.    int
1ee40 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66   nReq = p->pConf
1ee50 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65  ig->pgsz - pPage
1ee60 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d  ->buf.n - pPage-
1ee70 3e 70 67 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e  >pgidx.n;.    in
1ee80 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20  t nCopy = 0;.   
1ee90 20 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52   while( nCopy<nR
1eea0 65 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  eq ){.      i64 
1eeb0 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f  dummy;.      nCo
1eec0 70 79 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  py += fts5GetVar
1eed0 69 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28  int(&a[nCopy], (
1eee0 75 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20  u64*)&dummy);.  
1eef0 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
1ef00 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1ef10 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1ef20 2c 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20  , nCopy, a);.   
1ef30 20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20   a += nCopy;.   
1ef40 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20   n -= nCopy;.   
1ef50 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1ef60 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1ef70 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
1ef80 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
1ef90 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1efa0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1efb0 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  n, a);.  }.}../*
1efc0 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61  .** Flush any da
1efd0 74 61 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ta cached by the
1efe0 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74   writer object t
1eff0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
1f000 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f  Free any.** allo
1f010 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  cations associat
1f020 65 64 20 77 69 74 68 20 74 68 65 20 77 72 69 74  ed with the writ
1f030 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1f040 69 64 20 66 74 73 35 57 72 69 74 65 46 69 6e 69  id fts5WriteFini
1f050 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  sh(.  Fts5Index 
1f060 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1f070 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20  iter *pWriter,  
1f080 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1f090 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1f0a0 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20   *pnLeaf        
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f0c0 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c  OUT: Number of l
1f0d0 65 61 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74  eaf pages in b-t
1f0e0 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ree */.){.  int 
1f0f0 69 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  i;.  Fts5PageWri
1f100 74 65 72 20 2a 70 4c 65 61 66 20 3d 20 26 70 57  ter *pLeaf = &pW
1f110 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1f120 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1f130 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1f140 65 72 74 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f  ert( pLeaf->pgno
1f150 3e 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=1 );.    if( p
1f160 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b  Leaf->buf.n>4 ){
1f170 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1f180 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1f190 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  iter);.    }.   
1f1a0 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66   *pnLeaf = pLeaf
1f1b0 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 69 66  ->pgno-1;.    if
1f1c0 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 31 20  ( pLeaf->pgno>1 
1f1d0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
1f1e0 74 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20  teFlushBtree(p, 
1f1f0 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a  pWriter);.    }.
1f200 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1f210 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 74 65 72  Free(&pLeaf->ter
1f220 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  m);.  fts5Buffer
1f230 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 62 75 66  Free(&pLeaf->buf
1f240 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
1f250 72 65 65 28 26 70 4c 65 61 66 2d 3e 70 67 69 64  ree(&pLeaf->pgid
1f260 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  x);.  fts5Buffer
1f270 46 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 62  Free(&pWriter->b
1f280 74 74 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69  tterm);..  for(i
1f290 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e  =0; i<pWriter->n
1f2a0 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  Dlidx; i++){.   
1f2b0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1f2c0 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d  erFree(&pWriter-
1f2d0 3e 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66 29 3b  >aDlidx[i].buf);
1f2e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1f2f0 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44 6c  ree(pWriter->aDl
1f300 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  idx);.}..static 
1f310 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e  void fts5WriteIn
1f320 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
1f330 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1f340 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
1f350 20 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a    int iSegid.){.
1f360 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66    const int nBuf
1f370 66 65 72 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fer = p->pConfig
1f380 2d 3e 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41  ->pgsz + FTS5_DA
1f390 54 41 5f 50 41 44 44 49 4e 47 3b 0a 0a 20 20 6d  TA_PADDING;..  m
1f3a0 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30  emset(pWriter, 0
1f3b0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
1f3c0 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69  Writer));.  pWri
1f3d0 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  ter->iSegid = iS
1f3e0 65 67 69 64 3b 0a 0a 20 20 66 74 73 35 57 72 69  egid;..  fts5Wri
1f3f0 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70  teDlidxGrow(p, p
1f400 57 72 69 74 65 72 2c 20 31 29 3b 0a 20 20 70 57  Writer, 1);.  pW
1f410 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67  riter->writer.pg
1f420 6e 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65  no = 1;.  pWrite
1f430 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1f440 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  age = 1;.  pWrit
1f450 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 31 3b  er->iBtPage = 1;
1f460 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69  ..  assert( pWri
1f470 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e  ter->writer.buf.
1f480 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
1f490 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  ( pWriter->write
1f4a0 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a  r.pgidx.n==0 );.
1f4b0 0a 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 74  .  /* Grow the t
1f4c0 77 6f 20 62 75 66 66 65 72 73 20 74 6f 20 70 67  wo buffers to pg
1f4d0 73 7a 20 2b 20 70 61 64 64 69 6e 67 20 62 79 74  sz + padding byt
1f4e0 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20  es in size. */. 
1f4f0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1f500 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
1f510 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1f520 70 67 69 64 78 2c 20 6e 42 75 66 66 65 72 29 3b  pgidx, nBuffer);
1f530 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  .  sqlite3Fts5Bu
1f540 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
1f550 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1f560 72 2e 62 75 66 2c 20 6e 42 75 66 66 65 72 29 3b  r.buf, nBuffer);
1f570 0a 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 57  ..  if( p->pIdxW
1f580 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  riter==0 ){.    
1f590 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1f5a0 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
1f5b0 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50  ;.    fts5IndexP
1f5c0 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70  repareStmt(p, &p
1f5d0 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 73 71  ->pIdxWriter, sq
1f5e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
1f5f0 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
1f600 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 69   INTO '%q'.'%q_i
1f610 64 78 27 28 73 65 67 69 64 2c 74 65 72 6d 2c 70  dx'(segid,term,p
1f620 67 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c  gno) VALUES(?,?,
1f630 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ?)", .          
1f640 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
1f650 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
1f660 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   ));.  }..  if( 
1f670 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1f680 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69   ){.    /* Initi
1f690 61 6c 69 7a 65 20 74 68 65 20 34 2d 62 79 74 65  alize the 4-byte
1f6a0 20 6c 65 61 66 2d 70 61 67 65 20 68 65 61 64 65   leaf-page heade
1f6b0 72 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a 20 20  r to 0x00. */.  
1f6c0 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72    memset(pWriter
1f6d0 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 70 2c 20  ->writer.buf.p, 
1f6e0 30 2c 20 34 29 3b 0a 20 20 20 20 70 57 72 69 74  0, 4);.    pWrit
1f6f0 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e  er->writer.buf.n
1f700 20 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20 42 69   = 4;..    /* Bi
1f710 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  nd the current o
1f720 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 64  utput segment id
1f730 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2d 77 72   to the index-wr
1f740 69 74 65 72 2e 20 54 68 69 73 20 69 73 20 61 6e  iter. This is an
1f750 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61  .    ** optimiza
1f760 74 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64 69 6e  tion over bindin
1f770 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  g the same value
1f780 20 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 20 61   over and over a
1f790 73 20 72 6f 77 73 20 61 72 65 0a 20 20 20 20 2a  s rows are.    *
1f7a0 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
1f7b0 25 5f 69 64 78 20 62 79 20 74 68 65 20 63 75 72  %_idx by the cur
1f7c0 72 65 6e 74 20 77 72 69 74 65 72 2e 20 20 2a 2f  rent writer.  */
1f7d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
1f7e0 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69  d_int(p->pIdxWri
1f7f0 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d  ter, 1, pWriter-
1f800 3e 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a  >iSegid);.  }.}.
1f810 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
1f820 70 49 74 65 72 20 77 61 73 20 75 73 65 64 20 74  pIter was used t
1f830 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1f840 68 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d  h the input segm
1f850 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a  ents of on an.**
1f860 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
1f870 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  ge operation. Th
1f880 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1f890 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e 63  alled if the inc
1f8a0 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67  remental.** merg
1f8b0 65 20 73 74 65 70 20 68 61 73 20 66 69 6e 69 73  e step has finis
1f8c0 68 65 64 20 62 75 74 20 74 68 65 20 69 6e 70 75  hed but the inpu
1f8d0 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63  t has not been c
1f8e0 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75 73  ompletely exhaus
1f8f0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
1f900 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65 67 6d  oid fts5TrimSegm
1f910 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ents(Fts5Index *
1f920 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  p, Fts5Iter *pIt
1f930 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
1f940 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a  Fts5Buffer buf;.
1f950 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
1f960 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1f970 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  fer));.  for(i=0
1f980 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20  ; i<pIter->nSeg 
1f990 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
1f9a0 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  _OK; i++){.    F
1f9b0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1f9c0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
1f9d0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67  i];.    if( pSeg
1f9e0 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pSeg==0 ){.   
1f9f0 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
1fa00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
1fa10 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  g->pLeaf==0 ){. 
1fa20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73       /* All keys
1fa30 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74   from this input
1fa40 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62 65   segment have be
1fa50 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f  en transfered to
1fa60 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20   the output..   
1fa70 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20 74     ** Set both t
1fa80 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73  he first and las
1fa90 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 74  t page-numbers t
1faa0 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20  o 0 to indicate 
1fab0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
1fac0 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77  * segment is now
1fad0 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
1fae0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1faf0 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  oLast = 0;.     
1fb00 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1fb10 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20  oFirst = 0;.    
1fb20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1fb30 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54   iOff = pSeg->iT
1fb40 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ermLeafOffset;  
1fb50 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20     /* Offset on 
1fb60 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66 20 70  new first leaf p
1fb70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  age */.      i64
1fb80 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20   iLeafRowid;.   
1fb90 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61     Fts5Data *pDa
1fba0 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ta;.      int iI
1fbb0 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e  d = pSeg->pSeg->
1fbc0 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38  iSegid;.      u8
1fbd0 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30   aHdr[4] = {0x00
1fbe0 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1fbf0 30 30 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61  00};..      iLea
1fc00 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  fRowid = FTS5_SE
1fc10 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c  GMENT_ROWID(iId,
1fc20 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1fc30 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61  Pgno);.      pDa
1fc40 74 61 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61  ta = fts5LeafRea
1fc50 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29  d(p, iLeafRowid)
1fc60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
1fc70 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  a ){.        if(
1fc80 20 69 4f 66 66 3e 70 44 61 74 61 2d 3e 73 7a 4c   iOff>pData->szL
1fc90 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1fca0 20 2f 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63   /* This can occ
1fcb0 75 72 20 69 66 20 74 68 65 20 70 61 67 65 73 20  ur if the pages 
1fcc0 74 68 61 74 20 74 68 65 20 73 65 67 6d 65 6e 74  that the segment
1fcd0 73 20 6f 63 63 75 70 79 20 6f 76 65 72 6c 61 70  s occupy overlap
1fce0 20 2d 20 69 66 0a 20 20 20 20 20 20 20 20 20 20   - if.          
1fcf0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ** a single page
1fd00 20 68 61 73 20 62 65 65 6e 20 61 73 73 69 67 6e   has been assign
1fd10 65 64 20 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20  ed to more than 
1fd20 6f 6e 65 20 73 65 67 6d 65 6e 74 2e 20 49 6e 0a  one segment. In.
1fd30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
1fd40 73 20 63 61 73 65 20 61 20 70 72 69 6f 72 20 69  s case a prior i
1fd50 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 69 73  teration of this
1fd60 20 6c 6f 6f 70 20 6d 61 79 20 68 61 76 65 20 63   loop may have c
1fd70 6f 72 72 75 70 74 65 64 20 74 68 65 0a 20 20 20  orrupted the.   
1fd80 20 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e         ** segmen
1fd90 74 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  t currently bein
1fda0 67 20 74 72 69 6d 6d 65 64 2e 20 20 2a 2f 0a 20  g trimmed.  */. 
1fdb0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1fdc0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
1fdd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1fde0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fdf0 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20  erZero(&buf);.  
1fe00 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fe10 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26  erGrow(&p->rc, &
1fe20 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b  buf, pData->nn);
1fe30 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
1fe40 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1fe50 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69  &p->rc, &buf, si
1fe60 7a 65 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72  zeof(aHdr), aHdr
1fe70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
1fe80 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1fe90 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
1fea0 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b  , pSeg->term.n);
1feb0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
1fec0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1fed0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
1fee0 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67  eg->term.n, pSeg
1fef0 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20  ->term.p);.     
1ff00 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1ff10 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1ff20 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 73  , &buf, pData->s
1ff30 7a 4c 65 61 66 2d 69 4f 66 66 2c 26 70 44 61 74  zLeaf-iOff,&pDat
1ff40 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  a->p[iOff]);.   
1ff50 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1ff60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ff70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1ff80 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66 69 65  t the szLeaf fie
1ff90 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ld */.          
1ffa0 20 20 66 74 73 35 50 75 74 55 31 36 28 26 62 75    fts5PutU16(&bu
1ffb0 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62 75 66  f.p[2], (u16)buf
1ffc0 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  .n);.          }
1ffd0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ..          /* S
1ffe0 65 74 20 75 70 20 74 68 65 20 6e 65 77 20 70 61  et up the new pa
1fff0 67 65 2d 69 6e 64 65 78 20 61 72 72 61 79 20 2a  ge-index array *
20000 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  /.          fts5
20010 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20020 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
20030 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   4);.          i
20040 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67  f( pSeg->iLeafPg
20050 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54 65 72 6d 4c  no==pSeg->iTermL
20060 65 61 66 50 67 6e 6f 20 0a 20 20 20 20 20 20 20  eafPgno .       
20070 20 20 20 20 26 26 20 70 53 65 67 2d 3e 69 45 6e      && pSeg->iEn
20080 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44 61 74 61  dofDoclist<pData
20090 2d 3e 73 7a 4c 65 61 66 0a 20 20 20 20 20 20 20  ->szLeaf.       
200a0 20 20 20 20 26 26 20 70 53 65 67 2d 3e 69 50 67      && pSeg->iPg
200b0 69 64 78 4f 66 66 3c 3d 70 44 61 74 61 2d 3e 6e  idxOff<=pData->n
200c0 6e 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  n.          ){. 
200d0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
200e0 44 69 66 66 20 3d 20 70 44 61 74 61 2d 3e 73 7a  Diff = pData->sz
200f0 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 45 6e  Leaf - pSeg->iEn
20100 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  dofDoclist;.    
20110 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20120 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
20130 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 62 75 66  p->rc, &buf, buf
20140 2e 6e 20 2d 20 31 20 2d 20 6e 44 69 66 66 20 2d  .n - 1 - nDiff -
20150 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   4);.           
20160 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
20170 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
20180 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  uf, .           
20190 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 2d       pData->nn -
201a0 20 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66   pSeg->iPgidxOff
201b0 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70 53 65 67  , &pData->p[pSeg
201c0 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20 20 20  ->iPgidxOff].   
201d0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
201e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
201f0 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70     pSeg->pSeg->p
20200 67 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d  gnoFirst = pSeg-
20210 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a  >iTermLeafPgno;.
20220 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
20230 74 61 44 65 6c 65 74 65 28 70 2c 20 46 54 53 35  taDelete(p, FTS5
20240 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
20250 49 64 2c 20 31 29 2c 20 69 4c 65 61 66 52 6f 77  Id, 1), iLeafRow
20260 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  id);.          f
20270 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
20280 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75 66 2e  iLeafRowid, buf.
20290 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20  p, buf.n);.     
202a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 74 73     }.        fts
202b0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
202c0 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
202d0 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66   }.  }.  fts5Buf
202e0 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
202f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
20300 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c  s5MergeChunkCall
20310 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
20320 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70  x *p, .  void *p
20330 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  Ctx, .  const u8
20340 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
20350 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65  hunk.){.  Fts5Se
20360 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
20370 20 3d 20 28 46 74 73 35 53 65 67 57 72 69 74 65   = (Fts5SegWrite
20380 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35 57  r*)pCtx;.  fts5W
20390 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
203a0 74 44 61 74 61 28 70 2c 20 70 57 72 69 74 65 72  tData(p, pWriter
203b0 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b  , pChunk, nChunk
203c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  );.}../*.**.*/.s
203d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
203e0 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a  ndexMergeLevel(.
203f0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20410 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
20420 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
20430 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
20440 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
20450 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75 72   IN/OUT: Stuctur
20460 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
20470 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20  int iLvl,       
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20490 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64  /* Level to read
204a0 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20   input from */. 
204b0 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20   int *pnRem     
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20   /* Write up to 
204e0 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74  this many output
204f0 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20   leaves */.){.  
20500 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
20510 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
20520 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ct;.  Fts5Struct
20530 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
20540 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
20550 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53  l[iLvl];.  Fts5S
20560 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
20570 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49 74  LvlOut;.  Fts5It
20580 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20  er *pIter = 0;  
20590 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
205a0 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64   to read input d
205b0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ata */.  int nRe
205c0 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52  m = pnRem ? *pnR
205d0 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70  em : 0;  /* Outp
205e0 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  ut leaf pages le
205f0 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  ft to write */. 
20600 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20   int nInput;    
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20620 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
20630 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
20640 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
20650 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  writer;         
20660 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
20670 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
20680 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
20690 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  eg;     /* Outpu
206a0 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  t segment */.  F
206b0 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a  ts5Buffer term;.
206c0 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20    int bOldest;  
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
206f0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
20700 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f  is the oldest */
20710 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d  .  int eDetail =
20720 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
20730 74 61 69 6c 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  tail;.  const in
20740 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e  t flags = FTS5IN
20750 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50  DEX_QUERY_NOOUTP
20760 55 54 3b 0a 20 20 69 6e 74 20 62 54 65 72 6d 57  UT;.  int bTermW
20770 72 69 74 74 65 6e 20 3d 20 30 3b 20 20 20 20 20  ritten = 0;     
20780 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20790 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 6c   current term al
207a0 72 65 61 64 79 20 6f 75 74 70 75 74 20 2a 2f 0a  ready output */.
207b0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c  .  assert( iLvl<
207c0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20  pStruct->nLevel 
207d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76  );.  assert( pLv
207e0 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d  l->nMerge<=pLvl-
207f0 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73  >nSeg );..  mems
20800 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73  et(&writer, 0, s
20810 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
20820 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ter));.  memset(
20830 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
20840 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
20850 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
20860 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74  e ){.    pLvlOut
20870 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
20880 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20  vel[iLvl+1];.   
20890 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74   assert( pLvlOut
208a0 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20  ->nSeg>0 );.    
208b0 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e  nInput = pLvl->n
208c0 4d 65 72 67 65 3b 0a 20 20 20 20 70 53 65 67 20  Merge;.    pSeg 
208d0 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67  = &pLvlOut->aSeg
208e0 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31  [pLvlOut->nSeg-1
208f0 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
20900 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
20910 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b  , pSeg->iSegid);
20920 0a 20 20 20 20 77 72 69 74 65 72 2e 77 72 69 74  .    writer.writ
20930 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  er.pgno = pSeg->
20940 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20  pgnoLast+1;.    
20950 77 72 69 74 65 72 2e 69 42 74 50 61 67 65 20 3d  writer.iBtPage =
20960 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
20970 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74   int iSegid = ft
20980 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
20990 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  p, pStruct);..  
209a0 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20    /* Extend the 
209b0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
209c0 6a 65 63 74 20 61 73 20 72 65 71 75 69 72 65 64  ject as required
209d0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f   to ensure the o
209e0 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67  utput.    ** seg
209f0 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  ment exists. */.
20a00 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53      if( iLvl==pS
20a10 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20  truct->nLevel-1 
20a20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
20a30 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
20a40 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29  p->rc, ppStruct)
20a50 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20  ;.      pStruct 
20a60 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
20a70 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
20a80 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
20a90 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
20aa0 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a   iLvl+1, 1, 0);.
20ab0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
20ac0 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c  return;.    pLvl
20ad0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
20ae0 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70  vel[iLvl];.    p
20af0 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63  LvlOut = &pStruc
20b00 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31  t->aLevel[iLvl+1
20b10 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
20b20 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
20b30 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
20b40 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73  /* Add the new s
20b50 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75  egment to the ou
20b60 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  tput level */.  
20b70 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
20b80 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
20b90 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c  >nSeg];.    pLvl
20ba0 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20  Out->nSeg++;.   
20bb0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
20bc0 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e   = 1;.    pSeg->
20bd0 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
20be0 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53  .    pStruct->nS
20bf0 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f  egment++;..    /
20c00 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f  * Read input fro
20c10 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  m all segments i
20c20 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65  n the input leve
20c30 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20  l */.    nInput 
20c40 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20  = pLvl->nSeg;.  
20c50 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70  }.  bOldest = (p
20c60 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20  LvlOut->nSeg==1 
20c70 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  && pStruct->nLev
20c80 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20  el==iLvl+2);..  
20c90 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30 20  assert( iLvl>=0 
20ca0 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c  );.  for(fts5Mul
20cb0 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
20cc0 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c 20  ruct, flags, 0, 
20cd0 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70  0, 0, iLvl, nInp
20ce0 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20  ut, &pIter);.   
20cf0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
20d00 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30  Eof(p, pIter)==0
20d10 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
20d20 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
20d30 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20  er, 0, 0).  ){. 
20d40 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
20d50 70 53 65 67 49 74 65 72 20 3d 20 26 70 49 74 65  pSegIter = &pIte
20d60 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
20d70 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
20d80 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   ];.    int nPos
20d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20da0 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f        /* positio
20db0 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
20dc0 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69  d value */.    i
20dd0 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f  nt nTerm;.    co
20de0 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a  nst u8 *pTerm;..
20df0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35      pTerm = fts5
20e00 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
20e10 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20  ter, &nTerm);.  
20e20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72    if( nTerm!=ter
20e30 6d 2e 6e 20 7c 7c 20 66 74 73 35 4d 65 6d 63 6d  m.n || fts5Memcm
20e40 70 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c  p(pTerm, term.p,
20e50 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20   nTerm) ){.     
20e60 20 69 66 28 20 70 6e 52 65 6d 20 26 26 20 77 72   if( pnRem && wr
20e70 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65  iter.nLeafWritte
20e80 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20  n>nRem ){.      
20e90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20ea0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
20eb0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65  rSet(&p->rc, &te
20ec0 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
20ed0 29 3b 0a 20 20 20 20 20 20 62 54 65 72 6d 57 72  );.      bTermWr
20ee0 69 74 74 65 6e 20 3d 30 3b 0a 20 20 20 20 7d 0a  itten =0;.    }.
20ef0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
20f00 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69  r key annihilati
20f10 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  on. */.    if( p
20f20 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30  SegIter->nPos==0
20f30 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20   && (bOldest || 
20f40 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d  pSegIter->bDel==
20f50 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  0) ) continue;..
20f60 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
20f70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 54 65 72  QLITE_OK && bTer
20f80 6d 57 72 69 74 74 65 6e 3d 3d 30 20 29 7b 0a 20  mWritten==0 ){. 
20f90 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
20fa0 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65  a new term. Appe
20fb0 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  nd a term to the
20fc0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
20fd0 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72   */.      fts5Wr
20fe0 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
20ff0 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c   &writer, nTerm,
21000 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62   pTerm);.      b
21010 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 20 31 3b  TermWritten = 1;
21020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
21030 70 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20  ppend the rowid 
21040 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f  to the output */
21050 0a 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53  .    /* WRITEPOS
21060 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20  LISTSIZE */.    
21070 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
21080 6f 77 69 64 28 70 2c 20 26 77 72 69 74 65 72 2c  owid(p, &writer,
21090 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
210a0 77 69 64 28 70 49 74 65 72 29 29 3b 0a 0a 20 20  wid(pIter));..  
210b0 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
210c0 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
210d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  ){.      if( pSe
210e0 67 49 74 65 72 2d 3e 62 44 65 6c 20 29 7b 0a 20  gIter->bDel ){. 
210f0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
21100 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
21110 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72  ->rc, &writer.wr
21120 69 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20  iter.buf, 0);.  
21130 20 20 20 20 20 20 69 66 28 20 70 53 65 67 49 74        if( pSegIt
21140 65 72 2d 3e 6e 50 6f 73 3e 30 20 29 7b 0a 20 20  er->nPos>0 ){.  
21150 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
21160 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
21170 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77  p->rc, &writer.w
21180 72 69 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20  riter.buf, 0);. 
21190 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
211a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
211b0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
211c0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61  position-list da
211d0 74 61 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ta to the output
211e0 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d   */.      nPos =
211f0 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a   pSegIter->nPos*
21200 32 20 2b 20 70 53 65 67 49 74 65 72 2d 3e 62 44  2 + pSegIter->bD
21210 65 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  el;.      fts5Bu
21220 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
21230 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72  (&p->rc, &writer
21240 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 50 6f  .writer.buf, nPo
21250 73 29 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68  s);.      fts5Ch
21260 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53  unkIterate(p, pS
21270 65 67 49 74 65 72 2c 20 28 76 6f 69 64 2a 29 26  egIter, (void*)&
21280 77 72 69 74 65 72 2c 20 66 74 73 35 4d 65 72 67  writer, fts5Merg
21290 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b  eChunkCallback);
212a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
212b0 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74 20   Flush the last 
212c0 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64 69 73  leaf page to dis
212d0 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  k. Set the outpu
212e0 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  t segment b-tree
212f0 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64   height.  ** and
21300 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
21310 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20 73 61  number at the sa
21320 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66  me time.  */.  f
21330 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70  ts5WriteFinish(p
21340 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53 65 67  , &writer, &pSeg
21350 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20  ->pgnoLast);..  
21360 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
21370 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
21380 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  {.    int i;..  
21390 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
213a0 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e  redundant segmen
213b0 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  ts from the %_da
213c0 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ta table */.    
213d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75  for(i=0; i<nInpu
213e0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  t; i++){.      f
213f0 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67  ts5DataRemoveSeg
21400 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53  ment(p, pLvl->aS
21410 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20  eg[i].iSegid);. 
21420 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d     }..    /* Rem
21430 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e  ove the redundan
21440 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  t segments from 
21450 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20  the input level 
21460 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  */.    if( pLvl-
21470 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b  >nSeg!=nInput ){
21480 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65  .      int nMove
21490 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d   = (pLvl->nSeg -
214a0 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f   nInput) * sizeo
214b0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
214c0 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d  egment);.      m
214d0 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65  emmove(pLvl->aSe
214e0 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e  g, &pLvl->aSeg[n
214f0 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a  Input], nMove);.
21500 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 75 63      }.    pStruc
21510 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e  t->nSegment -= n
21520 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
21530 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b  >nSeg -= nInput;
21540 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  .    pLvl->nMerg
21550 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
21560 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30  Seg->pgnoLast==0
21570 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75   ){.      pLvlOu
21580 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20  t->nSeg--;.     
21590 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
215a0 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  nt--;.    }.  }e
215b0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
215c0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e   pSeg->pgnoLast>
215d0 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69  0 );.    fts5Tri
215e0 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74  mSegments(p, pIt
215f0 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e  er);.    pLvl->n
21600 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a  Merge = nInput;.
21610 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69    }..  fts5Multi
21620 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b  IterFree(pIter);
21630 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
21640 65 28 26 74 65 72 6d 29 3b 0a 20 20 69 66 28 20  e(&term);.  if( 
21650 70 6e 52 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d  pnRem ) *pnRem -
21660 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72  = writer.nLeafWr
21670 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  itten;.}../*.** 
21680 44 6f 20 75 70 20 74 6f 20 6e 50 67 20 70 61 67  Do up to nPg pag
21690 65 73 20 6f 66 20 61 75 74 6f 6d 65 72 67 65 20  es of automerge 
216a0 77 6f 72 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65  work on the inde
216b0 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  x..**.** Return 
216c0 74 72 75 65 20 69 66 20 61 6e 79 20 63 68 61 6e  true if any chan
216d0 67 65 73 20 77 65 72 65 20 61 63 74 75 61 6c 6c  ges were actuall
216e0 79 20 6d 61 64 65 2c 20 6f 72 20 66 61 6c 73 65  y made, or false
216f0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
21700 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
21710 64 65 78 4d 65 72 67 65 28 0a 20 20 46 74 73 35  dexMerge(.  Fts5
21720 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
21730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21740 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
21750 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
21760 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
21770 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
21780 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
21790 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
217a0 0a 20 20 69 6e 74 20 6e 50 67 2c 20 20 20 20 20  .  int nPg,     
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 2f 2a 20 50 61 67 65 73 20 6f 66 20 77     /* Pages of w
217d0 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 69  ork to do */.  i
217e0 6e 74 20 6e 4d 69 6e 20 20 20 20 20 20 20 20 20  nt nMin         
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21800 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  * Minimum number
21810 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
21820 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  merge */.){.  in
21830 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20 20  t nRem = nPg;.  
21840 69 6e 74 20 62 52 65 74 20 3d 20 30 3b 0a 20 20  int bRet = 0;.  
21850 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
21860 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
21870 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52 65  ct;.  while( nRe
21880 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  m>0 && p->rc==SQ
21890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
218a0 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
218b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
218c0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
218d0 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69   levels */.    i
218e0 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b  nt iBestLvl = 0;
218f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
21900 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68 65  vel offering the
21910 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67 6d   most input segm
21920 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
21930 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  nBest = 0;      
21940 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21950 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
21960 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76 65  nts on best leve
21970 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  l */..    /* Set
21980 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68 65   iBestLvl to the
21990 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69   level to read i
219a0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66 72  nput segments fr
219b0 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  om. */.    asser
219c0 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  t( pStruct->nLev
219d0 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  el>0 );.    for(
219e0 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
219f0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
21a00 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  vl++){.      Fts
21a10 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
21a20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
21a30 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
21a40 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
21a50 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20  nMerge ){.      
21a60 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
21a70 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  ge>nBest ){.    
21a80 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d        iBestLvl =
21a90 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20   iLvl;.         
21aa0 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e   nBest = pLvl->n
21ab0 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  Merge;.        }
21ac0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
21ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21ae0 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65  ( pLvl->nSeg>nBe
21af0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42  st ){.        nB
21b00 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  est = pLvl->nSeg
21b10 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74 4c  ;.        iBestL
21b20 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  vl = iLvl;.     
21b30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
21b40 20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74 69   If nBest is sti
21b50 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20 69  ll 0, then the i
21b60 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d 70  ndex must be emp
21b70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ty. */.#ifdef SQ
21b80 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66  LITE_DEBUG.    f
21b90 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74  or(iLvl=0; nBest
21ba0 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72  ==0 && iLvl<pStr
21bb0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
21bc0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  l++){.      asse
21bd0 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  rt( pStruct->aLe
21be0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d  vel[iLvl].nSeg==
21bf0 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  0 );.    }.#endi
21c00 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73 74  f..    if( nBest
21c10 3c 6e 4d 69 6e 20 26 26 20 70 53 74 72 75 63 74  <nMin && pStruct
21c20 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76  ->aLevel[iBestLv
21c30 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  l].nMerge==0 ){.
21c40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21c50 20 7d 0a 20 20 20 20 62 52 65 74 20 3d 20 31 3b   }.    bRet = 1;
21c60 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65  .    fts5IndexMe
21c70 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74  rgeLevel(p, &pSt
21c80 72 75 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20  ruct, iBestLvl, 
21c90 26 6e 52 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  &nRem);.    if( 
21ca0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
21cb0 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
21cc0 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d  vel[iBestLvl].nM
21cd0 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erge==0 ){.     
21ce0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
21cf0 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76  omote(p, iBestLv
21d00 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  l+1, pStruct);. 
21d10 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74     }.  }.  *ppSt
21d20 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
21d30 20 20 72 65 74 75 72 6e 20 62 52 65 74 3b 0a 7d    return bRet;.}
21d40 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ../*.** A total 
21d50 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61  of nLeaf leaf pa
21d60 67 65 73 20 6f 66 20 64 61 74 61 20 68 61 73 20  ges of data has 
21d70 6a 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65  just been flushe
21d80 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a  d to a level-0.*
21d90 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20  * segment. This 
21da0 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
21db0 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74   the write-count
21dc0 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  er accordingly a
21dd0 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73  nd, if.** necess
21de0 61 72 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e  ary, performs in
21df0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
21e00 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  work..**.** If a
21e10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
21e20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
21e30 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
21e40 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
21e50 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
21e60 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
21e70 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
21e80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21e90 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72  fts5IndexAutomer
21ea0 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
21eb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21ec0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
21ed0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
21ee0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
21ef0 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
21f00 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
21f10 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
21f20 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
21f30 20 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   nLeaf          
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f50 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
21f60 20 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69   leaves just wri
21f70 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tten */.){.  if(
21f80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
21f90 4b 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  K && p->pConfig-
21fa0 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b  >nAutomerge>0 ){
21fb0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
21fc0 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
21fd0 70 53 74 72 75 63 74 3b 0a 20 20 20 20 75 36 34  pStruct;.    u64
21fe0 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
21ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
22000 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77  itial value of w
22010 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  rite-counter */.
22020 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20      int nWork;  
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22040 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
22050 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65  ork-quanta to pe
22060 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  rform */.    int
22070 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
22080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22090 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
220a0 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
220b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   */..    /* Upda
220c0 74 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75  te the write-cou
220d0 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e  nter. While doin
220e0 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e  g so, set nWork.
220f0 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d   */.    nWrite =
22100 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
22110 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f  Counter;.    nWo
22120 72 6b 20 3d 20 28 69 6e 74 29 28 28 28 6e 57 72  rk = (int)(((nWr
22130 69 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70  ite + nLeaf) / p
22140 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28  ->nWorkUnit) - (
22150 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72  nWrite / p->nWor
22160 6b 55 6e 69 74 29 29 3b 0a 20 20 20 20 70 53 74  kUnit));.    pSt
22170 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
22180 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20  ter += nLeaf;.  
22190 20 20 6e 52 65 6d 20 3d 20 28 69 6e 74 29 28 70    nRem = (int)(p
221a0 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57  ->nWorkUnit * nW
221b0 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e  ork * pStruct->n
221c0 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73  Level);..    fts
221d0 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 70  5IndexMerge(p, p
221e0 70 53 74 72 75 63 74 2c 20 6e 52 65 6d 2c 20 70  pStruct, nRem, p
221f0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f  ->pConfig->nAuto
22200 6d 65 72 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  merge);.  }.}..s
22210 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
22220 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28  ndexCrisismerge(
22230 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
22260 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
22270 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
22280 70 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f  pStruct        /
22290 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
222a0 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
222b0 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ndex */.){.  con
222c0 73 74 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d  st int nCrisis =
222d0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72   p->pConfig->nCr
222e0 69 73 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73  isisMerge;.  Fts
222f0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
22300 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
22310 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b  .  int iLvl = 0;
22320 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
22330 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
22340 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e  pStruct->nLevel>
22350 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
22360 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
22370 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
22380 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43  l[iLvl].nSeg>=nC
22390 72 69 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73  risis ){.    fts
223a0 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
223b0 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c  (p, &pStruct, iL
223c0 76 6c 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  vl, 0);.    asse
223d0 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
223e0 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d  E_OK || pStruct-
223f0 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29  >nLevel>(iLvl+1)
22400 20 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75   );.    fts5Stru
22410 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20  cturePromote(p, 
22420 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29  iLvl+1, pStruct)
22430 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20  ;.    iLvl++;.  
22440 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20  }.  *ppStruct = 
22450 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74  pStruct;.}..stat
22460 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
22470 52 65 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78  Return(Fts5Index
22480 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
22490 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20   p->rc;.  p->rc 
224a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72  = SQLITE_OK;.  r
224b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70  eturn rc;.}..typ
224c0 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
224d0 46 6c 75 73 68 43 74 78 20 46 74 73 35 46 6c 75  FlushCtx Fts5Flu
224e0 73 68 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74  shCtx;.struct Ft
224f0 73 35 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46  s5FlushCtx {.  F
22500 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  ts5Index *pIdx;.
22510 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
22520 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a  writer; .};../*.
22530 2a 2a 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d  ** Buffer aBuf[]
22540 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74   contains a list
22550 20 6f 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c   of varints, all
22560 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f   small enough to
22570 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d   fit.** in a 32-
22580 62 69 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74  bit integer. Ret
22590 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
225a0 74 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 66  the largest pref
225b0 69 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c  ix of this .** l
225c0 69 73 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f  ist nMax bytes o
225d0 72 20 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a  r less in size..
225e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
225f0 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28  s5PoslistPrefix(
22600 63 6f 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20  const u8 *aBuf, 
22610 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  int nMax){.  int
22620 20 72 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d   ret;.  u32 dumm
22630 79 3b 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47  y;.  ret = fts5G
22640 65 74 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c  etVarint32(aBuf,
22650 20 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72   dummy);.  if( r
22660 65 74 3c 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77  et<nMax ){.    w
22670 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
22680 20 69 6e 74 20 69 20 3d 20 66 74 73 35 47 65 74   int i = fts5Get
22690 56 61 72 69 6e 74 33 32 28 26 61 42 75 66 5b 72  Varint32(&aBuf[r
226a0 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  et], dummy);.   
226b0 20 20 20 69 66 28 20 28 72 65 74 20 2b 20 69 29     if( (ret + i)
226c0 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b   > nMax ) break;
226d0 0a 20 20 20 20 20 20 72 65 74 20 2b 3d 20 69 3b  .      ret += i;
226e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
226f0 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
22700 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74  * Flush the cont
22710 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  ents of in-memor
22720 79 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61  y hash table iHa
22730 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65  sh to a new leve
22740 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20  l-0 .** segment 
22750 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70  on disk. Also up
22760 64 61 74 65 20 74 68 65 20 63 6f 72 72 65 73 70  date the corresp
22770 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72 65  onding structure
22780 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49   record..**.** I
22790 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
227a0 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  s, set the Fts5I
227b0 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
227c0 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  de. If an error 
227d0 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
227e0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
227f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
22800 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
22810 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48  id fts5FlushOneH
22820 61 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ash(Fts5Index *p
22830 29 7b 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70  ){.  Fts5Hash *p
22840 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b  Hash = p->pHash;
22850 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
22860 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74   *pStruct;.  int
22870 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70   iSegid;.  int p
22880 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20  gnoLast = 0;    
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
228a0 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
228b0 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
228c0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
228d0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
228e0 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
228f0 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ure and allocate
22900 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69   a new segment-i
22910 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  d.  ** for the n
22920 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65  ew level-0 segme
22930 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63  nt.  */.  pStruc
22940 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
22950 65 52 65 61 64 28 70 29 3b 0a 20 20 69 53 65 67  eRead(p);.  iSeg
22960 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74  id = fts5Allocat
22970 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63  eSegid(p, pStruc
22980 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
22990 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
229a0 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 20  ;..  if( iSegid 
229b0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
229c0 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66   pgsz = p->pConf
229d0 69 67 2d 3e 70 67 73 7a 3b 0a 20 20 20 20 69 6e  ig->pgsz;.    in
229e0 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70  t eDetail = p->p
229f0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
22a00 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
22a10 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
22a20 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e     /* New segmen
22a30 74 20 77 69 74 68 69 6e 20 70 53 74 72 75 63 74  t within pStruct
22a40 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
22a50 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20  er *pBuf;       
22a60 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
22a70 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65  in which to asse
22a80 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a  mble leaf page *
22a90 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
22aa0 20 2a 70 50 67 69 64 78 3b 20 20 20 20 20 20 20   *pPgidx;       
22ab0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
22ac0 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
22ad0 6c 65 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20  le pgidx */..   
22ae0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
22af0 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73 35 57  riter;.    fts5W
22b00 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
22b10 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  ter, iSegid);.. 
22b20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69 74 65     pBuf = &write
22b30 72 2e 77 72 69 74 65 72 2e 62 75 66 3b 0a 20 20  r.writer.buf;.  
22b40 20 20 70 50 67 69 64 78 20 3d 20 26 77 72 69 74    pPgidx = &writ
22b50 65 72 2e 77 72 69 74 65 72 2e 70 67 69 64 78 3b  er.writer.pgidx;
22b60 0a 0a 20 20 20 20 2f 2a 20 66 74 73 35 57 72 69  ..    /* fts5Wri
22b70 74 65 49 6e 69 74 28 29 20 73 68 6f 75 6c 64 20  teInit() should 
22b80 68 61 76 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  have initialized
22b90 20 74 68 65 20 62 75 66 66 65 72 73 20 74 6f 20   the buffers to 
22ba0 28 6d 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20  (most likely).  
22bb0 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
22bc0 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 2e   space required.
22bd0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
22be0 70 2d 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e  p->rc || pBuf->n
22bf0 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46  Space>=(pgsz + F
22c00 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
22c10 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
22c20 20 70 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64 78   p->rc || pPgidx
22c30 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20  ->nSpace>=(pgsz 
22c40 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
22c50 49 4e 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ING) );..    /* 
22c60 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74  Begin scanning t
22c70 68 72 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c  hrough hash tabl
22c80 65 20 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20  e entries. This 
22c90 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66  loop runs once f
22ca0 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74  or each.    ** t
22cb0 65 72 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72  erm/doclist curr
22cc0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74  ently stored wit
22cd0 68 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62  hin the hash tab
22ce0 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
22cf0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22d00 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
22d10 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
22d20 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20  ScanInit(pHash, 
22d30 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
22d40 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
22d50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73  QLITE_OK && 0==s
22d60 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
22d70 61 6e 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a  anEof(pHash) ){.
22d80 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
22d90 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *zTerm;        
22da0 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
22db0 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20  aining term */. 
22dc0 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
22dd0 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
22de0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
22df0 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20  oclist for this 
22e00 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  term */.      in
22e10 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  t nDoclist;     
22e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
22e30 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20  e of doclist in 
22e40 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20  bytes */..      
22e50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 72  /* Write the ter
22e60 6d 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79  m for this entry
22e70 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20   to disk. */.   
22e80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
22e90 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73  shScanEntry(pHas
22ea0 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63  h, &zTerm, &pDoc
22eb0 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29  list, &nDoclist)
22ec0 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
22ed0 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26  eAppendTerm(p, &
22ee0 77 72 69 74 65 72 2c 20 28 69 6e 74 29 73 74 72  writer, (int)str
22ef0 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e  len(zTerm), (con
22f00 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20  st u8*)zTerm);. 
22f10 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
22f20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
22f30 6b 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  k;..      assert
22f40 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52  ( writer.bFirstR
22f50 6f 77 69 64 49 6e 50 61 67 65 3d 3d 30 20 29 3b  owidInPage==0 );
22f60 0a 20 20 20 20 20 20 69 66 28 20 70 67 73 7a 3e  .      if( pgsz>
22f70 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69  =(pBuf->n + pPgi
22f80 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74  dx->n + nDoclist
22f90 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20   + 1) ){.       
22fa0 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64   /* The entire d
22fb0 6f 63 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oclist will fit 
22fc0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
22fd0 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eaf. */.        
22fe0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
22ff0 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
23000 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73  Doclist, nDoclis
23010 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
23020 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f  .        i64 iRo
23030 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wid = 0;.       
23040 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
23050 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
23060 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  f = 0;..        
23070 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f  /* The entire do
23080 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66  clist will not f
23090 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e  it on this leaf.
230a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   The following .
230b0 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20          ** loop 
230c0 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
230d0 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74 68   the poslists th
230e0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
230f0 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20  urrent .        
23100 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a  ** doclist.  */.
23110 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
23120 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
23130 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  && iOff<nDoclist
23140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   ){.          iO
23150 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
23160 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  int(&pDoclist[iO
23170 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
23180 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ta);.          i
23190 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
231a0 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
231b0 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72        if( writer
231c0 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  .bFirstRowidInPa
231d0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
231e0 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42    fts5PutU16(&pB
231f0 75 66 2d 3e 70 5b 30 5d 2c 20 28 75 31 36 29 70  uf->p[0], (u16)p
23200 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69  Buf->n);   /* fi
23210 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67  rst rowid on pag
23220 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
23230 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
23240 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
23250 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
23260 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  n], iRowid);.   
23270 20 20 20 20 20 20 20 20 20 77 72 69 74 65 72 2e           writer.
23280 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
23290 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
232a0 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64     fts5WriteDlid
232b0 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74  xAppend(p, &writ
232c0 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  er, iRowid);.   
232d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
232e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
232f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
23300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23310 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73      pBuf->n += s
23320 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
23330 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75  int(&pBuf->p[pBu
23340 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a  f->n], iDelta);.
23350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
23370 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70  uf->n<=pBuf->nSp
23380 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  ace );..        
23390 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
233a0 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
233b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
233c0 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  f( iOff<nDoclist
233d0 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66   && pDoclist[iOf
233e0 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
233f0 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70         pBuf->p[p
23400 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20  Buf->n++] = 0;. 
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66               iOf
23420 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  f++;.           
23430 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63     if( iOff<nDoc
23440 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73 74  list && pDoclist
23450 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iOff]==0 ){.   
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75               pBu
23470 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20  f->p[pBuf->n++] 
23480 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
23490 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
234a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
234b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
234c0 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66         if( (pBuf
234d0 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29  ->n + pPgidx->n)
234e0 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  >=pgsz ){.      
234f0 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
23500 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77  eFlushLeaf(p, &w
23510 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
23520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23530 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23540 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
23550 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
23560 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pos;.           
23570 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 66 74 73   int nCopy = fts
23580 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
23590 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
235a0 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
235b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  ;.            nC
235c0 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  opy += nPos;.   
235d0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42           if( (pB
235e0 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  uf->n + pPgidx->
235f0 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67  n + nCopy) <= pg
23600 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
23610 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
23620 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66  e poslist will f
23630 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  it on the curren
23640 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a  t leaf. So copy.
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
23660 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a   it in one go. *
23670 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
23680 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
23690 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26  pendBlob(pBuf, &
236a0 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
236b0 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
236c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
236d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
236e0 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77  entire poslist w
236f0 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74  ill not fit on t
23700 68 69 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20  his leaf. So it 
23710 6e 65 65 64 73 0a 20 20 20 20 20 20 20 20 20 20  needs.          
23720 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f      ** to be bro
23730 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e  ken into section
23740 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c  s. The only qual
23750 69 66 69 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a  ification being.
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
23770 20 74 68 61 74 20 65 61 63 68 20 76 61 72 69 6e   that each varin
23780 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64  t must be stored
23790 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20   contiguously.  
237a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
237b0 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c   const u8 *pPosl
237c0 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b  ist = &pDoclist[
237d0 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20  iOff];.         
237e0 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20       int iPos = 
237f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
23800 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
23810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23820 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
23830 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20  nSpace = pgsz - 
23840 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78  pBuf->n - pPgidx
23850 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->n;.           
23860 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23880 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f  if( (nCopy - iPo
23890 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20  s)<=nSpace ){.  
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73  n = nCopy - iPos
238c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
238d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
238e0 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 66             n = f
238f0 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78  ts5PoslistPrefix
23900 28 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d  (&pPoslist[iPos]
23910 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 20 20 20  , nSpace);.     
23920 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
23940 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20  ert( n>0 );.    
23950 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
23960 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
23970 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73  Blob(pBuf, &pPos
23980 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a  list[iPos], n);.
23990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239a0 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  iPos += n;.     
239b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
239c0 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78  pBuf->n + pPgidx
239d0 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20  ->n)>=pgsz ){.  
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
23a00 61 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a  af(p, &writer);.
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
23a30 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70    if( iPos>=nCop
23a40 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  y ) break;.     
23a50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23a60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23a70 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f       iOff += nCo
23a80 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  py;.          }.
23a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23aa0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  }..      /* TODO
23ab0 32 3a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69  2: Doclist termi
23ac0 6e 61 74 6f 72 20 77 72 69 74 74 65 6e 20 68 65  nator written he
23ad0 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  re. */.      /* 
23ae0 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b  pBuf->p[pBuf->n+
23af0 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20  +] = '\0'; */.  
23b00 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66      assert( pBuf
23b10 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63  ->n<=pBuf->nSpac
23b20 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e );.      if( p
23b30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
23b40 29 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  ) sqlite3Fts5Has
23b50 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29  hScanNext(pHash)
23b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23b70 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72  te3Fts5HashClear
23b80 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73  (pHash);.    fts
23b90 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20  5WriteFinish(p, 
23ba0 26 77 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61  &writer, &pgnoLa
23bb0 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  st);..    /* Upd
23bc0 61 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75  ate the Fts5Stru
23bd0 63 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69  cture. It is wri
23be0 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65  tten back to the
23bf0 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65   database by the
23c00 0a 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75  .    ** fts5Stru
23c10 63 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63  ctureRelease() c
23c20 61 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  all below.  */. 
23c30 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
23c40 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  nLevel==0 ){.   
23c50 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
23c60 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  AddLevel(&p->rc,
23c70 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20   &pStruct);.    
23c80 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
23c90 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26  ureExtendLevel(&
23ca0 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20  p->rc, pStruct, 
23cb0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
23cc0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
23cd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67  OK ){.      pSeg
23ce0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
23cf0 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74  vel[0].aSeg[ pSt
23d00 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e  ruct->aLevel[0].
23d10 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20  nSeg++ ];.      
23d20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
23d30 53 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65  Segid;.      pSe
23d40 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31  g->pgnoFirst = 1
23d50 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67  ;.      pSeg->pg
23d60 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73  noLast = pgnoLas
23d70 74 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  t;.      pStruct
23d80 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20  ->nSegment++;.  
23d90 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
23da0 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20  cturePromote(p, 
23db0 30 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  0, pStruct);.  }
23dc0 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74  ..  fts5IndexAut
23dd0 6f 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  omerge(p, &pStru
23de0 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  ct, pgnoLast);. 
23df0 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
23e00 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
23e10 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
23e20 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72  ureWrite(p, pStr
23e30 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
23e40 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
23e50 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ruct);.}../*.** 
23e60 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73  Flush any data s
23e70 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
23e80 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
23e90 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
23ea0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
23eb0 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  id fts5IndexFlus
23ec0 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  h(Fts5Index *p){
23ed0 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20  .  /* Unless it 
23ee0 69 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20  is empty, flush 
23ef0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74  the hash table t
23f00 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20  o disk */.  if( 
23f10 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
23f20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
23f30 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70  ->pHash );.    p
23f40 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
23f50 20 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73   0;.    fts5Flus
23f60 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d  hOneHash(p);.  }
23f70 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 53  .}..static Fts5S
23f80 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 49 6e  tructure *fts5In
23f90 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63  dexOptimizeStruc
23fa0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
23fb0 70 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74  p, .  Fts5Struct
23fc0 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a  ure *pStruct.){.
23fd0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
23fe0 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c  *pNew = 0;.  sql
23ff0 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
24000 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   = sizeof(Fts5St
24010 72 75 63 74 75 72 65 29 3b 0a 20 20 69 6e 74 20  ructure);.  int 
24020 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
24030 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20  nSegment;.  int 
24040 69 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  i;..  /* Figure 
24050 6f 75 74 20 69 66 20 74 68 69 73 20 73 74 72 75  out if this stru
24060 63 74 75 72 65 20 72 65 71 75 69 72 65 73 20 6f  cture requires o
24070 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 41 20 73  ptimization. A s
24080 74 72 75 63 74 75 72 65 20 64 6f 65 73 0a 20 20  tructure does.  
24090 2a 2a 20 6e 6f 74 20 72 65 71 75 69 72 65 20 6f  ** not require o
240a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 65  ptimization if e
240b0 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ither:.  **.  **
240c0 20 20 2b 20 69 74 20 63 6f 6e 73 69 73 74 73 20    + it consists 
240d0 6f 66 20 66 65 77 65 72 20 74 68 61 6e 20 74 77  of fewer than tw
240e0 6f 20 73 65 67 6d 65 6e 74 73 2c 20 6f 72 20 0a  o segments, or .
240f0 20 20 2a 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d    **  + all segm
24100 65 6e 74 73 20 61 72 65 20 6f 6e 20 74 68 65 20  ents are on the 
24110 73 61 6d 65 20 6c 65 76 65 6c 2c 20 6f 72 0a 20  same level, or. 
24120 20 2a 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65   **  + all segme
24130 6e 74 73 20 65 78 63 65 70 74 20 6f 6e 65 20 61  nts except one a
24140 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 70  re currently inp
24150 75 74 73 20 74 6f 20 61 20 6d 65 72 67 65 20 6f  uts to a merge o
24160 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  peration..  **. 
24170 20 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74   ** In the first
24180 20 63 61 73 65 2c 20 72 65 74 75 72 6e 20 4e 55   case, return NU
24190 4c 4c 2e 20 49 6e 20 74 68 65 20 73 65 63 6f 6e  LL. In the secon
241a0 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  d, increment the
241b0 20 72 65 66 2d 63 6f 75 6e 74 0a 20 20 2a 2a 20   ref-count.  ** 
241c0 6f 6e 20 2a 70 53 74 72 75 63 74 20 61 6e 64 20  on *pStruct and 
241d0 72 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  return a copy of
241e0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
241f0 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  it..  */.  if( n
24200 53 65 67 3c 32 20 29 20 72 65 74 75 72 6e 20 30  Seg<2 ) return 0
24210 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
24220 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
24230 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54  i++){.    int nT
24240 68 69 73 20 3d 20 70 53 74 72 75 63 74 2d 3e 61  his = pStruct->a
24250 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 0a 20  Level[i].nSeg;. 
24260 20 20 20 69 66 28 20 6e 54 68 69 73 3d 3d 6e 53     if( nThis==nS
24270 65 67 20 7c 7c 20 28 6e 54 68 69 73 3d 3d 6e 53  eg || (nThis==nS
24280 65 67 2d 31 20 26 26 20 70 53 74 72 75 63 74 2d  eg-1 && pStruct-
24290 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67  >aLevel[i].nMerg
242a0 65 3d 3d 6e 54 68 69 73 29 20 29 7b 0a 20 20 20  e==nThis) ){.   
242b0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
242c0 52 65 66 28 70 53 74 72 75 63 74 29 3b 0a 20 20  Ref(pStruct);.  
242d0 20 20 20 20 72 65 74 75 72 6e 20 70 53 74 72 75      return pStru
242e0 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ct;.    }.    as
242f0 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61  sert( pStruct->a
24300 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3c  Level[i].nMerge<
24310 3d 6e 54 68 69 73 20 29 3b 0a 20 20 7d 0a 0a 20  =nThis );.  }.. 
24320 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75   nByte += (pStru
24330 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20  ct->nLevel+1) * 
24340 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
24350 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20 70 4e  tureLevel);.  pN
24360 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  ew = (Fts5Struct
24370 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ure*)sqlite3Fts5
24380 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
24390 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66  c, nByte);..  if
243a0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74  ( pNew ){.    Ft
243b0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
243c0 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 6e 42 79 74   *pLvl;.    nByt
243d0 65 20 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f  e = nSeg * sizeo
243e0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
243f0 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65  egment);.    pNe
24400 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72  w->nLevel = pStr
24410 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20  uct->nLevel+1;. 
24420 20 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20     pNew->nRef = 
24430 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72  1;.    pNew->nWr
24440 69 74 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74  iteCounter = pSt
24450 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
24460 74 65 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20  ter;.    pLvl = 
24470 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53  &pNew->aLevel[pS
24480 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  truct->nLevel];.
24490 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
244a0 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53   (Fts5StructureS
244b0 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46  egment*)sqlite3F
244c0 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70  ts5MallocZero(&p
244d0 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->rc, nByte);.  
244e0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67    if( pLvl->aSeg
244f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   ){.      int iL
24500 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
24510 69 6e 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b  int iSegOut = 0;
24520 0a 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74  .      /* Iterat
24530 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 65  e through all se
24540 67 6d 65 6e 74 73 2c 20 66 72 6f 6d 20 6f 6c 64  gments, from old
24550 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 41  est to newest. A
24560 64 64 20 74 68 65 6d 20 74 6f 0a 20 20 20 20 20  dd them to.     
24570 20 2a 2a 20 74 68 65 20 6e 65 77 20 46 74 73 35   ** the new Fts5
24580 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 73 6f 20  Level object so 
24590 74 68 61 74 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  that pLvl->aSeg[
245a0 30 5d 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74  0] is the oldest
245b0 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
245c0 74 20 69 6e 20 74 68 65 20 64 61 74 61 20 73 74  t in the data st
245d0 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 20  ructure.  */.   
245e0 20 20 20 66 6f 72 28 69 4c 76 6c 3d 70 53 74 72     for(iLvl=pStr
245f0 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69  uct->nLevel-1; i
24600 4c 76 6c 3e 3d 30 3b 20 69 4c 76 6c 2d 2d 29 7b  Lvl>=0; iLvl--){
24610 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
24620 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63  g=0; iSeg<pStruc
24630 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
24640 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
24650 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61           pLvl->a
24660 53 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70  Seg[iSegOut] = p
24670 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
24680 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
24690 0a 20 20 20 20 20 20 20 20 20 20 69 53 65 67 4f  .          iSegO
246a0 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ut++;.        }.
246b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e        }.      pN
246c0 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70  ew->nSegment = p
246d0 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67  Lvl->nSeg = nSeg
246e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
246f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24700 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65  pNew);.      pNe
24710 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  w = 0;.    }.  }
24720 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ..  return pNew;
24730 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
24740 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
24750 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
24760 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
24770 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
24780 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20  Structure *pNew 
24790 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
247a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
247b0 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46   );.  fts5IndexF
247c0 6c 75 73 68 28 70 29 3b 0a 20 20 70 53 74 72 75  lush(p);.  pStru
247d0 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
247e0 72 65 52 65 61 64 28 70 29 3b 0a 20 20 66 74 73  reRead(p);.  fts
247f0 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
24800 64 61 74 65 28 70 29 3b 0a 0a 20 20 69 66 28 20  date(p);..  if( 
24810 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 70  pStruct ){.    p
24820 4e 65 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f  New = fts5IndexO
24830 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c  ptimizeStruct(p,
24840 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20   pStruct);.  }. 
24850 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24860 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
24870 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 3d  .  assert( pNew=
24880 3d 30 20 7c 7c 20 70 4e 65 77 2d 3e 6e 53 65 67  =0 || pNew->nSeg
24890 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  ment>0 );.  if( 
248a0 70 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  pNew ){.    int 
248b0 69 4c 76 6c 3b 0a 20 20 20 20 66 6f 72 28 69 4c  iLvl;.    for(iL
248c0 76 6c 3d 30 3b 20 70 4e 65 77 2d 3e 61 4c 65 76  vl=0; pNew->aLev
248d0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30  el[iLvl].nSeg==0
248e0 3b 20 69 4c 76 6c 2b 2b 29 7b 7d 0a 20 20 20 20  ; iLvl++){}.    
248f0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
24900 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d  LITE_OK && pNew-
24910 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
24920 65 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  eg>0 ){.      in
24930 74 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50  t nRem = FTS5_OP
24940 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20  T_WORK_UNIT;.   
24950 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
24960 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c  eLevel(p, &pNew,
24970 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20   iLvl, &nRem);. 
24980 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74     }..    fts5St
24990 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
249a0 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53  pNew);.    fts5S
249b0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
249c0 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNew);.  }..  re
249d0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
249e0 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a  turn(p); .}../*.
249f0 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
24a00 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
24a10 68 65 20 73 70 65 63 69 61 6c 20 22 56 41 4c 55  he special "VALU
24a20 45 53 28 27 6d 65 72 67 65 27 2c 20 24 6e 4d 65  ES('merge', $nMe
24a30 72 67 65 29 22 0a 2a 2a 20 49 4e 53 45 52 54 20  rge)".** INSERT 
24a40 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  command..*/.int 
24a50 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
24a60 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65 78 20  Merge(Fts5Index 
24a70 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b  *p, int nMerge){
24a80 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
24a90 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35   *pStruct = fts5
24aa0 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
24ab0 3b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  ;.  if( pStruct 
24ac0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20  ){.    int nMin 
24ad0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 55  = p->pConfig->nU
24ae0 73 65 72 6d 65 72 67 65 3b 0a 20 20 20 20 66 74  sermerge;.    ft
24af0 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
24b00 69 64 61 74 65 28 70 29 3b 0a 20 20 20 20 69 66  idate(p);.    if
24b10 28 20 6e 4d 65 72 67 65 3c 30 20 29 7b 0a 20 20  ( nMerge<0 ){.  
24b20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
24b30 65 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 49 6e  e *pNew = fts5In
24b40 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63  dexOptimizeStruc
24b50 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  t(p, pStruct);. 
24b60 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
24b70 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
24b80 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  t);.      pStruc
24b90 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  t = pNew;.      
24ba0 6e 4d 69 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  nMin = 2;.      
24bb0 6e 4d 65 72 67 65 20 3d 20 6e 4d 65 72 67 65 2a  nMerge = nMerge*
24bc0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  -1;.    }.    if
24bd0 28 20 70 53 74 72 75 63 74 20 26 26 20 70 53 74  ( pStruct && pSt
24be0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a  ruct->nLevel ){.
24bf0 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49 6e        if( fts5In
24c00 64 65 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74  dexMerge(p, &pSt
24c10 72 75 63 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d  ruct, nMerge, nM
24c20 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  in) ){.        f
24c30 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
24c40 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  e(p, pStruct);. 
24c50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
24c60 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24c70 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
24c80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
24c90 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
24ca0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
24cb0 66 74 73 35 41 70 70 65 6e 64 52 6f 77 69 64 28  fts5AppendRowid(
24cc0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
24cd0 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20  .  i64 iDelta,. 
24ce0 20 46 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73   Fts5Iter *pUnus
24cf0 65 64 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72  ed,.  Fts5Buffer
24d00 20 2a 70 42 75 66 0a 29 7b 0a 20 20 55 4e 55 53   *pBuf.){.  UNUS
24d10 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64  ED_PARAM(pUnused
24d20 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
24d30 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
24d40 72 63 2c 20 70 42 75 66 2c 20 69 44 65 6c 74 61  rc, pBuf, iDelta
24d50 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
24d60 64 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c  d fts5AppendPosl
24d70 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
24d80 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74   *p,.  i64 iDelt
24d90 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  a,.  Fts5Iter *p
24da0 4d 75 6c 74 69 2c 0a 20 20 46 74 73 35 42 75 66  Multi,.  Fts5Buf
24db0 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69  fer *pBuf.){.  i
24dc0 6e 74 20 6e 44 61 74 61 20 3d 20 70 4d 75 6c 74  nt nData = pMult
24dd0 69 2d 3e 62 61 73 65 2e 6e 44 61 74 61 3b 0a 20  i->base.nData;. 
24de0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 44 61   int nByte = nDa
24df0 74 61 20 2b 20 39 20 2b 20 39 20 2b 20 46 54 53  ta + 9 + 9 + FTS
24e00 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
24e10 49 4e 47 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ING;.  assert( n
24e20 44 61 74 61 3e 30 20 29 3b 0a 20 20 69 66 28 20  Data>0 );.  if( 
24e30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
24e40 20 26 26 20 30 3d 3d 66 74 73 35 42 75 66 66 65   && 0==fts5Buffe
24e50 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42  rGrow(&p->rc, pB
24e60 75 66 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  uf, nByte) ){.  
24e70 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24e80 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
24e90 66 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  f, iDelta);.    
24ea0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
24eb0 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c  pendVarint(pBuf,
24ec0 20 6e 44 61 74 61 2a 32 29 3b 0a 20 20 20 20 66   nData*2);.    f
24ed0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
24ee0 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 4d  endBlob(pBuf, pM
24ef0 75 6c 74 69 2d 3e 62 61 73 65 2e 70 44 61 74 61  ulti->base.pData
24f00 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 6d 65  , nData);.    me
24f10 6d 73 65 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  mset(&pBuf->p[pB
24f20 75 66 2d 3e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f  uf->n], 0, FTS5_
24f30 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e  DATA_ZERO_PADDIN
24f40 47 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74  G);.  }.}...stat
24f50 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
24f60 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35  istIterNext(Fts5
24f70 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
24f80 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70  er){.  u8 *p = p
24f90 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b  Iter->aPoslist +
24fa0 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20   pIter->nSize + 
24fb0 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b  pIter->nPoslist;
24fc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
24fd0 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20  r->aPoslist );. 
24fe0 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61   if( p>=pIter->a
24ff0 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  Eof ){.    pIter
25000 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a  ->aPoslist = 0;.
25010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
25020 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20   iDelta;..    p 
25030 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
25040 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  (p, (u64*)&iDelt
25050 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
25060 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
25070 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f  ..    /* Read po
25080 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65  sition list size
25090 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d   */.    if( p[0]
250a0 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20   & 0x80 ){.     
250b0 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
250c0 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20   pIter->nSize = 
250d0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
250e0 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20  p, nPos);.      
250f0 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20  pIter->nPoslist 
25100 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20  = (nPos>>1);.   
25110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
25120 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20  ter->nPoslist = 
25130 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e  ((int)(p[0])) >>
25140 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   1;.      pIter-
25150 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20  >nSize = 1;.    
25160 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  }..    pIter->aP
25170 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a  oslist = p;.  }.
25180 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
25190 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
251a0 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  it(.  Fts5Buffer
251b0 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44   *pBuf, .  Fts5D
251c0 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
251d0 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49  r.){.  memset(pI
251e0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
251f0 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
25200 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75  ->aPoslist = pBu
25210 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61  f->p;.  pIter->a
25220 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70  Eof = &pBuf->p[p
25230 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44  Buf->n];.  fts5D
25240 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
25250 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a  Iter);.}..#if 0.
25260 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64  /*.** Append a d
25270 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72  oclist to buffer
25280 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
25290 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
252a0 65 73 20 74 68 61 74 20 73 70 61 63 65 20 77 69  es that space wi
252b0 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  thin the buffer 
252c0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
252d0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  .** allocated..*
252e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
252f0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
25300 69 64 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  id(.  Fts5Buffer
25310 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
25320 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
25330 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
25340 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69   i64 *piLastRowi
25350 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
25360 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76   /* IN/OUT: Prev
25370 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74 74  ious rowid writt
25380 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  en (if any) */. 
25390 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20   i64 iRowid     
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70   /* Rowid to app
253c0 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  end */.){.  asse
253d0 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c  rt( pBuf->n!=0 |
253e0 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29  | (*piLastRowid)
253f0 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66  ==0 );.  fts5Buf
25400 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
25410 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64  int(pBuf, iRowid
25420 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29   - *piLastRowid)
25430 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  ;.  *piLastRowid
25440 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e   = iRowid;.}.#en
25450 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  dif..#define fts
25460 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
25470 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77  d(pBuf, iLastRow
25480 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20  id, iRowid) {   
25490 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20      \.  assert( 
254a0 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20  (pBuf)->n!=0 || 
254b0 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20  (iLastRowid)==0 
254c0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
254d0 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66       \.  fts5Buf
254e0 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
254f0 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f  int((pBuf), (iRo
25500 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77  wid) - (iLastRow
25510 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74  id)); \.  (iLast
25520 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64  Rowid) = (iRowid
25530 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25550 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
25560 2a 20 53 77 61 70 20 74 68 65 20 63 6f 6e 74 65  * Swap the conte
25570 6e 74 73 20 6f 66 20 62 75 66 66 65 72 20 2a 70  nts of buffer *p
25580 31 20 77 69 74 68 20 74 68 61 74 20 6f 66 20 2a  1 with that of *
25590 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  p2..*/.static vo
255a0 69 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61  id fts5BufferSwa
255b0 70 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31  p(Fts5Buffer *p1
255c0 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32  , Fts5Buffer *p2
255d0 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ){.  Fts5Buffer 
255e0 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31  tmp = *p1;.  *p1
255f0 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20   = *p2;.  *p2 = 
25600 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  tmp;.}..static v
25610 6f 69 64 20 66 74 73 35 4e 65 78 74 52 6f 77 69  oid fts5NextRowi
25620 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  d(Fts5Buffer *pB
25630 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66 2c 20  uf, int *piOff, 
25640 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20  i64 *piRowid){. 
25650 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66 66 3b   int i = *piOff;
25660 0a 20 20 69 66 28 20 69 3e 3d 70 42 75 66 2d 3e  .  if( i>=pBuf->
25670 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66 66 20  n ){.    *piOff 
25680 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
25690 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20     u64 iVal;.   
256a0 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20 73 71   *piOff = i + sq
256b0 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
256c0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d 2c 20  nt(&pBuf->p[i], 
256d0 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 52  &iVal);.    *piR
256e0 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
256f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
25700 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  is the equivalen
25710 74 20 6f 66 20 66 74 73 35 4d 65 72 67 65 50 72  t of fts5MergePr
25720 65 66 69 78 4c 69 73 74 73 28 29 20 66 6f 72 20  efixLists() for 
25730 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65  detail=none mode
25740 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73  ..** In this cas
25750 65 20 74 68 65 20 62 75 66 66 65 72 73 20 63 6f  e the buffers co
25760 6e 73 69 73 74 20 6f 66 20 61 20 64 65 6c 74 61  nsist of a delta
25770 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74 20 6f 66  -encoded list of
25780 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a 2a 2f   rowids only..*/
25790 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
257a0 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73  5MergeRowidLists
257b0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
257c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
257d0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
257e0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
257f0 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25810 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f  /* First list to
25820 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35   merge */.  Fts5
25830 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20  Buffer *p2      
25840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25850 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65  econd list to me
25860 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rge */.){.  int 
25870 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 32  i1 = 0;.  int i2
25880 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77   = 0;.  i64 iRow
25890 69 64 31 20 3d 20 30 3b 0a 20 20 69 36 34 20 69  id1 = 0;.  i64 i
258a0 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20 69 36  Rowid2 = 0;.  i6
258b0 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 46  4 iOut = 0;..  F
258c0 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20  ts5Buffer out;. 
258d0 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c   memset(&out, 0,
258e0 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20   sizeof(out));. 
258f0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
25900 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
25910 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d  out, p1->n + p2-
25920 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  >n);.  if( p->rc
25930 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74   ) return;..  ft
25940 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20  s5NextRowid(p1, 
25950 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a  &i1, &iRowid1);.
25960 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
25970 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64  p2, &i2, &iRowid
25980 32 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 31 3e  2);.  while( i1>
25990 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b 0a 20  =0 || i2>=0 ){. 
259a0 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20     if( i1>=0 && 
259b0 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69 64 31  (i2<0 || iRowid1
259c0 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a 20 20 20  <iRowid2) ){.   
259d0 20 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d     assert( iOut=
259e0 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e 69 4f  =0 || iRowid1>iO
259f0 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ut );.      fts5
25a00 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
25a10 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f  Varint(&out, iRo
25a20 77 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a 20 20  wid1 - iOut);.  
25a30 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69      iOut = iRowi
25a40 64 31 3b 0a 20 20 20 20 20 20 66 74 73 35 4e 65  d1;.      fts5Ne
25a50 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c  xtRowid(p1, &i1,
25a60 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20   &iRowid1);.    
25a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
25a80 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20  ert( iOut==0 || 
25a90 69 52 6f 77 69 64 32 3e 69 4f 75 74 20 29 3b 0a  iRowid2>iOut );.
25aa0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
25ab0 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
25ac0 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 32 20 2d  (&out, iRowid2 -
25ad0 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f   iOut);.      iO
25ae0 75 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20 20  ut = iRowid2;.  
25af0 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26      if( i1>=0 &&
25b00 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77 69 64   iRowid1==iRowid
25b10 32 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  2 ){.        fts
25b20 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26  5NextRowid(p1, &
25b30 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20  i1, &iRowid1);. 
25b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
25b50 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26  5NextRowid(p2, &
25b60 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20  i2, &iRowid2);. 
25b70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
25b80 42 75 66 66 65 72 53 77 61 70 28 26 6f 75 74 2c  BufferSwap(&out,
25b90 20 70 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66   p1);.  fts5Buff
25ba0 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d 0a  erFree(&out);.}.
25bb0 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70  ./*.** Buffers p
25bc0 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e  1 and p2 contain
25bd0 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20   doclists. This 
25be0 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20  function merges 
25bf0 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f  the content.** o
25c00 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73  f the two doclis
25c10 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20  ts together and 
25c20 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74  sets buffer p1 t
25c30 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66  o the result bef
25c40 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
25c50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
25c60 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
25c70 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
25c80 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61  t in p->rc. If a
25c90 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61  n error has.** a
25ca0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
25cb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25cc0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
25cd0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
25ce0 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a  rgePrefixLists(.
25cf0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d10 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
25d20 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
25d30 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20  s5Buffer *p1,   
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d50 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d   First list to m
25d60 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  erge */.  Fts5Bu
25d70 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20  ffer *p2        
25d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
25d90 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  ond list to merg
25da0 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32  e */.){.  if( p2
25db0 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ->n ){.    i64 i
25dc0 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
25dd0 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
25de0 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44  er i1;.    Fts5D
25df0 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20  oclistIter i2;. 
25e00 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75     Fts5Buffer ou
25e10 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20  t = {0, 0, 0};. 
25e20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d     Fts5Buffer tm
25e30 70 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a  p = {0, 0, 0};..
25e40 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
25e50 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  um size of the o
25e60 75 74 70 75 74 20 69 73 20 65 71 75 61 6c 20 74  utput is equal t
25e70 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
25e80 20 74 77 6f 20 0a 20 20 20 20 2a 2a 20 69 6e 70   two .    ** inp
25e90 75 74 20 73 69 7a 65 73 20 2b 20 31 20 76 61 72  ut sizes + 1 var
25ea0 69 6e 74 20 28 39 20 62 79 74 65 73 29 2e 20 54  int (9 bytes). T
25eb0 68 65 20 65 78 74 72 61 20 76 61 72 69 6e 74 20  he extra varint 
25ec0 69 73 20 62 65 63 61 75 73 65 20 69 66 20 74 68  is because if th
25ed0 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 72  e.    ** first r
25ee0 6f 77 69 64 20 69 6e 20 6f 6e 65 20 69 6e 70 75  owid in one inpu
25ef0 74 20 69 73 20 61 20 6c 61 72 67 65 20 6e 65 67  t is a large neg
25f00 61 74 69 76 65 20 6e 75 6d 62 65 72 2c 20 61 6e  ative number, an
25f10 64 20 74 68 65 20 66 69 72 73 74 20 69 6e 0a 20  d the first in. 
25f20 20 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20     ** the other 
25f30 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e  a non-negative n
25f40 75 6d 62 65 72 2c 20 74 68 65 20 64 65 6c 74 61  umber, the delta
25f50 20 66 6f 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67   for the non-neg
25f60 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  ative.    ** num
25f70 62 65 72 20 77 69 6c 6c 20 62 65 20 6c 61 72 67  ber will be larg
25f80 65 72 20 6f 6e 20 64 69 73 6b 20 74 68 61 6e 20  er on disk than 
25f90 74 68 65 20 6c 69 74 65 72 61 6c 20 69 6e 74 65  the literal inte
25fa0 67 65 72 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  ger value.    **
25fb0 20 77 61 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66   was.  */.    if
25fc0 28 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  ( sqlite3Fts5Buf
25fd0 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
25fe0 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32  &out, p1->n + p2
25ff0 2d 3e 6e 20 2b 20 39 29 20 29 20 72 65 74 75 72  ->n + 9) ) retur
26000 6e 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  n;.    fts5Docli
26010 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20 26  stIterInit(p1, &
26020 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  i1);.    fts5Doc
26030 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c  listIterInit(p2,
26040 20 26 69 32 29 3b 0a 0a 20 20 20 20 77 68 69 6c   &i2);..    whil
26050 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
26060 28 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69  ( i1.iRowid<i2.i
26070 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
26080 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
26090 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20  rom i1 */.      
260a0 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
260b0 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
260c0 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77  stRowid, i1.iRow
260d0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
260e0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
260f0 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61  dBlob(&out, i1.a
26100 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
26110 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b 0a  list+i1.nSize);.
26120 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
26130 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29  istIterNext(&i1)
26140 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
26150 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62  .aPoslist==0 ) b
26160 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
26170 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e      else if( i2.
26180 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69  iRowid!=i1.iRowi
26190 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
261a0 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
261b0 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i2 */.        ft
261c0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
261d0 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
261e0 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b  wid, i2.iRowid);
261f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
26200 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
26210 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c  b(&out, i2.aPosl
26220 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  ist, i2.nPoslist
26230 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20  +i2.nSize);.    
26240 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
26250 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20  terNext(&i2);.  
26260 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f        if( i2.aPo
26270 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  slist==0 ) break
26280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
262a0 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20 70   Merge the two p
262b0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a  osition lists. *
262c0 2f 20 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  / .        i64 i
262d0 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  Pos1 = 0;.      
262e0 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30 3b    i64 iPos2 = 0;
262f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
26300 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  f1 = 0;.        
26310 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a 20  int iOff2 = 0;. 
26320 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20         u8 *a1 = 
26330 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31 2e  &i1.aPoslist[i1.
26340 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  nSize];.        
26350 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50 6f  u8 *a2 = &i2.aPo
26360 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b  slist[i2.nSize];
26370 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
26380 70 79 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  py;.        u8 *
26390 61 43 6f 70 79 3b 0a 0a 20 20 20 20 20 20 20 20  aCopy;..        
263a0 69 36 34 20 69 50 72 65 76 20 3d 20 30 3b 0a 20  i64 iPrev = 0;. 
263b0 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69         Fts5Posli
263c0 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  stWriter writer;
263d0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
263e0 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  &writer, 0, size
263f0 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20  of(writer));..  
26400 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
26410 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
26420 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e   iLastRowid, i2.
26430 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
26440 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
26450 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73  &tmp);.        s
26460 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
26470 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 74 6d  Size(&p->rc, &tm
26480 70 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2b  p, i1.nPoslist +
26490 20 69 32 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20   i2.nPoslist);. 
264a0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
264b0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
264c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
264d0 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20  slistNext64(a1, 
264e0 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i1.nPoslist, &iO
264f0 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20  ff1, &iPos1);.  
26500 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
26510 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
26520 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  2, i2.nPoslist, 
26530 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b  &iOff2, &iPos2);
26540 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26550 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f   iPos1>=0 && iPo
26560 73 32 3e 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  s2>=0 );..      
26570 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50 6f 73    if( iPos1<iPos
26580 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  2 ){.          s
26590 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
265a0 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
265b0 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29  , &iPrev, iPos1)
265c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
265d0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
265e0 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73  xt64(a1, i1.nPos
265f0 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69  list, &iOff1, &i
26600 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  Pos1);.        }
26610 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26620 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
26630 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d  stSafeAppend(&tm
26640 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32  p, &iPrev, iPos2
26650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
26660 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
26670 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f  ext64(a2, i2.nPo
26680 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26  slist, &iOff2, &
26690 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
266a0 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  }..        if( i
266b0 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32  Pos1>=0 && iPos2
266c0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
266d0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
266e0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
266f0 73 31 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20  s1<iPos2 ){.    
26700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
26710 6f 73 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20  os1!=iPrev ){.  
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 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
26750 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b   &iPrev, iPos1);
26760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
26780 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
26790 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e  tNext64(a1, i1.n
267a0 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c  Poslist, &iOff1,
267b0 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20   &iPos1);.      
267c0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
267d0 31 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  1<0 ) break;.   
267e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
267f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
26800 73 65 72 74 5f 6e 63 28 20 69 50 6f 73 32 21 3d  sert_nc( iPos2!=
26810 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20 20  iPrev );.       
26820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
26830 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70  s5PoslistSafeApp
26840 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76  end(&tmp, &iPrev
26850 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20  , iPos2);.      
26860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
26870 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
26880 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  (a2, i2.nPoslist
26890 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32  , &iOff2, &iPos2
268a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
268b0 20 69 66 28 20 69 50 6f 73 32 3c 30 20 29 20 62   if( iPos2<0 ) b
268c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
268d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
268e0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
268f0 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d 30 20     if( iPos1>=0 
26900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
26910 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29 7b   iPos1!=iPrev ){
26920 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26930 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
26940 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
26950 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a  &iPrev, iPos1);.
26960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26970 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20 26 61        aCopy = &a
26980 31 5b 69 4f 66 66 31 5d 3b 0a 20 20 20 20 20 20  1[iOff1];.      
26990 20 20 20 20 6e 43 6f 70 79 20 3d 20 69 31 2e 6e      nCopy = i1.n
269a0 50 6f 73 6c 69 73 74 20 2d 20 69 4f 66 66 31 3b  Poslist - iOff1;
269b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
269c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
269d0 28 20 69 50 6f 73 32 3e 3d 30 20 26 26 20 69 50  ( iPos2>=0 && iP
269e0 6f 73 32 21 3d 69 50 72 65 76 20 29 3b 0a 20 20  os2!=iPrev );.  
269f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
26a00 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
26a10 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
26a20 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  v, iPos2);.     
26a30 20 20 20 20 20 61 43 6f 70 79 20 3d 20 26 61 32       aCopy = &a2
26a40 5b 69 4f 66 66 32 5d 3b 0a 20 20 20 20 20 20 20  [iOff2];.       
26a50 20 20 20 6e 43 6f 70 79 20 3d 20 69 32 2e 6e 50     nCopy = i2.nP
26a60 6f 73 6c 69 73 74 20 2d 20 69 4f 66 66 32 3b 0a  oslist - iOff2;.
26a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26a80 20 20 69 66 28 20 6e 43 6f 70 79 3e 30 20 29 7b    if( nCopy>0 ){
26a90 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
26aa0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
26ab0 6c 6f 62 28 26 74 6d 70 2c 20 61 43 6f 70 79 2c  lob(&tmp, aCopy,
26ac0 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20   nCopy);.       
26ad0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
26ae0 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
26af0 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
26b00 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
26b10 61 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e  arint(&out, tmp.
26b20 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20  n * 2);.        
26b30 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
26b40 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74  pendBlob(&out, t
26b50 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20  mp.p, tmp.n);.  
26b60 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
26b70 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a  tIterNext(&i1);.
26b80 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
26b90 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29  istIterNext(&i2)
26ba0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26bb0 28 20 6f 75 74 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b  ( out.n<=(p1->n+
26bc0 70 32 2d 3e 6e 2b 39 29 20 29 3b 0a 20 20 20 20  p2->n+9) );.    
26bd0 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c      if( i1.aPosl
26be0 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 61 50 6f  ist==0 || i2.aPo
26bf0 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  slist==0 ) break
26c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26c10 0a 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73  .    if( i1.aPos
26c20 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74  list ){.      ft
26c30 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
26c40 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
26c50 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
26c60 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
26c70 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
26c80 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73  &out, i1.aPoslis
26c90 74 2c 20 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e  t, i1.aEof - i1.
26ca0 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d  aPoslist);.    }
26cb0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32  .    else if( i2
26cc0 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20  .aPoslist ){.   
26cd0 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
26ce0 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
26cf0 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
26d00 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35  wid);.      fts5
26d10 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
26d20 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50  Blob(&out, i2.aP
26d30 6f 73 6c 69 73 74 2c 20 69 32 2e 61 45 6f 66 20  oslist, i2.aEof 
26d40 2d 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a  - i2.aPoslist);.
26d50 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
26d60 28 20 6f 75 74 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b  ( out.n<=(p1->n+
26d70 70 32 2d 3e 6e 2b 39 29 20 29 3b 0a 0a 20 20 20  p2->n+9) );..   
26d80 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
26d90 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e  p->rc, p1, out.n
26da0 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66 74  , out.p);.    ft
26db0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 6d  s5BufferFree(&tm
26dc0 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
26dd0 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 20 20  erFree(&out);.  
26de0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
26df0 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
26e00 49 74 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65  Iter(.  Fts5Inde
26e10 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
26e20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
26e30 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
26e40 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20  .  int bDesc,   
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22     /* True for "
26e70 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
26e80 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ESC" */.  const 
26e90 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20  u8 *pToken,     
26ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
26eb0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
26ec0 72 65 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a  refix to match *
26ed0 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  /.  int nToken, 
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ef0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
26f00 75 66 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20  uffer pToken in 
26f10 62 79 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 43  bytes */.  Fts5C
26f20 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
26f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26f40 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
26f50 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
26f60 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a  */.  Fts5Iter **
26f70 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
26f80 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
26f90 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ator */.){.  Fts
26fa0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
26fb0 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65  uct;.  Fts5Buffe
26fc0 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74  r *aBuf;.  const
26fd0 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a   int nBuf = 32;.
26fe0 0a 20 20 76 6f 69 64 20 28 2a 78 4d 65 72 67 65  .  void (*xMerge
26ff0 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74  )(Fts5Index*, Ft
27000 73 35 42 75 66 66 65 72 2a 2c 20 46 74 73 35 42  s5Buffer*, Fts5B
27010 75 66 66 65 72 2a 29 3b 0a 20 20 76 6f 69 64 20  uffer*);.  void 
27020 28 2a 78 41 70 70 65 6e 64 29 28 46 74 73 35 49  (*xAppend)(Fts5I
27030 6e 64 65 78 2a 2c 20 69 36 34 2c 20 46 74 73 35  ndex*, i64, Fts5
27040 49 74 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65  Iter*, Fts5Buffe
27050 72 2a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43  r*);.  if( p->pC
27060 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
27070 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
27080 20 29 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d   ){.    xMerge =
27090 20 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c   fts5MergeRowidL
270a0 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e  ists;.    xAppen
270b0 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64 52 6f  d = fts5AppendRo
270c0 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
270d0 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d    xMerge = fts5M
270e0 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 3b  ergePrefixLists;
270f0 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66  .    xAppend = f
27100 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  ts5AppendPoslist
27110 3b 0a 20 20 7d 0a 0a 20 20 61 42 75 66 20 3d 20  ;.  }..  aBuf = 
27120 28 46 74 73 35 42 75 66 66 65 72 2a 29 66 74 73  (Fts5Buffer*)fts
27130 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
27140 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
27150 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63  *nBuf);.  pStruc
27160 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
27170 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28  eRead(p);..  if(
27180 20 61 42 75 66 20 26 26 20 70 53 74 72 75 63 74   aBuf && pStruct
27190 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
271a0 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e  t flags = FTS5IN
271b0 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 0a  DEX_QUERY_SCAN .
271c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271d0 20 20 20 20 7c 20 46 54 53 35 49 4e 44 45 58 5f      | FTS5INDEX_
271e0 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 20  QUERY_SKIPEMPTY 
271f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27200 20 20 20 20 20 7c 20 46 54 53 35 49 4e 44 45 58       | FTS5INDEX
27210 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b  _QUERY_NOOUTPUT;
27220 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
27230 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d  i64 iLastRowid =
27240 20 30 3b 0a 20 20 20 20 46 74 73 35 49 74 65 72   0;.    Fts5Iter
27250 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a   *p1 = 0;     /*
27260 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74   Iterator used t
27270 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66 72  o gather data fr
27280 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  om index */.    
27290 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
272a0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
272b0 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74  doclist;.    int
272c0 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 0a   bNewTerm = 1;..
272d0 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c      memset(&docl
272e0 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ist, 0, sizeof(d
272f0 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 74  oclist));.    ft
27300 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
27310 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
27320 2c 20 70 43 6f 6c 73 65 74 2c 20 70 54 6f 6b 65  , pColset, pToke
27330 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30  n, nToken, -1, 0
27340 2c 20 26 70 31 29 3b 0a 20 20 20 20 66 74 73 35  , &p1);.    fts5
27350 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28  IterSetOutputCb(
27360 26 70 2d 3e 72 63 2c 20 70 31 29 3b 0a 20 20 20  &p->rc, p1);.   
27370 20 66 6f 72 28 20 2f 2a 20 6e 6f 2d 6f 70 20 2a   for( /* no-op *
27380 2f 20 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  / ;.        fts5
27390 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
273a0 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  p1)==0;.        
273b0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
273c0 74 32 28 70 2c 20 70 31 2c 20 26 62 4e 65 77 54  t2(p, p1, &bNewT
273d0 65 72 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  erm).    ){.    
273e0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
273f0 53 65 67 20 3d 20 26 70 31 2d 3e 61 53 65 67 5b  Seg = &p1->aSeg[
27400 20 70 31 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69   p1->aFirst[1].i
27410 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 69  First ];.      i
27420 6e 74 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d  nt nTerm = pSeg-
27430 3e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 63  >term.n;.      c
27440 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d  onst u8 *pTerm =
27450 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 3b 0a 20   pSeg->term.p;. 
27460 20 20 20 20 20 70 31 2d 3e 78 53 65 74 4f 75 74       p1->xSetOut
27470 70 75 74 73 28 70 31 2c 20 70 53 65 67 29 3b 0a  puts(p1, pSeg);.
27480 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
27490 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  ( memcmp(pToken,
274a0 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b   pTerm, MIN(nTok
274b0 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29  en, nTerm))<=0 )
274c0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4e 65 77  ;.      if( bNew
274d0 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
274e0 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e  if( nTerm<nToken
274f0 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65   || memcmp(pToke
27500 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e  n, pTerm, nToken
27510 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
27520 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31   }..      if( p1
27530 2d 3e 62 61 73 65 2e 6e 44 61 74 61 3d 3d 30 20  ->base.nData==0 
27540 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
27550 20 20 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e     if( p1->base.
27560 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77  iRowid<=iLastRow
27570 69 64 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3e  id && doclist.n>
27580 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
27590 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
275a0 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73  ITE_OK && doclis
275b0 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  t.n; i++){.     
275c0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
275d0 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Buf );.         
275e0 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d   if( aBuf[i].n==
275f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27600 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
27610 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
27620 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
27630 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
27640 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  &doclist);.     
27650 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27660 20 20 20 20 20 20 20 20 78 4d 65 72 67 65 28 70          xMerge(p
27670 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75  , &doclist, &aBu
27680 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  f[i]);.         
27690 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
276a0 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  o(&aBuf[i]);.   
276b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
276c0 20 7d 0a 20 20 20 20 20 20 20 20 69 4c 61 73 74   }.        iLast
276d0 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Rowid = 0;.     
276e0 20 7d 0a 0a 20 20 20 20 20 20 78 41 70 70 65 6e   }..      xAppen
276f0 64 28 70 2c 20 70 31 2d 3e 62 61 73 65 2e 69 52  d(p, p1->base.iR
27700 6f 77 69 64 2d 69 4c 61 73 74 52 6f 77 69 64 2c  owid-iLastRowid,
27710 20 70 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a   p1, &doclist);.
27720 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64        iLastRowid
27730 20 3d 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77   = p1->base.iRow
27740 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  id;.    }..    f
27750 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20  or(i=0; i<nBuf; 
27760 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
27770 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
27780 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4d 65 72   ){.        xMer
27790 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20  ge(p, &doclist, 
277a0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
277b0 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66   }.      fts5Buf
277c0 66 65 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d  ferFree(&aBuf[i]
277d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
277e0 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
277f0 31 29 3b 0a 0a 20 20 20 20 70 44 61 74 61 20 3d  1);..    pData =
27800 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
27810 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  , sizeof(Fts5Dat
27820 61 29 2b 64 6f 63 6c 69 73 74 2e 6e 2b 46 54 53  a)+doclist.n+FTS
27830 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
27840 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70 44  ING);.    if( pD
27850 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61  ata ){.      pDa
27860 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44  ta->p = (u8*)&pD
27870 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44  ata[1];.      pD
27880 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d  ata->nn = pData-
27890 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73  >szLeaf = doclis
278a0 74 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t.n;.      if( d
278b0 6f 63 6c 69 73 74 2e 6e 20 29 20 6d 65 6d 63 70  oclist.n ) memcp
278c0 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c  y(pData->p, docl
278d0 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e  ist.p, doclist.n
278e0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
278f0 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44  tiIterNew2(p, pD
27900 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74  ata, bDesc, ppIt
27910 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
27920 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64  ts5BufferFree(&d
27930 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  oclist);.  }..  
27940 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
27950 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
27960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42   sqlite3_free(aB
27970 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  uf);.}.../*.** I
27980 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c  ndicate that all
27990 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
279a0 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  s to sqlite3Fts5
279b0 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72  IndexWrite() per
279c0 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tain.** to the d
279d0 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77  ocument with row
279e0 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  id iRowid..*/.in
279f0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
27a00 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73  exBeginWrite(Fts
27a10 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62  5Index *p, int b
27a20 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77  Delete, i64 iRow
27a30 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  id){.  assert( p
27a40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
27a50 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
27a60 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
27a70 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
27a80 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
27a90 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  cated */.  if( p
27aa0 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->pHash==0 ){.  
27ab0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
27ac0 33 46 74 73 35 48 61 73 68 4e 65 77 28 70 2d 3e  3Fts5HashNew(p->
27ad0 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70 48 61  pConfig, &p->pHa
27ae0 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67  sh, &p->nPending
27af0 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Data);.  }..  /*
27b00 20 46 6c 75 73 68 20 74 68 65 20 68 61 73 68 20   Flush the hash 
27b10 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 69 66  table to disk if
27b20 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
27b30 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72  f( iRowid<p->iWr
27b40 69 74 65 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20  iteRowid .   || 
27b50 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69  (iRowid==p->iWri
27b60 74 65 52 6f 77 69 64 20 26 26 20 70 2d 3e 62 44  teRowid && p->bD
27b70 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  elete==0).   || 
27b80 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  (p->nPendingData
27b90 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   > p->pConfig->n
27ba0 48 61 73 68 53 69 7a 65 29 20 0a 20 20 29 7b 0a  HashSize) .  ){.
27bb0 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75      fts5IndexFlu
27bc0 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d  sh(p);.  }..  p-
27bd0 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69  >iWriteRowid = i
27be0 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c  Rowid;.  p->bDel
27bf0 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20  ete = bDelete;. 
27c00 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
27c10 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
27c20 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61  *.** Commit data
27c30 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
27c40 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27c50 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20  xSync(Fts5Index 
27c60 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
27c70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
27c80 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c  );.  fts5IndexFl
27c90 75 73 68 28 70 29 3b 0a 20 20 66 74 73 35 43 6c  ush(p);.  fts5Cl
27ca0 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
27cb0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
27cc0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
27cd0 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20  .** Discard any 
27ce0 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
27cf0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
27d00 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74  h tables. Do not
27d10 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20   write it.** to 
27d20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
27d30 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75  ditionally, assu
27d40 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  me that the cont
27d50 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61  ents of the %_da
27d60 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20  ta.** table may 
27d70 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20  have changed on 
27d80 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d  disk. So any in-
27d90 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66  memory caches of
27da0 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f   %_data .** reco
27db0 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61  rds must be inva
27dc0 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  lidated..*/.int 
27dd0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27de0 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64  Rollback(Fts5Ind
27df0 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c  ex *p){.  fts5Cl
27e00 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
27e10 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
27e20 44 61 74 61 28 70 29 3b 0a 20 20 66 74 73 35 53  Data(p);.  fts5S
27e30 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
27e40 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65  te(p);.  /* asse
27e50 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
27e60 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74  E_OK ); */.  ret
27e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27e80 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61  ../*.** The %_da
27e90 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  ta table is comp
27ea0 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65  letely empty whe
27eb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27ec0 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a  is called. This.
27ed0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75  ** function popu
27ee0 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74 68  lates it with th
27ef0 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74  e initial struct
27f00 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ure objects for 
27f10 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61  each index,.** a
27f20 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  nd the initial v
27f30 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61  ersion of the "a
27f40 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
27f50 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f  (a zero-byte blo
27f60 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
27f70 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69  e3Fts5IndexReini
27f80 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
27f90 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
27fa0 20 73 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74   s;.  fts5Struct
27fb0 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
27fc0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
27fd0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
27fe0 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35  ucture));.  fts5
27ff0 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
28000 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
28010 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c  , (const u8*)"",
28020 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   0);.  fts5Struc
28030 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29  tureWrite(p, &s)
28040 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
28050 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
28060 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
28070 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ew Fts5Index han
28080 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65  dle. If the bCre
28090 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ate argument is 
280a0 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20  true, create.** 
280b0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
280c0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f  he underlying %_
280d0 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
280e0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
280f0 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
28100 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
28110 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
28120 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
28130 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20  erwise, set *pp 
28140 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75  to NULL and retu
28150 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
28160 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
28170 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28180 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66  Open(.  Fts5Conf
28190 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
281a0 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20  int bCreate, .  
281b0 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a  Fts5Index **pp,.
281c0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
281d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
281e0 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e  ITE_OK;.  Fts5In
281f0 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
28200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
28210 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70   object */..  *p
28220 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64  p = p = (Fts5Ind
28230 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  ex*)sqlite3Fts5M
28240 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
28250 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29  izeof(Fts5Index)
28260 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
28270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
28280 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
28290 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b  ig;.    p->nWork
282a0 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b  Unit = FTS5_WORK
282b0 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44  _UNIT;.    p->zD
282c0 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ataTbl = sqlite3
282d0 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
282e0 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e   "%s_data", pCon
282f0 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  fig->zName);.   
28300 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c   if( p->zDataTbl
28310 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20   && bCreate ){. 
28320 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28330 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
28340 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  (.          pCon
28350 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
28360 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
28370 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
28380 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
28390 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72    );.      if( r
283a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
283b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
283c0 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
283d0 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64  ble(pConfig, "id
283e0 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  x", .           
283f0 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70   "segid, term, p
28400 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  gno, PRIMARY KEY
28410 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20  (segid, term)", 
28420 0a 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  .            1, 
28430 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b  pzErr.        );
28440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28460 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28470 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28480 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20  xReinit(p);.    
28490 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
284a0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
284b0 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
284c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
284d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
284e0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c  lite3Fts5IndexCl
284f0 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20  ose(p);.    *pp 
28500 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
28510 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
28520 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70  lose a handle op
28530 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
28540 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
28550 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
28560 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
28570 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
28580 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
28590 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
285a0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  _OK;.  if( p ){.
285b0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
285c0 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
285d0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
285e0 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 20  validate(p);.   
285f0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
28600 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20  e(p->pWriter);. 
28610 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
28620 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  ize(p->pDeleter)
28630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
28640 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72  nalize(p->pIdxWr
28650 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
28660 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
28670 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20  IdxDeleter);.   
28680 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
28690 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  e(p->pIdxSelect)
286a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
286b0 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61 74 61 56  nalize(p->pDataV
286c0 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c  ersion);.    sql
286d0 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65  ite3Fts5HashFree
286e0 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
286f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
28700 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73  zDataTbl);.    s
28710 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
28720 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
28740 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
28750 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
28760 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68  ng utf-8 text th
28770 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e  at is n bytes in
28780 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72   .** size. Retur
28790 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
287a0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68  bytes in the nCh
287b0 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65  ar character pre
287c0 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75  fix of the.** bu
287d0 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68  ffer, or 0 if th
287e0 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
287f0 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  n nChar characte
28800 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a  rs in total..*/.
28810 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
28820 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
28830 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  elen(.  const ch
28840 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42  ar *p, .  int nB
28850 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61  yte, .  int nCha
28860 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  r.){.  int n = 0
28870 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
28880 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69  (i=0; i<nChar; i
28890 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  ++){.    if( n>=
288a0 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e 20 30  nByte ) return 0
288b0 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20  ;      /* Input 
288c0 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
288d0 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20  han nChar chars 
288e0 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69  */.    if( (unsi
288f0 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d  gned char)p[n++]
28900 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
28910 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30  while( (p[n] & 0
28920 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20  xc0)==0x80 ){.  
28930 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
28940 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20     if( n>=nByte 
28950 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
28960 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28970 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
28980 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65  pIn is a UTF-8 e
28990 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e  ncoded string, n
289a0 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  In bytes in size
289b0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
289c0 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64  ber of.** unicod
289d0 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  e characters in 
289e0 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  the string..*/.s
289f0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
28a00 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74  dexCharlen(const
28a10 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20   char *pIn, int 
28a20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  nIn){.  int nCha
28a30 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
28a40 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a    .  int i = 0;.
28a50 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29    while( i<nIn )
28a60 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67  {.    if( (unsig
28a70 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b  ned char)pIn[i++
28a80 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20  ]>=0xc0 ){.     
28a90 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26   while( i<nIn &&
28aa0 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29   (pIn[i] & 0xc0)
28ab0 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20  ==0x80 ) i++;.  
28ac0 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b    }.    nChar++;
28ad0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
28ae0 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  har;.}../*.** In
28af0 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64  sert or remove d
28b00 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ata to or from t
28b10 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74  he index. Each t
28b20 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  ime a document i
28b30 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f  s .** added to o
28b40 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  r removed from t
28b50 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66  he index, this f
28b60 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
28b70 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  d one or more.**
28b80 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   times..**.** Fo
28b90 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20  r an insert, it 
28ba0 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f  must be called o
28bb0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b  nce for each tok
28bc0 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f  en in the new do
28bd0 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68  cument..** If th
28be0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
28bf0 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74   delete, it must
28c00 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c   be called (at l
28c10 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65  east) once for e
28c20 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f  ach.** unique to
28c30 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  ken in the docum
28c40 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c  ent with an iCol
28c50 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e   value less than
28c60 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a   zero. The iPos.
28c70 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
28c80 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c  gnored for a del
28c90 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ete..*/.int sqli
28ca0 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
28cb0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
28cc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
28cd0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
28ce0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
28cf0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d10 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
28d20 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
28d30 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
28d40 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d60 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
28d70 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
28d80 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
28d90 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
28da0 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
28db0 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
28dc0 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
28dd0 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  x */.){.  int i;
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
28e00 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
28e10 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
28e20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28e30 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
28e40 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28e50 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
28e60 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
28e70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72  Config;..  asser
28e80 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
28e90 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
28ea0 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44   (iCol<0)==p->bD
28eb0 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  elete );..  /* A
28ec0 64 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  dd the entry to 
28ed0 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69  the main terms i
28ee0 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ndex. */.  rc = 
28ef0 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57  sqlite3Fts5HashW
28f00 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70  rite(.      p->p
28f10 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52  Hash, p->iWriteR
28f20 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
28f30 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  , FTS5_MAIN_PREF
28f40 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  IX, pToken, nTok
28f50 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69  en.  );..  for(i
28f60 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e  =0; i<pConfig->n
28f70 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51  Prefix && rc==SQ
28f80 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
28f90 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68     const int nCh
28fa0 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50  ar = pConfig->aP
28fb0 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e  refix[i];.    in
28fc0 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
28fd0 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65  3Fts5IndexCharle
28fe0 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65  nToBytelen(pToke
28ff0 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72  n, nToken, nChar
29000 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
29010 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
29020 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
29030 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20  ite(p->pHash, . 
29040 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69           p->iWri
29050 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
29060 50 6f 73 2c 20 28 63 68 61 72 29 28 46 54 53 35  Pos, (char)(FTS5
29070 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31  _MAIN_PREFIX+i+1
29080 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20  ), pToken,.     
29090 20 20 20 20 20 6e 42 79 74 65 0a 20 20 20 20 20       nByte.     
290a0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
290b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
290c0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
290d0 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72  iterator to iter
290e0 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72  ate though all r
290f0 6f 77 69 64 20 74 68 61 74 20 6d 61 74 63 68 20  owid that match 
29100 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  the .** specifie
29110 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e  d token or token
29120 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20   prefix..*/.int 
29130 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
29140 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64  Query(.  Fts5Ind
29150 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
29160 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
29170 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a  index to query *
29180 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
29190 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
291a0 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72  en, /* Token (or
291b0 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65 72   prefix) to quer
291c0 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66  y for */.  int f
291d0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
291e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
291f0 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
29200 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f  QUERY_X flags */
29210 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
29220 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
29230 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73     /* Match thes
29240 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a  e columns only *
29250 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
29260 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20  r **ppIter      
29270 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
29280 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
29290 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  */.){.  Fts5Conf
292a0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
292b0 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35  >pConfig;.  Fts5
292c0 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a  Iter *pRet = 0;.
292d0 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
292e0 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20   = {0, 0, 0};.. 
292f0 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59   /* If the QUERY
29300 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65  _SCAN flag is se
29310 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  t, all other fla
29320 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  gs must be clear
29330 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
29340 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
29350 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30  X_QUERY_SCAN)==0
29360 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49   || flags==FTS5I
29370 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
29380 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
29390 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
293a0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54  &p->rc, &buf, nT
293b0 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20  oken+1)==0 ){.  
293c0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20    int iIdx = 0; 
293d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293e0 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72  /* Index to sear
293f0 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  ch */.    if( nT
29400 6f 6b 65 6e 20 29 20 6d 65 6d 63 70 79 28 26 62  oken ) memcpy(&b
29410 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c  uf.p[1], pToken,
29420 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 2f   nToken);..    /
29430 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  * Figure out whi
29440 63 68 20 69 6e 64 65 78 20 74 6f 20 73 65 61 72  ch index to sear
29450 63 68 20 61 6e 64 20 73 65 74 20 69 49 64 78 20  ch and set iIdx 
29460 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
29470 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 61  this.    ** is a
29480 20 70 72 65 66 69 78 20 71 75 65 72 79 20 66 6f   prefix query fo
29490 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
294a0 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64 65 78   no prefix index
294b0 2c 20 73 65 74 20 69 49 64 78 20 74 6f 0a 20 20  , set iIdx to.  
294c0 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
294d0 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  n pConfig->nPref
294e0 69 78 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ix to indicate t
294f0 68 61 74 20 74 68 65 20 71 75 65 72 79 20 77 69  hat the query wi
29500 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73 61 74  ll be.    ** sat
29510 69 73 66 69 65 64 20 62 79 20 73 63 61 6e 6e 69  isfied by scanni
29520 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  ng multiple term
29530 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e  s in the main in
29540 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
29550 2a 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f  ** If the QUERY_
29560 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20  TEST_NOIDX flag 
29570 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 74  was specified, t
29580 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62 65  hen this must be
29590 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69 78   a.    ** prefix
295a0 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64 20  -query. Instead 
295b0 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65 66 69  of using a prefi
295c0 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65 20  x-index (if one 
295d0 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a  exists), .    **
295e0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 70 72   evaluate the pr
295f0 65 66 69 78 20 71 75 65 72 79 20 75 73 69 6e 67  efix query using
29600 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69 6e   the main FTS in
29610 64 65 78 2e 20 54 68 69 73 20 69 73 20 75 73 65  dex. This is use
29620 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74  d.    ** for int
29630 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ernal sanity che
29640 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e 74  cking by the int
29650 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e 20  egrity-check in 
29660 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f  debug .    ** mo
29670 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69 66  de only.  */.#if
29680 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
29690 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
296a0 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d  ->bPrefixIndex==
296b0 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
296c0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
296d0 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20  ST_NOIDX) ){.   
296e0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
296f0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
29700 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20  RY_PREFIX );.   
29710 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e     iIdx = 1+pCon
29720 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20  fig->nPrefix;.  
29730 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
29740 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
29750 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
29760 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69  REFIX ){.      i
29770 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49  nt nChar = fts5I
29780 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b  ndexCharlen(pTok
29790 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
297a0 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
297b0 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
297c0 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
297d0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e          if( pCon
297e0 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
297f0 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72  x-1]==nChar ) br
29800 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
29810 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78   }..    if( iIdx
29820 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
29830 69 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ix ){.      /* S
29840 74 72 61 69 67 68 74 20 69 6e 64 65 78 20 6c 6f  traight index lo
29850 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 46 74  okup */.      Ft
29860 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
29870 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
29880 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20  tureRead(p);.   
29890 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 28 75     buf.p[0] = (u
298a0 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  8)(FTS5_MAIN_PRE
298b0 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 20  FIX + iIdx);.   
298c0 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
298d0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
298e0 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
298f0 74 72 75 63 74 2c 20 66 6c 61 67 73 20 7c 20 46  truct, flags | F
29900 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
29910 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20 20 20 20  KIPEMPTY, .     
29920 20 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2c 20         pColset, 
29930 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c  buf.p, nToken+1,
29940 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a 20 20   -1, 0, &pRet.  
29950 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29960 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
29970 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
29980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
29990 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  e{.      /* Scan
299a0 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
299b0 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65  in the main inde
299c0 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  x */.      int b
299d0 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20  Desc = (flags & 
299e0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
299f0 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20  DESC)!=0;.      
29a00 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f  buf.p[0] = FTS5_
29a10 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20  MAIN_PREFIX;.   
29a20 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66     fts5SetupPref
29a30 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c  ixIter(p, bDesc,
29a40 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
29a50 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74  , pColset, &pRet
29a60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29a70 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
29a80 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f 6c 73  K || pRet->pCols
29a90 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  et==0 );.      f
29aa0 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
29ab0 43 62 28 26 70 2d 3e 72 63 2c 20 70 52 65 74 29  Cb(&p->rc, pRet)
29ac0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
29ad0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29ae0 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
29af0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 52 65  ter *pSeg = &pRe
29b00 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e 61 46  t->aSeg[pRet->aF
29b10 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
29b20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
29b30 67 2d 3e 70 4c 65 61 66 20 29 20 70 52 65 74 2d  g->pLeaf ) pRet-
29b40 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 52 65  >xSetOutputs(pRe
29b50 74 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  t, pSeg);.      
29b60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
29b70 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20   p->rc ){.      
29b80 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
29b90 6c 6f 73 65 28 28 46 74 73 35 49 6e 64 65 78 49  lose((Fts5IndexI
29ba0 74 65 72 2a 29 70 52 65 74 29 3b 0a 20 20 20 20  ter*)pRet);.    
29bb0 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
29bc0 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
29bd0 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r(p);.    }..   
29be0 20 2a 70 70 49 74 65 72 20 3d 20 28 46 74 73 35   *ppIter = (Fts5
29bf0 49 6e 64 65 78 49 74 65 72 2a 29 70 52 65 74 3b  IndexIter*)pRet;
29c00 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
29c10 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
29c20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  ;.  }.  return f
29c30 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
29c40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
29c50 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
29c60 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
29c70 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
29c80 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a  ent is at EOF..*
29c90 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  /./*.** Move to 
29ca0 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
29cb0 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74  g rowid. .*/.int
29cc0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
29cd0 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74  Next(Fts5IndexIt
29ce0 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b  er *pIndexIter){
29cf0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
29d00 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
29d10 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 61 73  pIndexIter;.  as
29d20 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
29d30 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  dex->rc==SQLITE_
29d40 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74  OK );.  fts5Mult
29d50 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d  iIterNext(pIter-
29d60 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20  >pIndex, pIter, 
29d70 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
29d80 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
29d90 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
29da0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  }../*.** Move to
29db0 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
29dc0 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55  ng term/rowid. U
29dd0 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76  sed by the fts5v
29de0 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  ocab module..*/.
29df0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
29e00 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35  terNextScan(Fts5
29e10 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
29e20 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74  xIter){.  Fts5It
29e30 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73  er *pIter = (Fts
29e40 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
29e50 72 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r;.  Fts5Index *
29e60 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
29e70 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  x;..  assert( pI
29e80 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
29e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
29ea0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
29eb0 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
29ec0 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0);.  if( p->rc=
29ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29ee0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
29ef0 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
29f00 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
29f10 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
29f20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
29f30 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d  af && pSeg->term
29f40 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e  .p[0]!=FTS5_MAIN
29f50 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20  _PREFIX ){.     
29f60 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
29f70 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20  (pSeg->pLeaf);. 
29f80 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66       pSeg->pLeaf
29f90 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65   = 0;.      pIte
29fa0 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31  r->base.bEof = 1
29fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
29fc0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
29fd0 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
29fe0 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
29ff0 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
2a000 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74  matching rowid t
2a010 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72  hat occurs at or
2a020 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54   after iMatch. T
2a030 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e  he.** definition
2a040 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72   of "at or after
2a050 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  " depends on whe
2a060 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74  ther this iterat
2a070 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69  or iterates.** i
2a080 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64  n ascending or d
2a090 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
2a0a0 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  order..*/.int sq
2a0b0 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
2a0c0 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49  tFrom(Fts5IndexI
2a0d0 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c  ter *pIndexIter,
2a0e0 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20   i64 iMatch){.  
2a0f0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20  Fts5Iter *pIter 
2a100 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e  = (Fts5Iter*)pIn
2a110 64 65 78 49 74 65 72 3b 0a 20 20 66 74 73 35 4d  dexIter;.  fts5M
2a120 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
2a130 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
2a140 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a  pIter, iMatch);.
2a150 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2a160 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
2a170 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
2a180 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
2a190 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f  rent term..*/.co
2a1a0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
2a1b0 33 46 74 73 35 49 74 65 72 54 65 72 6d 28 46 74  3Fts5IterTerm(Ft
2a1c0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
2a1d0 64 65 78 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e  dexIter, int *pn
2a1e0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  ){.  int n;.  co
2a1f0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
2a200 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d  onst char*)fts5M
2a210 75 6c 74 69 49 74 65 72 54 65 72 6d 28 28 46 74  ultiIterTerm((Ft
2a220 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
2a230 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d  er, &n);.  *pn =
2a240 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26   n-1;.  return &
2a250 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  z[1];.}../*.** C
2a260 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72  lose an iterator
2a270 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61   opened by an ea
2a280 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71  rlier call to sq
2a290 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
2a2a0 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ery()..*/.void s
2a2b0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
2a2c0 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49 74 65  ose(Fts5IndexIte
2a2d0 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a  r *pIndexIter){.
2a2e0 20 20 69 66 28 20 70 49 6e 64 65 78 49 74 65 72    if( pIndexIter
2a2f0 20 29 7b 0a 20 20 20 20 46 74 73 35 49 74 65 72   ){.    Fts5Iter
2a300 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
2a310 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
2a320 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
2a330 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e  pIndex = pIter->
2a340 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
2a350 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
2a360 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c  ter);.    fts5Cl
2a370 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78  oseReader(pIndex
2a380 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2a390 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20  Read and decode 
2a3a0 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
2a3b0 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64  ecord from the d
2a3c0 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  atabase. .**.** 
2a3d0 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65  Parameter anSize
2a3e0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
2a3f0 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20  n array of size 
2a400 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c  nCol, where nCol
2a410 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   is.** the numbe
2a420 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65  r of user define
2a430 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
2a440 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   FTS table..*/.i
2a450 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2a460 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
2a470 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
2a480 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e   *pnRow, i64 *an
2a490 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f  Size){.  int nCo
2a4a0 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
2a4b0 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61  nCol;.  Fts5Data
2a4c0 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52   *pData;..  *pnR
2a4d0 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ow = 0;.  memset
2a4e0 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65  (anSize, 0, size
2a4f0 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b  of(i64) * nCol);
2a500 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
2a510 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
2a520 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b  AVERAGES_ROWID);
2a530 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
2a540 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
2a550 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ->nn ){.    int 
2a560 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
2a570 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74  Col;.    i += ft
2a580 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
2a590 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29  ta->p[i], (u64*)
2a5a0 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28  pnRow);.    for(
2a5b0 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d  iCol=0; i<pData-
2a5c0 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c  >nn && iCol<nCol
2a5d0 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
2a5e0 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
2a5f0 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d  int(&pData->p[i]
2a600 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b  , (u64*)&anSize[
2a610 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  iCol]);.    }.  
2a620 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  }..  fts5DataRel
2a630 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72  ease(pData);.  r
2a640 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
2a650 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
2a660 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
2a670 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73  urrent "averages
2a680 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68  " record with th
2a690 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a6a0 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70  e buffer .** sup
2a6b0 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63  plied as the sec
2a6c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
2a6d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2a6e0 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
2a6f0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63  (Fts5Index *p, c
2a700 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
2a710 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73  int nData){.  as
2a720 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
2a730 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
2a740 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
2a750 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2a760 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  , pData, nData);
2a770 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
2a780 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
2a790 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2a7a0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2a7b0 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f  f blocks this mo
2a7c0 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72  dule has read fr
2a7d0 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  om the %_data.**
2a7e0 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20   table since it 
2a7f0 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  was created..*/.
2a800 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2a810 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e  ndexReads(Fts5In
2a820 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  dex *p){.  retur
2a830 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f  n p->nRead;.}../
2a840 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d  *.** Set the 32-
2a850 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  bit cookie value
2a860 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
2a870 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75  tart of all stru
2a880 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64  cture .** record
2a890 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  s to the value p
2a8a0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a8b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
2a8c0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
2a8d0 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
2a8e0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
2a8f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2a900 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
2a910 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2a920 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f  3Fts5IndexSetCoo
2a930 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  kie(Fts5Index *p
2a940 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69  , int iNew){.  i
2a950 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a970 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a980 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
2a990 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
2a9a0 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20  >pConfig;    /* 
2a9b0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62  Configuration ob
2a9c0 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f  ject */.  u8 aCo
2a9d0 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20  okie[4];        
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a9f0 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65  * Binary represe
2aa00 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20  ntation of iNew 
2aa10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
2aa20 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20  b *pBlob = 0;.. 
2aa30 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
2aa40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
2aa50 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
2aa60 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a  aCookie, iNew);.
2aa70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2aa80 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
2aa90 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  g->db, pConfig->
2aaa0 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
2aab0 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22  , .      "block"
2aac0 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
2aad0 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f  _ROWID, 1, &pBlo
2aae0 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  b.  );.  if( rc=
2aaf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ab00 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77    sqlite3_blob_w
2ab10 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f  rite(pBlob, aCoo
2ab20 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  kie, 4, 0);.    
2ab30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
2ab40 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a  b_close(pBlob);.
2ab50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2ab60 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
2ab70 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e  Fts5IndexLoadCon
2ab80 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70  fig(Fts5Index *p
2ab90 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
2aba0 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70  re *pStruct;.  p
2abb0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
2abc0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
2abd0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2abe0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
2abf0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2ac00 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2ac10 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2ac20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2ac60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aca0 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
2acb0 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
2acc0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2acd0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
2ace0 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63  y-check .** func
2acf0 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f  tionality..*/../
2ad00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69  *.** Return a si
2ad10 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61  mple checksum va
2ad20 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  lue based on the
2ad30 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75   arguments..*/.u
2ad40 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  64 sqlite3Fts5In
2ad50 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20  dexEntryCksum(. 
2ad60 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
2ad70 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74  int iCol, .  int
2ad80 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49   iPos, .  int iI
2ad90 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
2ada0 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e   *pTerm,.  int n
2adb0 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Term.){.  int i;
2adc0 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f  .  u64 ret = iRo
2add0 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  wid;.  ret += (r
2ade0 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20  et<<3) + iCol;. 
2adf0 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
2ae00 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69   + iPos;.  if( i
2ae10 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20  Idx>=0 ) ret += 
2ae20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35  (ret<<3) + (FTS5
2ae30 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
2ae40 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Idx);.  for(i=0;
2ae50 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72   i<nTerm; i++) r
2ae60 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
2ae70 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74   pTerm[i];.  ret
2ae80 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64  urn ret;.}..#ifd
2ae90 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2aea0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2aeb0 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e  ion is purely an
2aec0 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
2aed0 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
2aee0 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
2aef0 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
2af00 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
2af10 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
2af20 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
2af30 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74  Instead, it test
2af40 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  s that the same 
2af50 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69  set of pgno/rowi
2af60 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  d combinations a
2af70 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72  re .** visited r
2af80 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2af90 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74  ther the doclist
2afa0 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65  -index identifie
2afb0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a  d by parameters.
2afc0 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20  ** iSegid/iLeaf 
2afd0 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66  is iterated in f
2afe0 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72  orwards or rever
2aff0 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  se order..*/.sta
2b000 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
2b010 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20  tDlidxReverse(. 
2b020 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
2b030 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20    int iSegid,   
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
2b060 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a  to load from */.
2b070 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20    int iLeaf     
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b090 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73    /* Load doclis
2b0a0 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73  t-index for this
2b0b0 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74   leaf */.){.  Ft
2b0c0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
2b0d0 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63  idx = 0;.  u64 c
2b0e0 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36  ksum1 = 13;.  u6
2b0f0 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a  4 cksum2 = 13;..
2b100 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
2b110 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
2b120 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65  , 0, iSegid, iLe
2b130 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  af);.      fts5D
2b140 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
2b150 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
2b160 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
2b170 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20  xt(p, pDlidx).  
2b180 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
2b190 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  d = fts5DlidxIte
2b1a0 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a  rRowid(pDlidx);.
2b1b0 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66      int pgno = f
2b1c0 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2b1d0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73  (pDlidx);.    as
2b1e0 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66  sert( pgno>iLeaf
2b1f0 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b   );.    cksum1 +
2b200 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
2b210 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
2b220 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
2b230 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
2b240 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f  Dlidx = 0;..  fo
2b250 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
2b260 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c  dxIterInit(p, 1,
2b270 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b   iSegid, iLeaf);
2b280 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
2b290 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
2b2a0 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  x)==0;.      fts
2b2b0 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70  5DlidxIterPrev(p
2b2c0 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  , pDlidx).  ){. 
2b2d0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
2b2e0 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
2b2f0 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  id(pDlidx);.    
2b300 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44  int pgno = fts5D
2b310 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2b320 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74  idx);.    assert
2b330 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  ( fts5DlidxIterP
2b340 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61  gno(pDlidx)>iLea
2b350 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20  f );.    cksum2 
2b360 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
2b370 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
2b380 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
2b390 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
2b3a0 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69  pDlidx = 0;..  i
2b3b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2b3c0 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63  _OK && cksum1!=c
2b3d0 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
2b3e0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a  FTS5_CORRUPT;.}.
2b3f0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2b400 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74  QueryCksum(.  Ft
2b410 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b430 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65   Fts5 index obje
2b440 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
2b450 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2b460 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
2b470 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79      /* Index key
2b480 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
2b490 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e     /* Size of in
2b4c0 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73  dex key in bytes
2b4d0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
2b500 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72  or Fts5IndexQuer
2b510 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73  y */.  u64 *pCks
2b520 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  um              
2b530 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2b540 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  : Checksum value
2b550 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65   */.){.  int eDe
2b560 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
2b570 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36  g->eDetail;.  u6
2b580 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75  4 cksum = *pCksu
2b590 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  m;.  Fts5IndexIt
2b5a0 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
2b5b0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2b5c0 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
2b5d0 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20  p, z, n, flags, 
2b5e0 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20 20 77  0, &pIter);..  w
2b5f0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2b600 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
2b610 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74  3Fts5IterEof(pIt
2b620 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20 72  er) ){.    i64 r
2b630 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52  owid = pIter->iR
2b640 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 65  owid;..    if( e
2b650 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
2b660 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
2b670 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74    cksum ^= sqlit
2b680 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2b690 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20  Cksum(rowid, 0, 
2b6a0 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a  0, iIdx, z, n);.
2b6b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b6c0 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
2b6d0 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20  er sReader;.    
2b6e0 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73    for(sqlite3Fts
2b6f0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
2b700 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74 61 2c  it(pIter->pData,
2b710 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26   pIter->nData, &
2b720 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  sReader);.      
2b730 20 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66      sReader.bEof
2b740 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ==0;.          s
2b750 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2b760 74 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65  tReaderNext(&sRe
2b770 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20  ader).      ){. 
2b780 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
2b790 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  = FTS5_POS2COLUM
2b7a0 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b  N(sReader.iPos);
2b7b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
2b7c0 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  f = FTS5_POS2OFF
2b7d0 53 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73  SET(sReader.iPos
2b7e0 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
2b7f0 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
2b800 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72  ndexEntryCksum(r
2b810 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66  owid, iCol, iOff
2b820 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20  , iIdx, z, n);. 
2b830 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2b840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2b860 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2b870 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20 20 20  Next(pIter);.   
2b880 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2b890 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49  Fts5IterClose(pI
2b8a0 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d  ter);..  *pCksum
2b8b0 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75   = cksum;.  retu
2b8c0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2b8d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2b8e0 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e  s also purely an
2b8f0 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
2b900 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
2b910 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
2b920 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
2b930 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
2b940 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
2b950 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61   any way..*/.sta
2b960 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
2b970 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  tTerm(.  Fts5Ind
2b980 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75  ex *p, .  Fts5Bu
2b990 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20  ffer *pPrev,    
2b9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
2b9b0 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20  vious term */.  
2b9c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
2b9d0 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
2b9e0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20  /* Possibly new 
2b9f0 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a  term to test */.
2ba00 20 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a    u64 expected,.
2ba10 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b    u64 *pCksum.){
2ba20 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
2ba30 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e  c;.  if( pPrev->
2ba40 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
2ba50 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70  BufferSet(&rc, p
2ba60 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20  Prev, n, (const 
2ba70 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a  u8*)z);.  }else.
2ba80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ba90 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e  _OK && (pPrev->n
2baa0 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50  !=n || memcmp(pP
2bab0 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29  rev->p, z, n)) )
2bac0 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33  {.    u64 cksum3
2bad0 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20   = *pCksum;.    
2bae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
2baf0 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  m = (const char*
2bb00 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20  )&pPrev->p[1];  
2bb10 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65  /* term sans pre
2bb20 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20  fix-byte */.    
2bb30 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65  int nTerm = pPre
2bb40 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20  v->n-1;         
2bb50 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
2bb60 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
2bb70 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28      int iIdx = (
2bb80 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54  pPrev->p[0] - FT
2bb90 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b  S5_MAIN_PREFIX);
2bba0 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
2bbb0 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20   (iIdx==0 ? 0 : 
2bbc0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2bbd0 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34  PREFIX);.    u64
2bbe0 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36   ck1 = 0;.    u6
2bbf0 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20  4 ck2 = 0;..    
2bc00 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2bc10 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
2bc20 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44  ed for ASC and D
2bc30 45 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a  ESC queries are.
2bc40 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e      ** the same.
2bc50 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68   If not, call th
2bc60 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  is corruption.  
2bc70 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  */.    rc = fts5
2bc80 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2bc90 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2bca0 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a  , flags, &ck1);.
2bcb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bcc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2bcd0 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
2bce0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
2bcf0 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  C;.      rc = ft
2bd00 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
2bd10 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
2bd20 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20  rm, f, &ck2);.  
2bd30 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2bd40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
2bd50 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
2bd60 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
2bd70 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
2bd80 70 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68  prefix query, ch
2bd90 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73  eck that the res
2bda0 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66  ults returned if
2bdb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
2bdc0 69 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65  index is disable
2bdd0 64 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  d are the same. 
2bde0 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20  In both ASC and 
2bdf0 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20  DESC order. .   
2be00 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2be10 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62  check may only b
2be20 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74  e performed if t
2be30 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73  he hash table is
2be40 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20   empty. This.   
2be50 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74   ** is because t
2be60 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e  he hash table on
2be70 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69  ly supports a si
2be80 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20  ngle scan query 
2be90 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65  at.    ** a time
2bea0 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d  , and the multi-
2beb0 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77  iter loop from w
2bec0 68 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69  hich this functi
2bed0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20  on is called.   
2bee0 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70   ** is already p
2bef0 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61  erforming such a
2bf00 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   scan. */.    if
2bf10 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  ( p->nPendingDat
2bf20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  a==0 ){.      if
2bf30 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d  ( iIdx>0 && rc==
2bf40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bf50 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
2bf60 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
2bf70 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20  RY_TEST_NOIDX;. 
2bf80 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a         ck2 = 0;.
2bf90 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
2bfa0 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
2bfb0 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
2bfc0 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
2bfd0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2bfe0 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
2bff0 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
2c000 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
2c010 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30        if( iIdx>0
2c020 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2c030 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
2c040 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
2c050 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
2c060 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f  NOIDX|FTS5INDEX_
2c070 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20  QUERY_DESC;.    
2c080 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20      ck2 = 0;.   
2c090 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75       rc = fts5Qu
2c0a0 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
2c0b0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
2c0c0 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20  f, &ck2);.      
2c0d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c0e0 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
2c0f0 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
2c100 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
2c110 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e   }..    cksum3 ^
2c120 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42  = ck1;.    fts5B
2c130 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
2c140 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
2c150 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20  8*)z);..    if( 
2c160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c170 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65   cksum3!=expecte
2c180 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
2c190 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2c1a0 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20    }.    *pCksum 
2c1b0 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20  = cksum3;.  }.  
2c1c0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a  p->rc = rc;.}. .
2c1d0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
2c1e0 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
2c1f0 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66  rse(x,y,z).# def
2c200 69 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d  ine fts5TestTerm
2c210 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  (u,v,w,x,y,z).#e
2c220 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
2c230 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  k that:.**.**   
2c240 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66  1) All leaves of
2c250 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46   pSeg between iF
2c260 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28  irst and iLast (
2c270 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74  inclusive) exist
2c280 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e   and.**      con
2c290 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e  tain zero terms.
2c2a0 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61  .**   2) All lea
2c2b0 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77  ves of pSeg betw
2c2c0 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64  een iNoRowid and
2c2d0 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76   iLast (inclusiv
2c2e0 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20  e) exist and.** 
2c2f0 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72       contain zer
2c300 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61  o rowids..*/.sta
2c310 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
2c320 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2c330 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64  Empty(.  Fts5Ind
2c340 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72  ex *p,.  Fts5Str
2c350 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
2c360 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg,     /* Segm
2c370 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74  ent to check int
2c380 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63  ernal consistenc
2c390 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  y */.  int iFirs
2c3a0 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69  t,.  int iNoRowi
2c3b0 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29  d,.  int iLast.)
2c3c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
2c3d0 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
2c3e0 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20  the iter.nEmpty 
2c3f0 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67  leaves following
2c400 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
2c410 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74  f.  ** (a) exist
2c420 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
2c430 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20   no terms. */.  
2c440 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d  for(i=iFirst; p-
2c450 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2c460 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29  & i<=iLast; i++)
2c470 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
2c480 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2c490 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
2c4a0 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
2c4b0 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20  >iSegid, i));.  
2c4c0 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
2c4d0 20 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65       if( !fts5Le
2c4e0 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65  afIsTermless(pLe
2c4f0 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
2c500 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2c510 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69    if( i>=iNoRowi
2c520 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66  d && 0!=fts5Leaf
2c530 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
2c540 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  eaf) ) p->rc = F
2c550 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c560 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52   }.    fts5DataR
2c570 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
2c580 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
2c590 64 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43  d fts5IntegrityC
2c5a0 68 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e  heckPgidx(Fts5In
2c5b0 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61  dex *p, Fts5Data
2c5c0 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20   *pLeaf){.  int 
2c5d0 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
2c5e0 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42  int ii;..  Fts5B
2c5f0 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c  uffer buf1 = {0,
2c600 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66  0,0};.  Fts5Buff
2c610 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30  er buf2 = {0,0,0
2c620 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66  };..  ii = pLeaf
2c630 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c  ->szLeaf;.  whil
2c640 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20  e( ii<pLeaf->nn 
2c650 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
2c660 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
2c670 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  es;.    int iOff
2c680 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b  ;.    int nIncr;
2c690 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35  ..    ii += fts5
2c6a0 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2c6b0 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72  af->p[ii], nIncr
2c6c0 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20  );.    iTermOff 
2c6d0 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f  += nIncr;.    iO
2c6e0 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a  ff = iTermOff;..
2c6f0 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c      if( iOff>=pL
2c700 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2c710 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2c720 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2c730 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66  else if( iTermOf
2c740 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20  f==nIncr ){.    
2c750 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
2c760 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2c770 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2c780 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  f->p[iOff], nByt
2c790 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  e);.      if( (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 66  }else{.        f
2c7f0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
2c800 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74  >rc, &buf1, nByt
2c810 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  e, &pLeaf->p[iOf
2c820 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  f]);.      }.   
2c830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
2c840 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a  t nKeep, nByte;.
2c850 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2c860 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2c870 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2c880 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66  Keep);.      iOf
2c890 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2c8a0 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
2c8b0 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
2c8c0 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75      if( nKeep>bu
2c8d0 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42  f1.n || (iOff+nB
2c8e0 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  yte)>pLeaf->szLe
2c8f0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  af ){.        p-
2c900 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2c910 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
2c920 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20  .        buf1.n 
2c930 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20  = nKeep;.       
2c940 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
2c950 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
2c960 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65  uf1, nByte, &pLe
2c970 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20  af->p[iOff]);.  
2c980 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2c990 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2c9a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  K ){.        res
2c9b0 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d   = fts5BufferCom
2c9c0 70 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66  pare(&buf1, &buf
2c9d0 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
2c9e0 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d  res<=0 ) p->rc =
2c9f0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2ca00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2ca10 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
2ca20 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75  p->rc, &buf2, bu
2ca30 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20  f1.n, buf1.p);. 
2ca40 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72   }..  fts5Buffer
2ca50 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66  Free(&buf1);.  f
2ca60 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
2ca70 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  uf2);.}..static 
2ca80 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e  void fts5IndexIn
2ca90 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
2caa0 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ent(.  Fts5Index
2cab0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2cac0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
2cad0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
2cae0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2caf0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20  Segment *pSeg   
2cb00 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f     /* Segment to
2cb10 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20   check internal 
2cb20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29  consistency */.)
2cb30 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
2cb40 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
2cb50 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nfig;.  sqlite3_
2cb60 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
2cb70 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e  .  int rc2;.  in
2cb80 74 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d  t iIdxPrevLeaf =
2cb90 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2cba0 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78  -1;.  int iDlidx
2cbb0 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
2cbc0 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66  >pgnoLast;..  if
2cbd0 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ( pSeg->pgnoFirs
2cbe0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  t==0 ) return;..
2cbf0 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
2cc00 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74  reStmt(p, &pStmt
2cc10 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
2cc20 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  f(.      "SELECT
2cc30 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70   segid, term, (p
2cc40 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31  gno>>1), (pgno&1
2cc50 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64  ) FROM %Q.'%q_id
2cc60 78 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25  x' WHERE segid=%
2cc70 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  d",.      pConfi
2cc80 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
2cc90 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53  >zName, pSeg->iS
2cca0 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  egid.  ));..  /*
2ccb0 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
2ccc0 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
2ccd0 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69  archy.  */.  whi
2cce0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
2ccf0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2cd00 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2cd10 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69  (pStmt) ){.    i
2cd20 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20  64 iRow;        
2cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cd40 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c  Rowid for this l
2cd50 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  eaf */.    Fts5D
2cd60 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
2cd70 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2cd80 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
2cd90 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54  /..    int nIdxT
2cda0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  erm = sqlite3_co
2cdb0 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
2cdc0 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 1);.    const 
2cdd0 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d  char *zIdxTerm =
2cde0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2cdf0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2ce00 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
2ce10 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20   int iIdxLeaf = 
2ce20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2ce30 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20  nt(pStmt, 2);.  
2ce40 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20    int bIdxDlidx 
2ce50 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2ce60 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
2ce70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c  .    /* If the l
2ce80 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  eaf in question 
2ce90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2cea0 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68   trimmed from th
2ceb0 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20  e segment, .    
2cec0 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62  ** ignore this b
2ced0 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68  -tree entry. Oth
2cee0 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20  erwise, load it 
2cef0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a  into memory. */.
2cf00 20 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66      if( iIdxLeaf
2cf10 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  <pSeg->pgnoFirst
2cf20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2cf30 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47   iRow = FTS5_SEG
2cf40 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
2cf50 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61  >iSegid, iIdxLea
2cf60 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20  f);.    pLeaf = 
2cf70 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20  fts5LeafRead(p, 
2cf80 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  iRow);.    if( p
2cf90 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
2cfa0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
2cfb0 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e  hat the leaf con
2cfc0 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f  tains at least o
2cfd0 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61  ne term, and tha
2cfe0 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20  t it is equal.  
2cff0 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65    ** to or large
2d000 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74  r than the split
2d010 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d  -key in zIdxTerm
2d020 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68  .  Also check th
2d030 61 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  at if there.    
2d040 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77  ** is also a row
2d050 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69  id pointer withi
2d060 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  n the leaf page 
2d070 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74  header, it point
2d080 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f  s to a.    ** lo
2d090 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  cation before th
2d0a0 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  e term.  */.    
2d0b0 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70  if( pLeaf->nn<=p
2d0c0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2d0d0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2d0e0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2d0f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2d100 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
2d110 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2d120 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d  et of first term
2d130 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20   on leaf */.    
2d140 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b    int iRowidOff;
2d150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d160 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
2d170 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a   rowid on leaf *
2d180 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  /.      int nTer
2d190 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2d1a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
2d1b0 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62  erm on leaf in b
2d1c0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ytes */.      in
2d1d0 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
2d1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2d1f0 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20  parison of term 
2d200 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f  and split-key */
2d210 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66  ..      iOff = f
2d220 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
2d230 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2d240 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
2d250 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2d260 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2d270 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e    if( iRowidOff>
2d280 3d 69 4f 66 66 20 7c 7c 20 69 4f 66 66 3e 3d 70  =iOff || iOff>=p
2d290 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2d2a0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
2d2b0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2d2c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d2d0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2d2e0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2d2f0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
2d300 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  m);.        res 
2d310 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 26 70 4c  = fts5Memcmp(&pL
2d320 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49  eaf->p[iOff], zI
2d330 64 78 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72  dxTerm, MIN(nTer
2d340 6d 2c 20 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20  m, nIdxTerm));. 
2d350 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d         if( res==
2d360 30 20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20  0 ) res = nTerm 
2d370 2d 20 6e 49 64 78 54 65 72 6d 3b 0a 20 20 20 20  - nIdxTerm;.    
2d380 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20      if( res<0 ) 
2d390 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2d3a0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  RUPT;.      }.. 
2d3b0 20 20 20 20 20 66 74 73 35 49 6e 74 65 67 72 69       fts5Integri
2d3c0 74 79 43 68 65 63 6b 50 67 69 64 78 28 70 2c 20  tyCheckPgidx(p, 
2d3d0 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20  pLeaf);.    }.  
2d3e0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
2d3f0 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66  e(pLeaf);.    if
2d400 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
2d410 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65  ..    /* Now che
2d420 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ck that the iter
2d430 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66  .nEmpty leaves f
2d440 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72  ollowing the cur
2d450 72 65 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a  rent leaf.    **
2d460 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28   (a) exist and (
2d470 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  b) contain no te
2d480 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  rms. */.    fts5
2d490 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2d4a0 65 63 6b 45 6d 70 74 79 28 0a 20 20 20 20 20 20  eckEmpty(.      
2d4b0 20 20 70 2c 20 70 53 65 67 2c 20 69 49 64 78 50    p, pSeg, iIdxP
2d4c0 72 65 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64  revLeaf+1, iDlid
2d4d0 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 49 64  xPrevLeaf+1, iId
2d4e0 78 4c 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20  xLeaf-1.    );. 
2d4f0 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62     if( p->rc ) b
2d500 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  reak;..    /* If
2d510 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
2d520 69 73 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b  ist-index, check
2d530 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72   that it looks r
2d540 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ight. */.    if(
2d550 20 62 49 64 78 44 6c 69 64 78 20 29 7b 0a 20 20   bIdxDlidx ){.  
2d560 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65      Fts5DlidxIte
2d570 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20  r *pDlidx = 0;  
2d580 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
2d590 20 74 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74   through doclist
2d5a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2d5b0 69 6e 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20  int iPrevLeaf = 
2d5c0 69 49 64 78 4c 65 61 66 3b 0a 20 20 20 20 20 20  iIdxLeaf;.      
2d5d0 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 53 65  int iSegid = pSe
2d5e0 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20  g->iSegid;.     
2d5f0 20 69 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20   int iPg = 0;.  
2d600 20 20 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20      i64 iKey;.. 
2d610 20 20 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d       for(pDlidx=
2d620 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
2d630 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20  t(p, 0, iSegid, 
2d640 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 20  iIdxLeaf);.     
2d650 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2d660 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
2d670 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ==0;.          f
2d680 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
2d690 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20  (p, pDlidx).    
2d6a0 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    ){..        /*
2d6b0 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64   Check any rowid
2d6c0 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74  -less pages that
2d6d0 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
2d6e0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
2d6f0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
2d700 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20  Pg=iPrevLeaf+1; 
2d710 69 50 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65  iPg<fts5DlidxIte
2d720 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69  rPgno(pDlidx); i
2d730 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pg++){.         
2d740 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
2d750 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
2d760 64 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  d, iPg);.       
2d770 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
2d780 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
2d790 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d7a0 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
2d7b0 20 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61       if( fts5Lea
2d7c0 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
2d7d0 4c 65 61 66 29 21 3d 30 20 29 20 70 2d 3e 72 63  Leaf)!=0 ) p->rc
2d7e0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2d7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
2d800 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
2d810 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  af);.          }
2d820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d830 20 20 20 69 50 72 65 76 4c 65 61 66 20 3d 20 66     iPrevLeaf = f
2d840 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2d850 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20  (pDlidx);..     
2d860 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
2d870 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
2d880 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
2d890 69 74 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20  iterator really 
2d8a0 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  does.        ** 
2d8b0 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69  contain the rowi
2d8c0 64 20 73 75 67 67 65 73 74 65 64 20 62 79 20 74  d suggested by t
2d8d0 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  he same. */.    
2d8e0 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f      iKey = FTS5_
2d8f0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
2d900 65 67 69 64 2c 20 69 50 72 65 76 4c 65 61 66 29  egid, iPrevLeaf)
2d910 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 20  ;.        pLeaf 
2d920 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
2d930 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , iKey);.       
2d940 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
2d950 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77          i64 iRow
2d960 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  id;.          in
2d970 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74  t iRowidOff = ft
2d980 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2d990 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2d9a0 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c        ASSERT_SZL
2d9b0 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
2d9c0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
2d9d0 77 69 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73  widOff>=pLeaf->s
2d9e0 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
2d9f0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2da00 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2da10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2da20 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
2da30 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b  arint(&pLeaf->p[
2da40 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34  iRowidOff], (u64
2da50 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  *)&iRowid);.    
2da60 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
2da70 69 64 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65  id!=fts5DlidxIte
2da80 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
2da90 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2daa0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
2dab0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
2dac0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
2dad0 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  af);.        }. 
2dae0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 44       }..      iD
2daf0 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69  lidxPrevLeaf = i
2db00 50 67 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  Pg;.      fts5Dl
2db10 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
2db20 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 54  dx);.      fts5T
2db30 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28  estDlidxReverse(
2db40 70 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c  p, iSegid, iIdxL
2db50 65 61 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  eaf);.    }else{
2db60 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50 72 65  .      iDlidxPre
2db70 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67  vLeaf = pSeg->pg
2db80 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a  noLast;.      /*
2db90 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65   TODO: Check the
2dba0 72 65 20 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74  re is no doclist
2dbb0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a   index */.    }.
2dbc0 0a 20 20 20 20 69 49 64 78 50 72 65 76 4c 65 61  .    iIdxPrevLea
2dbd0 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20  f = iIdxLeaf;.  
2dbe0 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74  }..  rc2 = sqlit
2dbf0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2dc00 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  t);.  if( p->rc=
2dc10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
2dc20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20  rc = rc2;..  /* 
2dc30 50 61 67 65 20 69 74 65 72 2e 69 4c 65 61 66 20  Page iter.iLeaf 
2dc40 6d 75 73 74 20 6e 6f 77 20 62 65 20 74 68 65 20  must now be the 
2dc50 72 69 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70  rightmost leaf-p
2dc60 61 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65  age in the segme
2dc70 6e 74 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66  nt */.#if 0.  if
2dc80 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2dc90 4f 4b 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66  OK && iter.iLeaf
2dca0 21 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  !=pSeg->pgnoLast
2dcb0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
2dcc0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2dcd0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  }.#endif.}.../*.
2dce0 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20  ** Run internal 
2dcf0 63 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65  checks to ensure
2dd00 20 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e   that the FTS in
2dd10 64 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72  dex (a) is inter
2dd20 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73  nally .** consis
2dd30 74 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  tent and (b) con
2dd40 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
2dd50 72 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20  r which the XOR 
2dd60 6f 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  of the checksums
2dd70 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65  .** as calculate
2dd80 64 20 62 79 20 73 71 6c 69 74 65 33 46 74 73 35  d by sqlite3Fts5
2dd90 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
2dda0 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a  ) is cksum..**.*
2ddb0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
2ddc0 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f  CORRUPT if any o
2ddd0 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  f the internal c
2dde0 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69  hecks fail, or i
2ddf0 66 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75  f the.** checksu
2de00 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
2de10 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
2de20 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73  OK if all checks
2de30 20 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a   pass without.**
2de40 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20   error, or some 
2de50 6f 74 68 65 72 20 53 51 4c 69 74 65 20 65 72 72  other SQLite err
2de60 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68  or code if anoth
2de70 65 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f  er error (e.g. O
2de80 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  OM).** occurs..*
2de90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2dea0 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
2deb0 68 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a  heck(Fts5Index *
2dec0 70 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20  p, u64 cksum){. 
2ded0 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70   int eDetail = p
2dee0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
2def0 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32  il;.  u64 cksum2
2df00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2df10 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
2df20 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65  m based on conte
2df30 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a  nts of indexes *
2df40 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70  /.  Fts5Buffer p
2df50 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d  oslist = {0,0,0}
2df60 3b 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73  ;   /* Buffer us
2df70 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73  ed to hold a pos
2df80 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 74  list */.  Fts5It
2df90 65 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  er *pIter;      
2dfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2dfb0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2dfc0 6f 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65  ough entire inde
2dfd0 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
2dfe0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20  ture *pStruct;  
2dff0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2e000 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69  structure */..#i
2e010 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2e020 47 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65  G.  /* Used by e
2e030 78 74 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65  xtra internal te
2e040 73 74 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20  sts only run if 
2e050 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
2e060 66 69 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63  fined */.  u64 c
2e070 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20  ksum3 = 0;      
2e080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
2e090 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20  ecksum based on 
2e0a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65  contents of inde
2e0b0 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  xes */.  Fts5Buf
2e0c0 66 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c  fer term = {0,0,
2e0d0 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66  0};      /* Buff
2e0e0 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  er used to hold 
2e0f0 6d 6f 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d  most recent term
2e100 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e   */.#endif.  con
2e110 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46  st int flags = F
2e120 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e  TS5INDEX_QUERY_N
2e130 4f 4f 55 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a  OOUTPUT;.  .  /*
2e140 20 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e   Load the FTS in
2e150 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
2e160 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
2e170 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
2e180 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
2e190 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
2e1a0 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73   nodes of each s
2e1b0 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65  egment match the
2e1c0 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28   leaves */.  if(
2e1d0 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
2e1e0 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
2e1f0 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
2e200 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
2e210 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
2e220 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
2e230 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
2e240 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
2e250 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
2e260 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
2e270 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
2e280 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
2e290 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
2e2a0 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49  ];.        fts5I
2e2b0 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2e2c0 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65  ckSegment(p, pSe
2e2d0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2e2e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
2e2f0 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70  cksum argument p
2e300 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
2e310 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63  nction is a chec
2e320 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a  ksum calculated.
2e330 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c    ** based on al
2e340 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69  l expected entri
2e350 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  es in the FTS in
2e360 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70  dex (including p
2e370 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a  refix index.  **
2e380 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20   entries). This 
2e390 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61  block checks tha
2e3a0 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  t a checksum cal
2e3b0 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  culated based on
2e3c0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
2e3d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53   contents of FTS
2e3e0 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69   index is identi
2e3f0 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cal..  **.  ** T
2e400 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
2e410 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d  he same checksum
2e420 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e   are calculated.
2e430 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63   The first (stac
2e440 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  k.  ** variable 
2e450 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e  cksum2) based on
2e460 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74   entries extract
2e470 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c  ed from the full
2e480 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a  -text index.  **
2e490 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c   while doing a l
2e4a0 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61  inear scan of ea
2e4b0 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e  ch individual in
2e4c0 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20  dex in turn. .  
2e4d0 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20  **.  ** As each 
2e4e0 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20  term visited by 
2e4f0 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73  the linear scans
2e500 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65  , a separate que
2e510 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ry for the.  ** 
2e520 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72  same term is per
2e530 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69  formed. cksum3 i
2e540 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  s calculated bas
2e550 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65  ed on the entrie
2e560 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64  s.  ** extracted
2e570 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65   by these querie
2e580 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74  s..  */.  for(ft
2e590 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
2e5a0 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
2e5b0 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30  , 0, 0, 0, -1, 0
2e5c0 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
2e5d0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
2e5e0 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a  f(p, pIter)==0;.
2e5f0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
2e600 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
2e610 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20  , 0, 0).  ){.   
2e620 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2e630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e640 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20  Size of term in 
2e650 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34  bytes */.    i64
2e660 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20   iPos = 0;      
2e670 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
2e680 74 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70  tion read from p
2e690 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e  oslist */.    in
2e6a0 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20  t iOff = 0;     
2e6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2e6c0 73 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69  set within posli
2e6d0 73 74 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52  st */.    i64 iR
2e6e0 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
2e6f0 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
2e700 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  ;.    char *z = 
2e710 28 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69  (char*)fts5Multi
2e720 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20  IterTerm(pIter, 
2e730 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  &n);..    /* If 
2e740 74 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65  this is a new te
2e750 72 6d 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74  rm, query for it
2e760 2e 20 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20  . Update cksum3 
2e770 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73  with the results
2e780 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73  . */.    fts5Tes
2e790 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20  tTerm(p, &term, 
2e7a0 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63  z, n, cksum2, &c
2e7b0 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28  ksum3);..    if(
2e7c0 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
2e7d0 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
2e7e0 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35 4d      if( 0==fts5M
2e7f0 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
2e800 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
2e810 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73       cksum2 ^= s
2e820 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
2e830 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64  ntryCksum(iRowid
2e840 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e  , 0, 0, -1, z, n
2e850 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2e860 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c  else{.      posl
2e870 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ist.n = 0;.     
2e880 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
2e890 69 73 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61  ist(p, &pIter->a
2e8a0 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73  Seg[pIter->aFirs
2e8b0 74 5b 31 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c  t[1].iFirst], 0,
2e8c0 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20   &poslist);.    
2e8d0 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69    while( 0==sqli
2e8e0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
2e8f0 78 74 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20  xt64(poslist.p, 
2e900 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66  poslist.n, &iOff
2e910 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20  , &iPos) ){.    
2e920 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46      int iCol = F
2e930 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69  TS5_POS2COLUMN(i
2e940 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  Pos);.        in
2e950 74 20 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35  t iTokOff = FTS5
2e960 5f 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73  _POS2OFFSET(iPos
2e970 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
2e980 32 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35  2 ^= sqlite3Fts5
2e990 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
2e9a0 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54  iRowid, iCol, iT
2e9b0 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29  okOff, -1, z, n)
2e9c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e9d0 20 20 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65    }.  fts5TestTe
2e9e0 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20  rm(p, &term, 0, 
2e9f0 30 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75  0, cksum2, &cksu
2ea00 6d 33 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74  m3);..  fts5Mult
2ea10 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29  iIterFree(pIter)
2ea20 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
2ea30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
2ea40 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  m!=cksum2 ) p->r
2ea50 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2ea60 3b 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  ;..  fts5Structu
2ea70 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
2ea80 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
2ea90 45 5f 44 45 42 55 47 0a 20 20 66 74 73 35 42 75  E_DEBUG.  fts5Bu
2eaa0 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
2eab0 0a 23 65 6e 64 69 66 0a 20 20 66 74 73 35 42 75  .#endif.  fts5Bu
2eac0 66 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73  fferFree(&poslis
2ead0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
2eae0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
2eaf0 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
2eb00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2eb40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb80 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c  *********.** Bel
2eb90 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73  ow this point is
2eba0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2ebb0 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f  ion of the fts5_
2ebc0 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a  decode() scalar.
2ebd0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  ** function only
2ebe0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  ..*/../*.** Deco
2ebf0 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74  de a segment-dat
2ec00 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65  a rowid from the
2ec10 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
2ec20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
2ec30 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20  ** the opposite 
2ec40 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45  of macro FTS5_SE
2ec50 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a  GMENT_ROWID()..*
2ec60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2ec70 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20  s5DecodeRowid(. 
2ec80 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20   i64 iRowid,    
2ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eca0 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25   /* Rowid from %
2ecb0 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
2ecc0 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20   int *piSegid,  
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ece0 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74   /* OUT: Segment
2ecf0 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62   id */.  int *pb
2ed00 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  Dlidx,          
2ed10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2ed20 20 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20   Dlidx flag */. 
2ed30 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20   int *piHeight, 
2ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed50 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20   /* OUT: Height 
2ed60 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f  */.  int *piPgno
2ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67       /* OUT: Pag
2ed90 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
2eda0 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29   *piPgno = (int)
2edb0 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2edc0 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2edd0 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20  PAGE_B) - 1));. 
2ede0 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2edf0 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20  _DATA_PAGE_B;.. 
2ee00 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e   *piHeight = (in
2ee10 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
2ee20 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
2ee30 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29  A_HEIGHT_B) - 1)
2ee40 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
2ee50 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2ee60 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20  _B;..  *pbDlidx 
2ee70 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2ee80 20 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77   0x0001);.  iRow
2ee90 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
2eea0 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65  _DLI_B;..  *piSe
2eeb0 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  gid = (int)(iRow
2eec0 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
2eed0 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29   FTS5_DATA_ID_B)
2eee0 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69   - 1));.}..stati
2eef0 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
2ef00 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20  Rowid(int *pRc, 
2ef10 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2ef20 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69  , i64 iKey){.  i
2ef30 6e 74 20 69 53 65 67 69 64 2c 20 69 48 65 69 67  nt iSegid, iHeig
2ef40 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64  ht, iPgno, bDlid
2ef50 78 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  x;       /* Rowi
2ef60 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a  d compenents */.
2ef70 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
2ef80 64 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c  d(iKey, &iSegid,
2ef90 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67   &bDlidx, &iHeig
2efa0 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
2efb0 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  if( iSegid==0 ){
2efc0 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46  .    if( iKey==F
2efd0 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
2efe0 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ID ){.      sqli
2eff0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2f000 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2f010 42 75 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d  Buf, "{averages}
2f020 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
2f030 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2f040 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2f050 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2f060 7b 73 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20  {structure}");. 
2f070 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b     }.  }.  else{
2f080 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2f090 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2f0a0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b  tf(pRc, pBuf, "{
2f0b0 25 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20  %ssegid=%d h=%d 
2f0c0 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20  pgno=%d}",.     
2f0d0 20 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69     bDlidx ? "dli
2f0e0 64 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69  dx " : "", iSegi
2f0f0 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
2f100 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
2f110 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2f120 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a  DebugStructure(.
2f130 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f150 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2f160 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2f170 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2f180 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
2f190 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  p.){.  int iLvl,
2f1a0 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
2f1b0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2f1c0 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
2f1d0 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20  , segments */.. 
2f1e0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
2f1f0 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  l<p->nLevel; iLv
2f200 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74  l++){.    Fts5St
2f210 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
2f220 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b  vl = &p->aLevel[
2f230 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74  iLvl];.    sqlit
2f240 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f250 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2f260 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b  uf, .        " {
2f270 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64  lvl=%d nMerge=%d
2f280 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c   nSeg=%d", iLvl,
2f290 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70   pLvl->nMerge, p
2f2a0 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b  Lvl->nSeg.    );
2f2b0 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b  .    for(iSeg=0;
2f2c0 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67   iSeg<pLvl->nSeg
2f2d0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
2f2e0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2f2f0 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
2f300 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
2f310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2f320 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2f330 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2f340 22 20 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d  " {id=%d leaves=
2f350 25 64 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20  %d..%d}", .     
2f360 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69       pSeg->iSegi
2f370 64 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  d, pSeg->pgnoFir
2f380 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  st, pSeg->pgnoLa
2f390 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
2f3a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
2f3b0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2f3c0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2f3d0 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  }");.  }.}../*.*
2f3e0 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f  * This is part o
2f3f0 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
2f400 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69  e() debugging ai
2f410 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  d..**.** Argumen
2f420 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63  ts pBlob/nBlob c
2f430 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69  ontain a seriali
2f440 7a 65 64 20 46 74 73 35 53 74 72 75 63 74 75 72  zed Fts5Structur
2f450 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a  e object. This.*
2f460 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  * function appen
2f470 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2f480 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
2f490 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f  on of the same o
2f4a0 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20  bject.** to the 
2f4b0 62 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73  buffer passed as
2f4c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2f4d0 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ment. .*/.static
2f4e0 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2f4f0 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74  Structure(.  int
2f500 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2f510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f520 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f  IN/OUT: error co
2f530 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2f540 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73  er *pBuf,.  cons
2f550 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74  t u8 *pBlob, int
2f560 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20   nBlob.){.  int 
2f570 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2f580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2f590 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2f5a0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2f5b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f5c0 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63  /* Decoded struc
2f5d0 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  ture object */..
2f5e0 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63    rc = fts5Struc
2f5f0 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62  tureDecode(pBlob
2f600 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b  , nBlob, 0, &p);
2f610 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2f620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63  E_OK ){.    *pRc
2f630 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
2f640 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65  n;.  }..  fts5De
2f650 62 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63  bugStructure(pRc
2f660 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74  , pBuf, p);.  ft
2f670 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
2f680 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  se(p);.}../*.** 
2f690 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
2f6a0 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2f6b0 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
2f6c0 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
2f6d0 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
2f6e0 74 61 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65  tain an "average
2f6f0 73 22 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20  s" record. This 
2f700 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70  function .** app
2f710 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61  ends a human-rea
2f720 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  dable representa
2f730 74 69 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74  tion of record t
2f740 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73  o the buffer pas
2f750 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73  sed .** as the s
2f760 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
2f770 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f780 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67  fts5DecodeAverag
2f790 65 73 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  es(.  int *pRc, 
2f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7b0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2f7c0 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
2f7d0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2f7e0 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  f,.  const u8 *p
2f7f0 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a  Blob, int nBlob.
2f800 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
2f810 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2f820 70 61 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68  pace = "";..  wh
2f830 69 6c 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a  ile( i<nBlob ){.
2f840 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20      u64 iVal;.  
2f850 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
2f860 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c  s5GetVarint(&pBl
2f870 6f 62 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20  ob[i], &iVal);. 
2f880 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2f890 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2f8a0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25  (pRc, pBuf, "%s%
2f8b0 64 22 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74  d", zSpace, (int
2f8c0 29 69 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61  )iVal);.    zSpa
2f8d0 63 65 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a  ce = " ";.  }.}.
2f8e0 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61  ./*.** Buffer (a
2f8f0 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20 74  /n) is assumed t
2f900 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74  o contain a list
2f910 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76   of serialized v
2f920 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20  arints. Read.** 
2f930 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20  each varint and 
2f940 61 70 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e  append its strin
2f950 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
2f960 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
2f970 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72   Return.** after
2f980 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 70 75   either the inpu
2f990 74 20 62 75 66 66 65 72 20 69 73 20 65 78 68 61  t buffer is exha
2f9a0 75 73 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c  usted or a 0 val
2f9b0 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ue is read..**.*
2f9c0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2f9d0 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
2f9e0 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66   of bytes read f
2f9f0 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75  rom the input bu
2fa00 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ffer..*/.static 
2fa10 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f  int fts5DecodePo
2fa20 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20  slist(int *pRc, 
2fa30 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2fa40 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69  , const u8 *a, i
2fa50 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66  nt n){.  int iOf
2fa60 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  f = 0;.  while( 
2fa70 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e  iOff<n ){.    in
2fa80 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66  t iVal;.    iOff
2fa90 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2faa0 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56  t32(&a[iOff], iV
2fab0 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
2fac0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2fad0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2fae0 2c 20 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a  , " %d", iVal);.
2faf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66    }.  return iOf
2fb00 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f;.}../*.** The 
2fb10 73 74 61 72 74 20 6f 66 20 62 75 66 66 65 72 20  start of buffer 
2fb20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74  (a/n) contains t
2fb30 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f  he start of a do
2fb40 63 6c 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69  clist. The docli
2fb50 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79  st.** may or may
2fb60 20 6e 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68   not finish with
2fb70 69 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20 54  in the buffer. T
2fb80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
2fb90 65 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72  ends a text.** r
2fba0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2fbb0 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68 65   the part of the
2fbc0 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73   doclist that is
2fbd0 20 70 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66   present to buff
2fbe0 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a  er.** pBuf. .**.
2fbf0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2fc00 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
2fc10 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20  r of bytes read 
2fc20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
2fc30 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
2fc40 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44   int fts5DecodeD
2fc50 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c  oclist(int *pRc,
2fc60 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2fc70 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  f, const u8 *a, 
2fc80 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44  int n){.  i64 iD
2fc90 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ocid = 0;.  int 
2fca0 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28  iOff = 0;..  if(
2fcb0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66   n>0 ){.    iOff
2fcc0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   = sqlite3Fts5Ge
2fcd0 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a  tVarint(a, (u64*
2fce0 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73  )&iDocid);.    s
2fcf0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2fd00 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2fd10 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c  , pBuf, " id=%ll
2fd20 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d  d", iDocid);.  }
2fd30 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e  .  while( iOff<n
2fd40 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   ){.    int nPos
2fd50 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a  ;.    int bDel;.
2fd60 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2fd70 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
2fd80 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  a[iOff], &nPos, 
2fd90 26 62 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69  &bDel);.    sqli
2fda0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2fdb0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2fdc0 42 75 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73  Buf, " nPos=%d%s
2fdd0 22 2c 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a  ", nPos, bDel?"*
2fde0 22 3a 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20  ":"");.    iOff 
2fdf0 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73  += fts5DecodePos
2fe00 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20  list(pRc, pBuf, 
2fe10 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d  &a[iOff], MIN(n-
2fe20 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20  iOff, nPos));.  
2fe30 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
2fe40 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
2fe50 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2fe60 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
2fe70 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
2fe80 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
2fe90 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69       iDocid += i
2fea0 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c  Delta;.      sql
2feb0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2fec0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2fed0 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22  pBuf, " id=%lld"
2fee0 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d  , iDocid);.    }
2fef0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69  .  }..  return i
2ff00 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Off;.}../*.** Th
2ff10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70  is function is p
2ff20 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f  art of the fts5_
2ff30 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69  decode() debuggi
2ff40 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20  ng function. It 
2ff50 69 73 20 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72  is .** only ever
2ff60 20 75 73 65 64 20 77 69 74 68 20 64 65 74 61 69   used with detai
2ff70 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a  l=none tables..*
2ff80 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 44 61  *.** Buffer (pDa
2ff90 74 61 2f 6e 44 61 74 61 29 20 63 6f 6e 74 61 69  ta/nData) contai
2ffa0 6e 73 20 61 20 64 6f 63 6c 69 73 74 20 69 6e 20  ns a doclist in 
2ffb0 74 68 65 20 66 6f 72 6d 61 74 20 75 73 65 64 20  the format used 
2ffc0 62 79 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a  by detail=none.*
2ffd0 2a 20 74 61 62 6c 65 73 2e 20 54 68 69 73 20 66  * tables. This f
2ffe0 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
2fff0 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
30000 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 61 74   version of that
30010 20 6c 69 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66   list to.** buff
30020 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49  er pBuf..**.** I
30030 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20  f *pRc is other 
30040 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77  than SQLITE_OK w
30050 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
30060 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
30070 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49  is a.** no-op. I
30080 66 20 61 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65  f an OOM or othe
30090 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  r error occurs w
300a0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
300b0 69 6f 6e 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20  ion, *pRc is.** 
300c0 73 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  set to an SQLite
300d0 20 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f   error code befo
300e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 54 68  re returning. Th
300f0 65 20 66 69 6e 61 6c 20 73 74 61 74 65 20 6f 66  e final state of
30100 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 20   buffer.** pBuf 
30110 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
30120 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
30130 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
30140 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 0a 20  codeRowidList(. 
30150 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
30160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30170 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
30180 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
30190 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20  Buffer *pBuf,   
301a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
301b0 75 66 66 65 72 20 74 6f 20 61 70 70 65 6e 64 20  uffer to append 
301c0 74 65 78 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e  text to */.  con
301d0 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
301e0 74 20 6e 44 61 74 61 20 20 20 20 20 20 2f 2a 20  t nData      /* 
301f0 44 61 74 61 20 74 6f 20 64 65 63 6f 64 65 20 6c  Data to decode l
30200 69 73 74 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72  ist-of-rowids fr
30210 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  om */.){.  int i
30220 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77   = 0;.  i64 iRow
30230 69 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  id = 0;..  while
30240 28 20 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20  ( i<nData ){.   
30250 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 70   const char *zAp
30260 70 20 3d 20 22 22 3b 0a 20 20 20 20 75 36 34 20  p = "";.    u64 
30270 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73  iVal;.    i += s
30280 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
30290 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26  int(&pData[i], &
302a0 69 56 61 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69  iVal);.    iRowi
302b0 64 20 2b 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20  d += iVal;..    
302c0 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70  if( i<nData && p
302d0 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b  Data[i]==0x00 ){
302e0 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
302f0 20 20 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26    if( i<nData &&
30300 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20   pData[i]==0x00 
30310 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ){.        i++;.
30320 20 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22          zApp = "
30330 2b 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +";.      }else{
30340 0a 20 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20  .        zApp = 
30350 22 2a 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "*";.      }.   
30360 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46   }..    sqlite3F
30370 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
30380 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
30390 20 22 20 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77   " %lld%s", iRow
303a0 69 64 2c 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d  id, zApp);.  }.}
303b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
303c0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73  ementation of us
303d0 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61  er-defined scala
303e0 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f  r function fts5_
303f0 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61  decode()..*/.sta
30400 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
30410 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  odeFunction(.  s
30420 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
30430 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
30440 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  * Function call 
30450 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
30460 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
30470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30480 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28  Number of args (
30490 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73  always 2) */.  s
304a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
304b0 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
304c0 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
304d0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  ents */.){.  i64
304e0 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
304f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30500 52 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64  Rowid for record
30510 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
30520 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69  /.  int iSegid,i
30530 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c  Height,iPgno,bDl
30540 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d  idx;/* Rowid com
30550 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  ponents */.  con
30560 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e  st u8 *aBlob; in
30570 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  t n;         /* 
30580 52 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65  Record to decode
30590 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b   */.  u8 *a = 0;
305a0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 73 3b  .  Fts5Buffer s;
305b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305c0 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74     /* Build up t
305d0 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65  ext to return he
305e0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
305f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
30600 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30610 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
30620 74 65 33 5f 69 6e 74 36 34 20 6e 53 70 61 63 65  te3_int64 nSpace
30630 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 44 65 74   = 0;.  int eDet
30640 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71 6c 69 74  ailNone = (sqlit
30650 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
30660 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73 73 65 72  x)!=0);..  asser
30670 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20  t( nArg==2 );.  
30680 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e 41 72  UNUSED_PARAM(nAr
30690 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c  g);.  memset(&s,
306a0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
306b0 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69  uffer));.  iRowi
306c0 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
306d0 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d  e_int64(apVal[0]
306e0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20  );..  /* Make a 
306f0 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
30700 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61 20 62  nd argument (a b
30710 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e  lob) in aBlob[].
30720 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a   The aBlob[].  *
30730 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c 6f 77  * copy is follow
30740 65 64 20 62 79 20 46 54 53 35 5f 44 41 54 41 5f  ed by FTS5_DATA_
30750 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30 78 30  ZERO_PADDING 0x0
30760 30 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 70  0 bytes, which p
30770 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62 75 66  revents.  ** buf
30780 66 65 72 20 6f 76 65 72 72 65 61 64 73 20 65 76  fer overreads ev
30790 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  en if the record
307a0 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f   is corrupt.  */
307b0 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
307c0 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c  alue_bytes(apVal
307d0 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20  [1]);.  aBlob = 
307e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
307f0 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  ob(apVal[1]);.  
30800 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46 54 53  nSpace = n + FTS
30810 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
30820 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29  ING;.  a = (u8*)
30830 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
30840 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63  cZero(&rc, nSpac
30850 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29  e);.  if( a==0 )
30860 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
30870 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 20 6d 65  ;.  if( n>0 ) me
30880 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e  mcpy(a, aBlob, n
30890 29 3b 0a 0a 20 20 66 74 73 35 44 65 63 6f 64 65  );..  fts5Decode
308a0 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69  Rowid(iRowid, &i
308b0 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20  Segid, &bDlidx, 
308c0 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f  &iHeight, &iPgno
308d0 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52  );..  fts5DebugR
308e0 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52  owid(&rc, &s, iR
308f0 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c  owid);.  if( bDl
30900 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
30910 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46  ata dlidx;.    F
30920 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b  ts5DlidxLvl lvl;
30930 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20  ..    dlidx.p = 
30940 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20  a;.    dlidx.nn 
30950 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  = n;..    memset
30960 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (&lvl, 0, sizeof
30970 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
30980 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d  .    lvl.pData =
30990 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c   &dlidx;.    lvl
309a0 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67  .iLeafPgno = iPg
309b0 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73  no;..    for(fts
309c0 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c  5DlidxLvlNext(&l
309d0 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30  vl); lvl.bEof==0
309e0 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ; fts5DlidxLvlNe
309f0 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20  xt(&lvl)){.     
30a00 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
30a10 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
30a20 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20  rc, &s, .       
30a30 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c 20     " %d(%lld)", 
30a40 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c  lvl.iLeafPgno, l
30a50 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20  vl.iRowid.      
30a60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
30a70 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
30a80 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  {.    if( iRowid
30a90 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  ==FTS5_AVERAGES_
30aa0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 66  ROWID ){.      f
30ab0 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65  ts5DecodeAverage
30ac0 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29  s(&rc, &s, a, n)
30ad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30ae0 20 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72     fts5DecodeStr
30af0 75 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20  ucture(&rc, &s, 
30b00 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  a, n);.    }.  }
30b10 65 6c 73 65 20 69 66 28 20 65 44 65 74 61 69 6c  else if( eDetail
30b20 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46 74 73 35  None ){.    Fts5
30b30 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
30b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
30b50 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66  rent term read f
30b60 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  rom page */.    
30b70 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  int szLeaf;.    
30b80 69 6e 74 20 69 50 67 69 64 78 4f 66 66 20 3d 20  int iPgidxOff = 
30b90 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74  szLeaf = fts5Get
30ba0 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
30bb0 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  int iTermOff;.  
30bc0 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
30bd0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  .    int iOff;..
30be0 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d      memset(&term
30bf0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
30c00 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f  Buffer));..    /
30c10 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 65 6e 74  * Decode any ent
30c20 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
30c30 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
30c40 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 69 66   term. */.    if
30c50 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20 20  ( szLeaf<n ){.  
30c60 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d      iPgidxOff +=
30c70 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
30c80 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
30c90 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 7d  iTermOff);.    }
30ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 54 65 72  else{.      iTer
30cb0 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  mOff = szLeaf;. 
30cc0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63     }.    fts5Dec
30cd0 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63  odeRowidList(&rc
30ce0 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 54 65  , &s, &a[4], iTe
30cf0 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 69  rmOff-4);..    i
30d00 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
30d10 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c      while( iOff<
30d20 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
30d30 69 6e 74 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20  int nAppend;..  
30d40 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
30d50 74 65 72 6d 20 64 61 74 61 20 66 6f 72 20 74 68  term data for th
30d60 65 20 6e 65 78 74 20 74 65 72 6d 2a 2f 0a 20 20  e next term*/.  
30d70 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
30d80 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
30d90 4f 66 66 5d 2c 20 6e 41 70 70 65 6e 64 29 3b 0a  Off], nAppend);.
30da0 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e        term.n = n
30db0 4b 65 65 70 3b 0a 20 20 20 20 20 20 66 74 73 35  Keep;.      fts5
30dc0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
30dd0 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 41 70  (&rc, &term, nAp
30de0 70 65 6e 64 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  pend, &a[iOff]);
30df0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
30e00 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
30e10 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
30e20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d  &rc, &s, " term=
30e30 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28  %.*s", term.n, (
30e40 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d  const char*)term
30e50 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .p.      );.    
30e60 20 20 69 4f 66 66 20 2b 3d 20 6e 41 70 70 65 6e    iOff += nAppen
30e70 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67  d;..      /* Fig
30e80 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 68  ure out where th
30e90 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  e doclist for th
30ea0 69 73 20 74 65 72 6d 20 65 6e 64 73 20 2a 2f 0a  is term ends */.
30eb0 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78        if( iPgidx
30ec0 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
30ed0 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 20 20 20 20   int nIncr;.    
30ee0 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d      iPgidxOff +=
30ef0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
30f00 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
30f10 6e 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20  nIncr);.        
30f20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63  iTermOff += nInc
30f30 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
30f40 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66          iTermOff
30f50 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20   = szLeaf;.     
30f60 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 44 65   }..      fts5De
30f70 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72  codeRowidList(&r
30f80 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
30f90 20 69 54 65 72 6d 4f 66 66 2d 69 4f 66 66 29 3b   iTermOff-iOff);
30fa0 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54  .      iOff = iT
30fb0 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  ermOff;.      if
30fc0 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b  ( iOff<szLeaf ){
30fd0 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
30fe0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
30ff0 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
31000 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
31010 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
31020 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d  Free(&term);.  }
31030 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42 75  else{.    Fts5Bu
31040 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
31050 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
31060 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f  nt term read fro
31070 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  m page */.    in
31080 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
31090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
310a0 66 66 73 65 74 20 6f 66 20 70 67 69 64 78 20 69  ffset of pgidx i
310b0 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  n a[] */.    int
310c0 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20 20 20   iPgidxOff;.    
310d0 69 6e 74 20 69 50 67 69 64 78 50 72 65 76 20 3d  int iPgidxPrev =
310e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
310f0 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   Previous value 
31100 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64 78 20  read from pgidx 
31110 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d  */.    int iTerm
31120 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Off = 0;.    int
31130 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a   iRowidOff = 0;.
31140 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
31150 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a    int nDoclist;.
31160 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72  .    memset(&ter
31170 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
31180 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
31190 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20  if( n<4 ){.     
311a0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
311b0 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20 37  erSet(&rc, &s, 7
311c0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f  , (const u8*)"co
311d0 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20 67  rrupt");.      g
311e0 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
311f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31200 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
31210 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a  5GetU16(&a[0]);.
31220 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
31230 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47  = szLeaf = fts5G
31240 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20  etU16(&a[2]);.  
31250 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66      if( iPgidxOf
31260 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66  f<n ){.        f
31270 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
31280 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54  a[iPgidxOff], iT
31290 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d  ermOff);.      }
312a0 65 6c 73 65 20 69 66 28 20 69 50 67 69 64 78 4f  else if( iPgidxO
312b0 66 66 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>n ){.        
312c0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
312d0 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
312e0 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20  decode_out;.    
312f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
31300 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 6f 73  * Decode the pos
31310 69 74 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20  ition list tail 
31320 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
31330 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
31340 69 66 28 20 69 52 6f 77 69 64 4f 66 66 21 3d 30  if( iRowidOff!=0
31350 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d   ){.      iOff =
31360 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
31370 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f  }else if( iTermO
31380 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ff!=0 ){.      i
31390 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
313a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
313b0 20 69 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a   iOff = szLeaf;.
313c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4f      }.    if( iO
313d0 66 66 3e 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  ff>n ){.      rc
313e0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
313f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f  .      goto deco
31400 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  de_out;.    }.  
31410 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c    fts5DecodePosl
31420 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
31430 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20  4], iOff-4);..  
31440 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20    /* Decode any 
31450 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74  more doclist dat
31460 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f  a that appears o
31470 6e 20 74 68 65 20 70 61 67 65 20 62 65 66 6f 72  n the page befor
31480 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  e the.    ** fir
31490 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  st term. */.    
314a0 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72  nDoclist = (iTer
314b0 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20  mOff ? iTermOff 
314c0 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66  : szLeaf) - iOff
314d0 3b 0a 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69  ;.    if( nDocli
314e0 73 74 2b 69 4f 66 66 3e 6e 20 29 7b 0a 20 20 20  st+iOff>n ){.   
314f0 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52     rc = FTS5_COR
31500 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  RUPT;.      goto
31510 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20   decode_out;.   
31520 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64   }.    fts5Decod
31530 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
31540 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63  , &a[iOff], nDoc
31550 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c  list);..    whil
31560 65 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 26  e( iPgidxOff<n &
31570 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
31580 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69  ){.      int bFi
31590 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66  rst = (iPgidxOff
315a0 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f  ==szLeaf);     /
315b0 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73 74  * True for first
315c0 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
315d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
315e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31600 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f  Bytes of data */
31610 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b  .      int iEnd;
31620 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 50  .      .      iP
31630 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
31640 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
31650 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
31660 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 50 72  ;.      iPgidxPr
31670 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ev += nByte;.   
31680 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78     iOff = iPgidx
31690 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28  Prev;..      if(
316a0 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
316b0 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
316c0 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
316d0 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
316e0 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50         iEnd = iP
316f0 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65  gidxPrev + nByte
31700 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31710 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a         iEnd = sz
31720 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Leaf;.      }.  
31730 20 20 20 20 69 66 28 20 69 45 6e 64 3e 73 7a 4c      if( iEnd>szL
31740 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 72  eaf ){.        r
31750 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
31760 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
31770 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31780 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29 7b  if( bFirst==0 ){
31790 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
317a0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
317b0 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  (&a[iOff], nByte
317c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
317d0 42 79 74 65 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20  Byte>term.n ){. 
317e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54           rc = FT
317f0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
31800 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
31820 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  erm.n = nByte;. 
31830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 66       }.      iOf
31840 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
31850 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
31860 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
31870 20 69 4f 66 66 2b 6e 42 79 74 65 3e 6e 20 29 7b   iOff+nByte>n ){
31880 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54  .        rc = FT
31890 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
318a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
318b0 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66   }.      fts5Buf
318c0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72  ferAppendBlob(&r
318d0 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c  c, &term, nByte,
318e0 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20   &a[iOff]);.    
318f0 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65 3b    iOff += nByte;
31900 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
31910 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
31920 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
31930 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d   &rc, &s, " term
31940 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20  =%.*s", term.n, 
31950 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72  (const char*)ter
31960 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  m.p.      );.   
31970 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
31980 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
31990 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
319a0 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20 20 20 20  iEnd-iOff);.    
319b0 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  }..    fts5Buffe
319c0 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
319d0 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74  }.  . decode_out
319e0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
319f0 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  (a);.  if( rc==S
31a00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31a10 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
31a20 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73 74  ext(pCtx, (const
31a30 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c   char*)s.p, s.n,
31a40 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
31a50 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  T);.  }else{.   
31a60 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
31a70 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c  error_code(pCtx,
31a80 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35   rc);.  }.  fts5
31a90 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b 0a  BufferFree(&s);.
31aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  }../*.** The imp
31ab0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75  lementation of u
31ac0 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
31ad0 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  ar function fts5
31ae0 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61  _rowid()..*/.sta
31af0 74 69 63 20 76 6f 69 64 20 66 74 73 35 52 6f 77  tic void fts5Row
31b00 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  idFunction(.  sq
31b10 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
31b20 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
31b30 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
31b40 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
31b50 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
31b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31b70 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61  umber of args (a
31b80 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71  lways 2) */.  sq
31b90 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
31ba0 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
31bb0 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
31bc0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  nts */.){.  cons
31bd0 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
31be0 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20  if( nArg==0 ){. 
31bf0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
31c00 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22 73  t_error(pCtx, "s
31c10 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72  hould be: fts5_r
31c20 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e  owid(subject, ..
31c30 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  ..)", -1);.  }el
31c40 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 28  se{.    zArg = (
31c50 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
31c60 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
31c70 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pVal[0]);.    if
31c80 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
31c90 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65 67 6d  icmp(zArg, "segm
31ca0 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 69  ent") ){.      i
31cb0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
31cc0 20 69 6e 74 20 73 65 67 69 64 2c 20 70 67 6e 6f   int segid, pgno
31cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
31ce0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=3 ){.        s
31cf0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
31d00 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
31d10 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62         "should b
31d20 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73  e: fts5_rowid('s
31d30 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c 20  egment', segid, 
31d40 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20  pgno))", -1.    
31d50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c      );.      }el
31d60 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 67 69  se{.        segi
31d70 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
31d80 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b  e_int(apVal[1]);
31d90 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  .        pgno = 
31da0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
31db0 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20  t(apVal[2]);.   
31dc0 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46 54       iRowid = FT
31dd0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
31de0 28 73 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20  (segid, pgno);. 
31df0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
31e00 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
31e10 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
31e20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
31e30 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31e40 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
31e50 20 20 20 20 20 20 20 20 22 66 69 72 73 74 20 61          "first a
31e60 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69 64  rg to fts5_rowid
31e70 28 29 20 6d 75 73 74 20 62 65 20 27 73 65 67 6d  () must be 'segm
31e80 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20 20 20 20  ent'" , -1.     
31e90 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
31ea0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
31eb0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
31ec0 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65   registering the
31ed0 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77 69 74   FTS5 module wit
31ee0 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  h database.** co
31ef0 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49 74 20  nnection db. It 
31f00 72 65 67 69 73 74 65 72 73 20 73 65 76 65 72 61  registers severa
31f10 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  l user-defined s
31f20 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20  calar functions 
31f30 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46  useful.** with F
31f40 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  TS5..**.** If su
31f50 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
31f60 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
31f70 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
31f80 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a  urs, some other.
31f90 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
31fa0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
31fb0 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74   instead..*/.int
31fc0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
31fd0 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64  xInit(sqlite3 *d
31fe0 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  b){.  int rc = s
31ff0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
32000 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  nction(.      db
32010 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 22 2c  , "fts5_decode",
32020 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
32030 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75   0, fts5DecodeFu
32040 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29  nction, 0, 0.  )
32050 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
32060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
32070 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
32080 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20  e_function(.    
32090 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65      db, "fts5_de
320a0 63 6f 64 65 5f 6e 6f 6e 65 22 2c 20 32 2c 20 0a  code_none", 2, .
320b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
320c0 54 46 38 2c 20 28 76 6f 69 64 2a 29 64 62 2c 20  TF8, (void*)db, 
320d0 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
320e0 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  on, 0, 0.    );.
320f0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
32100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32110 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
32120 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
32130 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
32140 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49  rowid", -1, SQLI
32150 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
32160 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  RowidFunction, 0
32170 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  , 0.    );.  }. 
32180 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
32190 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
321a0 6e 64 65 78 52 65 73 65 74 28 46 74 73 35 49 6e  ndexReset(Fts5In
321b0 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dex *p){.  asser
321c0 74 28 20 70 2d 3e 70 53 74 72 75 63 74 3d 3d 30  t( p->pStruct==0
321d0 20 7c 7c 20 70 2d 3e 69 53 74 72 75 63 74 56 65   || p->iStructVe
321e0 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 69 66  rsion!=0 );.  if
321f0 28 20 66 74 73 35 49 6e 64 65 78 44 61 74 61 56  ( fts5IndexDataV
32200 65 72 73 69 6f 6e 28 70 29 21 3d 70 2d 3e 69 53  ersion(p)!=p->iS
32210 74 72 75 63 74 56 65 72 73 69 6f 6e 20 29 7b 0a  tructVersion ){.
32220 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
32230 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
32240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
32250 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
32260 0a 7d 0a                                         .}.