/ Hex Artifact Content
Login

Artifact 2d146d5c547f60d22d6fc4014d5e2b64248cd7c4:


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 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
4d20: 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
4d30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 74 72   /* Database str
4d40: 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20  ucture for this 
4d50: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74  iterator */.  Ft
4d60: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
4d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d80: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
4d90: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
4da0: 73 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  st */.  Fts5Cols
4db0: 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
4dc0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
4dd0: 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
4de0: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  hese columns */.
4df0: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64 20 74 6f  .  /* Invoked to
4e00: 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   set output vari
4e10: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76 6f 69 64  ables. */.  void
4e20: 20 28 2a 78 53 65 74 4f 75 74 70 75 74 73 29 28   (*xSetOutputs)(
4e30: 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 53  Fts5Iter*, Fts5S
4e40: 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20 69 6e 74  egIter*);..  int
4e50: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e70: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4e80: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4e90: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4eb0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4ec0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4ed0: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ef0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4f00: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4f10: 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20 69 53 77  es */..  i64 iSw
4f20: 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20 20 20  itchRowid;      
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4f40: 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20 6f 74  test rowid of ot
4f50: 68 65 72 20 74 68 61 6e 20 61 46 69 72 73 74 5b  her than aFirst[
4f60: 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  1] */.  Fts5CRes
4f70: 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20 20 20  ult *aFirst;    
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f90: 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28  nt merge state (
4fa0: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
4fb0: 46 74 73 35 53 65 67 49 74 65 72 20 61 53 65 67  Fts5SegIter aSeg
4fc0: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
4fd0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
4fe0: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f  ent iterators */
4ff0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  .};.../*.** An i
5000: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5010: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
5020: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5030: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5040: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5050: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5060: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5070: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5080: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5090: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
50a0: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
50b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
50c0: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
50d0: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
50e0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
50f0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5100: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5110: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5120: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
5130: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
5140: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5150: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5160: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
5170: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
5180: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
51b0: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
51c0: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51e0: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
5200: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5210: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5220: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
5230: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
5240: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5250: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5280: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5290: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
52a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
52b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
52c0: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
52d0: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
52e0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
52f0: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
5300: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5310: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5320: 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  [1];.};..static 
5330: 76 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28  void fts5PutU16(
5340: 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56  u8 *aOut, u16 iV
5350: 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d  al){.  aOut[0] =
5360: 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f   (iVal>>8);.  aO
5370: 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78  ut[1] = (iVal&0x
5380: 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  FF);.}..static u
5390: 31 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f  16 fts5GetU16(co
53a0: 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20  nst u8 *aIn){.  
53b0: 72 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e  return ((u16)aIn
53c0: 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b  [0] << 8) + aIn[
53d0: 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c  1];.} ../*.** Al
53e0: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
53f0: 6e 20 61 20 62 75 66 66 65 72 20 61 74 20 6c 65  n a buffer at le
5400: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20  ast nByte bytes 
5410: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
5420: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
5430: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72  s encountered, r
5440: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73  eturn NULL and s
5450: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
5460: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35  e in.** the Fts5
5470: 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73  Index handle pas
5480: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5490: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49  atic void *fts5I
54b0: 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64  dxMalloc(Fts5Ind
54c0: 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ex *p, int nByte
54d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
54e0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
54f0: 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
5500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
5510: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5520: 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75 66  of the pLeft buf
5530: 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52 69  fer with the pRi
5540: 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e  ght/nRight blob.
5550: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
5560: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
5570: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
5580: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
5590: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
55a0: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
55b0: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
55c0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
55d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
55e0: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
55f0: 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ht.*/.#ifdef SQL
5600: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5610: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
5620: 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74  ompareBlob(.  Ft
5630: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5650: 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20   Left hand side 
5660: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
5670: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
5680: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20  ght, int nRight 
5690: 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64     /* Right hand
56a0: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
56b0: 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
56c0: 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74  nCmp = MIN(pLeft
56d0: 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20  ->n, nRight);.  
56e0: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
56f0: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5700: 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  t, nCmp);.  retu
5710: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
5720: 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29  eft->n - nRight)
5730: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
5740: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  f../*.** Compare
5750: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
5760: 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
5770: 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
5780: 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a   If one buffer.*
5790: 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  * is a prefix of
57a0: 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
57b0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65  s considered the
57c0: 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   lesser..**.** R
57d0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
57e0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
57f0: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
5800: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
5810: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
5820: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
5830: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
5840: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
5850: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
5860: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
5870: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
5880: 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42  ferCompare(Fts5B
5890: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74  uffer *pLeft, Ft
58a0: 73 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74  s5Buffer *pRight
58b0: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
58c0: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52  MIN(pLeft->n, pR
58d0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20  ight->n);.  int 
58e0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
58f0: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70  ft->p, pRight->p
5900: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
5910: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
5920: 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e  ft->n - pRight->
5930: 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73 74  n) : res);.}..st
5940: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65 61  atic int fts5Lea
5950: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46 74  fFirstTermOff(Ft
5960: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a  s5Data *pLeaf){.
5970: 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74 73    int ret;.  fts
5980: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
5990: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
59a0: 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20 72  Leaf], ret);.  r
59b0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
59c0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
59d0: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
59e0: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
59f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
5a00: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
5a10: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
5a20: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
5a30: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
5a40: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20  3_blob *pReader 
5a50: 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20  = p->pReader;.  
5a60: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
5a70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  ;.    sqlite3_bl
5a80: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
5a90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
5aa0: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
5ab0: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
5ac0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
5ad0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5ae0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
5af0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
5b00: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
5b10: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
5b20: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
5b30: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
5b40: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
5b50: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
5b60: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
5b70: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
5b80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b90: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
5ba0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28  ITE_OK;..    if(
5bb0: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
5bc0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
5bd0: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
5be0: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
5bf0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
5c00: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
5c10: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
5c20: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
5c30: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
5c40: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
5c50: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
5c60: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
5c70: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5c80: 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65  Blob = p->pReade
5c90: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  r;.      p->pRea
5ca0: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  der = 0;.      r
5cb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5cc0: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
5cd0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73  Rowid);.      as
5ce0: 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
5cf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
5d00: 70 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b  pReader = pBlob;
5d10: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
5d20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5d30: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
5d40: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  der(p);.      }.
5d50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5d60: 4c 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20  LITE_ABORT ) rc 
5d70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5d90: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  e blob handle is
5da0: 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69   not open at thi
5db0: 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74  s point, open it
5dc0: 20 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a   and seek .    *
5dd0: 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  * to the request
5de0: 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20  ed entry.  */.  
5df0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5e00: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
5e10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
5e20: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
5e30: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
5e40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5e50: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
5e60: 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20  nfig->db, .     
5e70: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
5e80: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
5e90: 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
5ea0: 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a   0, &p->pReader.
5eb0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
5ec0: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
5ed0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
5ee0: 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73  blob_open() or s
5ef0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
5f00: 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  en() calls.    *
5f10: 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64  * above returned
5f20: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72   SQLITE_ERROR, r
5f30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5f40: 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61  RUPT_VTAB instea
5f50: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68  d..    ** All th
5f60: 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20  e reasons those 
5f70: 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20  functions might 
5f80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5f90: 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20  ROR - missing.  
5fa0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73    ** table, miss
5fb0: 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f  ing row, non-blo
5fc0: 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20  b/text in block 
5fd0: 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74  column - indicat
5fe0: 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e  e .    ** backin
5ff0: 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69  g store corrupti
6000: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  on.  */.    if( 
6010: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
6020: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
6030: 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72  RUPT;..    if( r
6040: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6050: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d        u8 *aOut =
6060: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6070: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6080: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6090: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
60a0: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
60b0: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
60c0: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
60d0: 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a  int nAlloc = siz
60e0: 65 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20  eof(Fts5Data) + 
60f0: 6e 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41 54  nByte + FTS5_DAT
6100: 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20  A_PADDING;.     
6110: 20 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74   pRet = (Fts5Dat
6120: 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  a*)sqlite3_mallo
6130: 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  c(nAlloc);.     
6140: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
6150: 20 20 20 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20       pRet->nn = 
6160: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 61  nByte;.        a
6170: 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20  Out = pRet->p = 
6180: 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20  (u8*)&pRet[1];. 
6190: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
61a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
61b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a  NOMEM;.      }..
61c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
61d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
61e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
61f0: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65  blob_read(p->pRe
6200: 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74  ader, aOut, nByt
6210: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
6220: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
6230: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6240: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6250: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
6260: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  et = 0;.      }e
6270: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
6280: 54 4f 44 4f 31 3a 20 46 69 78 20 74 68 69 73 20  TODO1: Fix this 
6290: 2a 2f 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  */.        pRet-
62a0: 3e 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65  >szLeaf = fts5Ge
62b0: 74 55 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d  tU16(&pRet->p[2]
62c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
62d0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
62e0: 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b  .    p->nRead++;
62f0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
6300: 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72  (pRet==0)==(p->r
6310: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  c!=SQLITE_OK) );
6320: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
6330: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
6340: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
6350: 64 61 74 61 20 72 65 63 6f 72 64 20 72 65 74 75  data record retu
6360: 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  rned by an earli
6370: 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74  er call to.** ft
6380: 73 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f  s5DataRead()..*/
6390: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
63a0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 46 74 73  5DataRelease(Fts
63b0: 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20  5Data *pData){. 
63c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
63d0: 61 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ata);.}..static 
63e0: 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 4c 65  Fts5Data *fts5Le
63f0: 61 66 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  afRead(Fts5Index
6400: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29   *p, i64 iRowid)
6410: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52  {.  Fts5Data *pR
6420: 65 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  et = fts5DataRea
6430: 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  d(p, iRowid);.  
6440: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
6450: 69 66 28 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66  if( pRet->szLeaf
6460: 3e 70 52 65 74 2d 3e 6e 6e 20 29 7b 0a 20 20 20  >pRet->nn ){.   
6470: 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
6480: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 66  CORRUPT;.      f
6490: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
64a0: 52 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74  Ret);.      pRet
64b0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
64c0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
64d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
64e0: 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
64f0: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
6500: 70 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  p,.  sqlite3_stm
6510: 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68  t **ppStmt,.  ch
6520: 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66  ar *zSql.){.  if
6530: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
6540: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  OK ){.    if( zS
6550: 71 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  ql ){.      p->r
6560: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
6570: 61 72 65 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69  are_v2(p->pConfi
6580: 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  g->db, zSql, -1,
6590: 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   ppStmt, 0);.   
65a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
65b0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
65c0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
65d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
65e0: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  l);.  return p->
65f0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e  rc;.}.../*.** IN
6600: 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
6610: 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  a record into th
6620: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
6630: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6640: 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74 73  ts5DataWrite(Fts
6650: 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
6660: 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20  Rowid, const u8 
6670: 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
6680: 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  a){.  if( p->rc!
6690: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
66a0: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  urn;..  if( p->p
66b0: 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  Writer==0 ){.   
66c0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
66d0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
66e0: 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
66f0: 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
6700: 70 2d 3e 70 57 72 69 74 65 72 2c 20 73 71 6c 69  p->pWriter, sqli
6710: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
6720: 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20         "REPLACE 
6730: 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 64 61  INTO '%q'.'%q_da
6740: 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56  ta'(id, block) V
6750: 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20 20  ALUES(?,?)", .  
6760: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
6770: 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
6780: 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 20  Name.    ));.   
6790: 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
67a0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  urn;.  }..  sqli
67b0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
67c0: 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69 52  ->pWriter, 1, iR
67d0: 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
67e0: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57  _bind_blob(p->pW
67f0: 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61 2c  riter, 2, pData,
6800: 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 53   nData, SQLITE_S
6810: 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
6820: 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74 65  3_step(p->pWrite
6830: 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71  r);.  p->rc = sq
6840: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
6850: 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Writer);.}../*.*
6860: 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66 6f  * Execute the fo
6870: 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a  llowing SQL:.**.
6880: 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  **     DELETE FR
6890: 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45 20  OM %_data WHERE 
68a0: 69 64 20 42 45 54 57 45 45 4e 20 24 69 46 69 72  id BETWEEN $iFir
68b0: 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f  st AND $iLast.*/
68c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
68d0: 35 44 61 74 61 44 65 6c 65 74 65 28 46 74 73 35  5DataDelete(Fts5
68e0: 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46  Index *p, i64 iF
68f0: 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29  irst, i64 iLast)
6900: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  {.  if( p->rc!=S
6910: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6920: 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  n;..  if( p->pDe
6930: 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  leter==0 ){.    
6940: 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35  int rc;.    Fts5
6950: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
6960: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
6970: 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
6980: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
6990: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
69a0: 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 64 61  FROM '%q'.'%q_da
69b0: 74 61 27 20 57 48 45 52 45 20 69 64 3e 3d 3f 20  ta' WHERE id>=? 
69c0: 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 0a 20 20 20  AND id<=?", .   
69d0: 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e         pConfig->
69e0: 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  zDb, pConfig->zN
69f0: 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ame.    );.    i
6a00: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
6a10: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6a20: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
6a30: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6a40: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
6a50: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
6a60: 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65  l, -1, &p->pDele
6a70: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
6a80: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
6a90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6aa0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6ab0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6ac0: 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
6ad0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
6ae0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
6af0: 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31  4(p->pDeleter, 1
6b00: 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71 6c  , iFirst);.  sql
6b10: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
6b20: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c 20  p->pDeleter, 2, 
6b30: 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  iLast);.  sqlite
6b40: 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65 74  3_step(p->pDelet
6b50: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
6b60: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
6b70: 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  pDeleter);.}../*
6b80: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72  .** Remove all r
6b90: 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74 65  ecords associate
6ba0: 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20 69  d with segment i
6bb0: 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  Segid..*/.static
6bc0: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
6bd0: 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35  moveSegment(Fts5
6be0: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 53  Index *p, int iS
6bf0: 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69  egid){.  i64 iFi
6c00: 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  rst = FTS5_SEGME
6c10: 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
6c20: 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61 73 74   0);.  i64 iLast
6c30: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
6c40: 52 4f 57 49 44 28 69 53 65 67 69 64 2b 31 2c 20  ROWID(iSegid+1, 
6c50: 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74 61  0)-1;.  fts5Data
6c60: 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73 74  Delete(p, iFirst
6c70: 2c 20 69 4c 61 73 74 29 3b 0a 20 20 69 66 28 20  , iLast);.  if( 
6c80: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 3d 3d  p->pIdxDeleter==
6c90: 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
6ca0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
6cb0: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
6cc0: 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
6cd0: 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 44  tmt(p, &p->pIdxD
6ce0: 65 6c 65 74 65 72 2c 20 73 71 6c 69 74 65 33 5f  eleter, sqlite3_
6cf0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
6d00: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
6d10: 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48  '%q'.'%q_idx' WH
6d20: 45 52 45 20 73 65 67 69 64 3d 3f 22 2c 0a 20 20  ERE segid=?",.  
6d30: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
6d40: 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
6d50: 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d  Name.    ));.  }
6d60: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
6d70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
6d80: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
6d90: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c 20  p->pIdxDeleter, 
6da0: 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20 20 20  1, iSegid);.    
6db0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
6dc0: 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20  pIdxDeleter);.  
6dd0: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
6de0: 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78 44  3_reset(p->pIdxD
6df0: 65 6c 65 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  eleter);.  }.}..
6e00: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
6e10: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20  reference to an 
6e20: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
6e30: 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20 62 79  ject returned by
6e40: 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20   an earlier .** 
6e50: 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72 75  call to fts5Stru
6e60: 63 74 75 72 65 52 65 61 64 28 29 20 6f 72 20 66  ctureRead() or f
6e70: 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
6e80: 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de()..*/.static 
6e90: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
6ea0: 72 65 52 65 6c 65 61 73 65 28 46 74 73 35 53 74  reRelease(Fts5St
6eb0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
6ec0: 29 7b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  ){.  if( pStruct
6ed0: 20 26 26 20 30 3e 3d 28 2d 2d 70 53 74 72 75 63   && 0>=(--pStruc
6ee0: 74 2d 3e 6e 52 65 66 29 20 29 7b 0a 20 20 20 20  t->nRef) ){.    
6ef0: 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72  int i;.    asser
6f00: 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 52 65 66  t( pStruct->nRef
6f10: 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==0 );.    for(i
6f20: 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e  =0; i<pStruct->n
6f30: 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
6f40: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6f50: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
6f60: 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a  i].aSeg);.    }.
6f70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6f80: 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d  (pStruct);.  }.}
6f90: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
6fa0: 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28 46  s5StructureRef(F
6fb0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
6fc0: 74 72 75 63 74 29 7b 0a 20 20 70 53 74 72 75 63  truct){.  pStruc
6fd0: 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a  t->nRef++;.}../*
6fe0: 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
6ff0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
7000: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20  tructure record 
7010: 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
7020: 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a   in serialized.*
7030: 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62 75  * form within bu
7040: 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74 61  ffer pData/nData
7050: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
7060: 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c  Structure.aLevel
7070: 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35  [] and each Fts5
7080: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61  StructureLevel.a
7090: 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  Seg[] array.** a
70a0: 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65  re over-allocate
70b0: 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54  d by one slot. T
70c0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73  his allows the s
70d0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e 74  tructure content
70e0: 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20  s.** to be more 
70f0: 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a  easily edited..*
7100: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
7110: 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74 20   occurs, *ppOut 
7120: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
7130: 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  nd an SQLite err
7140: 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72  or code.** retur
7150: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
7160: 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *ppOut is set to
7170: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
7180: 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20  w object and.** 
7190: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
71a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
71b0: 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  t fts5StructureD
71c0: 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 75  ecode(.  const u
71d0: 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  8 *pData,       
71e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
71f0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65  er containing se
7200: 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75  rialized structu
7210: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  re */.  int nDat
7220: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
7230: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
7240: 6f 66 20 62 75 66 66 65 72 20 70 44 61 74 61 20  of buffer pData 
7250: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
7260: 74 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20  t *piCookie,    
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7280: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   Configuration c
7290: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
72a0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
72b0: 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
72c0: 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61   /* OUT: Deseria
72d0: 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  lized object */.
72e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
72f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
7300: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c   = 0;.  int iLvl
7310: 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d  ;.  int nLevel =
7320: 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   0;.  int nSegme
7330: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42  nt = 0;.  int nB
7340: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
7350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
7360: 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61  es of space to a
7370: 6c 6c 6f 63 61 74 65 20 61 74 20 70 52 65 74 20  llocate at pRet 
7380: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
7390: 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20  re *pRet = 0;   
73a0: 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72       /* Structur
73b0: 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75  e object to retu
73c0: 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62  rn */..  /* Grab
73d0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
73e0: 65 20 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f  e */.  if( piCoo
73f0: 6b 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20  kie ) *piCookie 
7400: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
7410: 33 32 28 70 44 61 74 61 29 3b 0a 20 20 69 20 3d  32(pData);.  i =
7420: 20 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   4;..  /* Read t
7430: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
7440: 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65  of levels and se
7450: 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  gments from the 
7460: 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a  start of the.  *
7470: 2a 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  * structure reco
7480: 72 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66  rd.  */.  i += f
7490: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
74a0: 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c  pData[i], nLevel
74b0: 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65  );.  i += fts5Ge
74c0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
74d0: 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a  [i], nSegment);.
74e0: 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20    nByte = (.    
74f0: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7500: 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20  ucture) +       
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7520: 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a  Main structure *
7530: 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  /.      sizeof(F
7540: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7550: 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2d 31 29 20  l) * (nLevel-1) 
7560: 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61     /* aLevel[] a
7570: 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70  rray */.  );.  p
7580: 52 65 74 20 3d 20 28 46 74 73 35 53 74 72 75 63  Ret = (Fts5Struc
7590: 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73  ture*)sqlite3Fts
75a0: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
75b0: 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20   nByte);..  if( 
75c0: 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74  pRet ){.    pRet
75d0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
75e0: 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  pRet->nLevel = n
75f0: 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d  Level;.    pRet-
7600: 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67  >nSegment = nSeg
7610: 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73  ment;.    i += s
7620: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
7630: 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26  int(&pData[i], &
7640: 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  pRet->nWriteCoun
7650: 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  ter);..    for(i
7660: 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  Lvl=0; rc==SQLIT
7670: 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c 65  E_OK && iLvl<nLe
7680: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
7690: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
76a0: 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
76b0: 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  pRet->aLevel[iLv
76c0: 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  l];.      int nT
76d0: 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
76e0: 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20  int iSeg;..     
76f0: 20 69 66 28 20 69 3e 3d 6e 44 61 74 61 20 29 7b   if( i>=nData ){
7700: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54  .        rc = FT
7710: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
7720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7730: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
7740: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
7750: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a   pLvl->nMerge);.
7760: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
7770: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
7780: 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b  ata[i], nTotal);
7790: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
77a0: 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e   nTotal>=pLvl->n
77b0: 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20 20 20  Merge );.       
77c0: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46   pLvl->aSeg = (F
77d0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
77e0: 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ent*)sqlite3Fts5
77f0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
7800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 54 6f  .            nTo
7810: 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  tal * sizeof(Fts
7820: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
7830: 74 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  t).        );.  
7840: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
7850: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7860: 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  {.        pLvl->
7870: 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20  nSeg = nTotal;. 
7880: 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
7890: 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20  0; iSeg<nTotal; 
78a0: 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
78b0: 20 20 20 69 66 28 20 69 3e 3d 6e 44 61 74 61 20     if( i>=nData 
78c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
78d0: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
78e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
78f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
7900: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7910: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7920: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7930: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
7940: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  id);.          i
7950: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7960: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
7970: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
7980: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20  pgnoFirst);.    
7990: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
79a0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
79b0: 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  a[i], pLvl->aSeg
79c0: 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29  [iSeg].pgnoLast)
79d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
79e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
79f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7a00: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
7a10: 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52  uctureRelease(pR
7a20: 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20  et);.      pRet 
7a30: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
7a40: 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b    *ppOut = pRet;
7a50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7a60: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
7a70: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
7a80: 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20  ureAddLevel(int 
7a90: 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74  *pRc, Fts5Struct
7aa0: 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b  ure **ppStruct){
7ab0: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
7ac0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
7ad0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
7ae0: 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
7af0: 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c  ;.    int nLevel
7b00: 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   = pStruct->nLev
7b10: 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  el;.    int nByt
7b20: 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69  e = (.        si
7b30: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7b40: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
7b50: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
7b60: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7b70: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7b80: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
7b90: 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20   (nLevel+1)  /* 
7ba0: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
7bb0: 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53  /.    );..    pS
7bc0: 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f  truct = sqlite3_
7bd0: 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c  realloc(pStruct,
7be0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
7bf0: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
7c00: 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63    memset(&pStruc
7c10: 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c  t->aLevel[nLevel
7c20: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  ], 0, sizeof(Fts
7c30: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
7c40: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
7c50: 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20  ->nLevel++;.    
7c60: 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
7c70: 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65  truct;.    }else
7c80: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
7c90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
7ca0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7cb0: 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76  Extend level iLv
7cc0: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  l so that there 
7cd0: 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c  is room for at l
7ce0: 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65  east nExtra more
7cf0: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f  .** segments..*/
7d00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7d10: 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
7d20: 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52  Level(.  int *pR
7d30: 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74  c, .  Fts5Struct
7d40: 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20  ure *pStruct, . 
7d50: 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e   int iLvl, .  in
7d60: 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74  t nExtra, .  int
7d70: 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66   bInsert.){.  if
7d80: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
7d90: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
7da0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
7db0: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
7dc0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
7dd0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
7de0: 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20  ment *aNew;.    
7df0: 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  int nByte;..    
7e00: 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nByte = (pLvl->n
7e10: 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20  Seg + nExtra) * 
7e20: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7e30: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
7e40: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
7e50: 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61  _realloc(pLvl->a
7e60: 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Seg, nByte);.   
7e70: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
7e80: 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d     if( bInsert==
7e90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ){.        mem
7ea0: 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e  set(&aNew[pLvl->
7eb0: 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSeg], 0, sizeof
7ec0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7ed0: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
7ee0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7ef0: 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65         int nMove
7f00: 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20   = pLvl->nSeg * 
7f10: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7f20: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
7f30: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61        memmove(&a
7f40: 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65  New[nExtra], aNe
7f50: 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20  w, nMove);.     
7f60: 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20     memset(aNew, 
7f70: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
7f80: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20  ructureSegment) 
7f90: 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  * nExtra);.     
7fa0: 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61   }.      pLvl->a
7fb0: 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  Seg = aNew;.    
7fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
7fd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7fe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
7ff0: 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74  tatic Fts5Struct
8000: 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75  ure *fts5Structu
8010: 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28 46  reReadUncached(F
8020: 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
8030: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8040: 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 43  Ret = 0;.  Fts5C
8050: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
8060: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69   p->pConfig;.  i
8070: 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20  nt iCookie;     
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8090: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
80a0: 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73 35  cookie */.  Fts5
80b0: 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20  Data *pData;..  
80c0: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
80d0: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54 52  Read(p, FTS5_STR
80e0: 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a 20  UCTURE_ROWID);. 
80f0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
8100: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
8110: 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65 64  TODO: Do we need
8120: 20 74 68 69 73 20 69 66 20 74 68 65 20 6c 65 61   this if the lea
8130: 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70 65 6e  f-index is appen
8140: 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e 2e  ded? Probably...
8150: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
8160: 70 44 61 74 61 2d 3e 70 5b 70 44 61 74 61 2d 3e  pData->p[pData->
8170: 6e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41 54  nn], 0, FTS5_DAT
8180: 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  A_PADDING);.    
8190: 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74 72 75  p->rc = fts5Stru
81a0: 63 74 75 72 65 44 65 63 6f 64 65 28 70 44 61 74  ctureDecode(pDat
81b0: 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 6e 2c  a->p, pData->nn,
81c0: 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65 74   &iCookie, &pRet
81d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
81e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
81f0: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21  Config->iCookie!
8200: 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20  =iCookie ){.    
8210: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
8220: 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28  3Fts5ConfigLoad(
8230: 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65  pConfig, iCookie
8240: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
8250: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
8260: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ta);.    if( p->
8270: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8280: 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
8290: 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74  tureRelease(pRet
82a0: 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  );.      pRet = 
82b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
82c0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
82d0: 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 49  static i64 fts5I
82e0: 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e 28  ndexDataVersion(
82f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
8300: 20 69 36 34 20 69 56 65 72 73 69 6f 6e 20 3d 20   i64 iVersion = 
8310: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
8320: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8330: 20 20 69 66 28 20 70 2d 3e 70 44 61 74 61 56 65    if( p->pDataVe
8340: 72 73 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  rsion==0 ){.    
8350: 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 49 6e    p->rc = fts5In
8360: 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
8370: 2c 20 26 70 2d 3e 70 44 61 74 61 56 65 72 73 69  , &p->pDataVersi
8380: 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  on, .          s
8390: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
83a0: 50 52 41 47 4d 41 20 25 51 2e 64 61 74 61 5f 76  PRAGMA %Q.data_v
83b0: 65 72 73 69 6f 6e 22 2c 20 70 2d 3e 70 43 6f 6e  ersion", p->pCon
83c0: 66 69 67 2d 3e 7a 44 62 29 0a 20 20 20 20 20 20  fig->zDb).      
83d0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
83e0: 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20   p->rc ) return 
83f0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
8400: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
8410: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44  lite3_step(p->pD
8420: 61 74 61 56 65 72 73 69 6f 6e 29 20 29 7b 0a 20  ataVersion) ){. 
8430: 20 20 20 20 20 69 56 65 72 73 69 6f 6e 20 3d 20       iVersion = 
8440: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
8450: 6e 74 36 34 28 70 2d 3e 70 44 61 74 61 56 65 72  nt64(p->pDataVer
8460: 73 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  sion, 0);.    }.
8470: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
8480: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 61  te3_reset(p->pDa
8490: 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 7d 0a  taVersion);.  }.
84a0: 0a 20 20 72 65 74 75 72 6e 20 69 56 65 72 73 69  .  return iVersi
84b0: 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  on;.}../*.** Rea
84c0: 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20 61  d, deserialize a
84d0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74  nd return the st
84e0: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a  ructure record..
84f0: 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74  **.** The Fts5St
8500: 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d  ructure.aLevel[]
8510: 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74   and each Fts5St
8520: 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65  ructureLevel.aSe
8530: 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  g[] array.** are
8540: 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20   over-allocated 
8550: 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f 72  as described for
8560: 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53 74   function fts5St
8570: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 20  ructureDecode() 
8580: 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  .** above..**.**
8590: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
85a0: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
85b0: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
85c0: 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20  or code left in 
85d0: 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78  the.** Fts5Index
85e0: 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65   handle. If an e
85f0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
8600: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
8610: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
8620: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
8630: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
8640: 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72  tic Fts5Structur
8650: 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72 65  e *fts5Structure
8660: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
8670: 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 53  p){..  if( p->pS
8680: 74 72 75 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  truct==0 ){.    
8690: 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f  p->iStructVersio
86a0: 6e 20 3d 20 66 74 73 35 49 6e 64 65 78 44 61 74  n = fts5IndexDat
86b0: 61 56 65 72 73 69 6f 6e 28 70 29 3b 0a 20 20 20  aVersion(p);.   
86c0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
86d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
86e0: 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73 35  ->pStruct = fts5
86f0: 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e 63  StructureReadUnc
8700: 61 63 68 65 64 28 70 29 3b 0a 20 20 20 20 7d 0a  ached(p);.    }.
8710: 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 65 6c 73    }..#if 0.  els
8720: 65 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  e{.    Fts5Struc
8730: 74 75 72 65 20 2a 70 54 65 73 74 20 3d 20 66 74  ture *pTest = ft
8740: 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55  s5StructureReadU
8750: 6e 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20 20  ncached(p);.    
8760: 69 66 28 20 70 54 65 73 74 20 29 7b 0a 20 20 20  if( pTest ){.   
8770: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
8780: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
8790: 3e 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65  >pStruct->nSegme
87a0: 6e 74 3d 3d 70 54 65 73 74 2d 3e 6e 53 65 67 6d  nt==pTest->nSegm
87b0: 65 6e 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ent );.      ass
87c0: 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75  ert_nc( p->pStru
87d0: 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 65 73  ct->nLevel==pTes
87e0: 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 20  t->nLevel );.   
87f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
8800: 65 73 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  est->nLevel; i++
8810: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8820: 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74  t_nc( p->pStruct
8830: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72  ->aLevel[i].nMer
8840: 67 65 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76 65  ge==pTest->aLeve
8850: 6c 5b 69 5d 2e 6e 4d 65 72 67 65 20 29 3b 0a 20  l[i].nMerge );. 
8860: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
8870: 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61 4c  ( p->pStruct->aL
8880: 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3d 3d 70 54  evel[i].nSeg==pT
8890: 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e  est->aLevel[i].n
88a0: 53 65 67 20 29 3b 0a 20 20 20 20 20 20 20 20 66  Seg );.        f
88b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 65 73 74 2d  or(j=0; j<pTest-
88c0: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b  >aLevel[i].nSeg;
88d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
88e0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
88f0: 67 6d 65 6e 74 20 2a 70 31 20 3d 20 26 70 54 65  gment *p1 = &pTe
8900: 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53  st->aLevel[i].aS
8910: 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  eg[j];.         
8920: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
8930: 67 6d 65 6e 74 20 2a 70 32 20 3d 20 26 70 2d 3e  gment *p2 = &p->
8940: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8950: 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20 20 20  i].aSeg[j];.    
8960: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
8970: 20 70 31 2d 3e 69 53 65 67 69 64 3d 3d 70 32 2d   p1->iSegid==p2-
8980: 3e 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20 20  >iSegid );.     
8990: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
89a0: 70 31 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 70  p1->pgnoFirst==p
89b0: 32 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 3b 0a  2->pgnoFirst );.
89c0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
89d0: 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 4c 61 73  _nc( p1->pgnoLas
89e0: 74 3d 3d 70 32 2d 3e 70 67 6e 6f 4c 61 73 74 20  t==p2->pgnoLast 
89f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8a00: 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 53     }.      fts5S
8a10: 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
8a20: 70 54 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pTest);.    }.  
8a30: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
8a40: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
8a50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
8a60: 73 73 65 72 74 28 20 70 2d 3e 69 53 74 72 75 63  ssert( p->iStruc
8a70: 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20  tVersion!=0 );. 
8a80: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74 72   assert( p->pStr
8a90: 75 63 74 21 3d 30 20 29 3b 0a 20 20 66 74 73 35  uct!=0 );.  fts5
8aa0: 53 74 72 75 63 74 75 72 65 52 65 66 28 70 2d 3e  StructureRef(p->
8ab0: 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75  pStruct);.  retu
8ac0: 72 6e 20 70 2d 3e 70 53 74 72 75 63 74 3b 0a 7d  rn p->pStruct;.}
8ad0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
8ae0: 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
8af0: 69 64 61 74 65 28 46 74 73 35 49 6e 64 65 78 20  idate(Fts5Index 
8b00: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 53  *p){.  if( p->pS
8b10: 74 72 75 63 74 20 29 7b 0a 20 20 20 20 66 74 73  truct ){.    fts
8b20: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
8b30: 65 28 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20  e(p->pStruct);. 
8b40: 20 20 20 70 2d 3e 70 53 74 72 75 63 74 20 3d 20     p->pStruct = 
8b50: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
8b60: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
8b70: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
8b80: 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72  nts in index str
8b90: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
8ba0: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
8bb0: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73   is only ever us
8bc0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
8bd0: 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e  sert() condition
8be0: 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
8bf0: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
8c00: 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75   int fts5Structu
8c10: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
8c20: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8c30: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e  Struct){.  int n
8c40: 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20  Segment = 0;    
8c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
8c60: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
8c70: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20  gments */.  if( 
8c80: 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69  pStruct ){.    i
8c90: 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8cb0: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
8cc0: 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
8cd0: 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  /.    for(iLvl=0
8ce0: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
8cf0: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
8d00: 0a 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74 20  .      nSegment 
8d10: 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  += pStruct->aLev
8d20: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20  el[iLvl].nSeg;. 
8d30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
8d40: 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23  rn nSegment;.}.#
8d50: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66  endif..#define f
8d60: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
8d70: 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 42  endBlob(pBuf, pB
8d80: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 20 20  lob, nBlob) {   
8d90: 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70    \.  assert( (p
8da0: 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 28  Buf)->nSpace>=((
8db0: 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29 20  pBuf)->n+nBlob) 
8dc0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  );             \
8dd0: 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42 75 66  .  memcpy(&(pBuf
8de0: 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c  )->p[(pBuf)->n],
8df0: 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20   pBlob, nBlob); 
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
8e10: 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42 6c  (pBuf)->n += nBl
8e20: 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e40: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64           \.}..#d
8e50: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
8e60: 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
8e70: 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b 20 20  (pBuf, iVal) {  
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
8e90: 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 73    (pBuf)->n += s
8ea0: 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
8eb0: 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70 5b 28  int(&(pBuf)->p[(
8ec0: 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56 61 6c  pBuf)->n], (iVal
8ed0: 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72 74 28  ));  \.  assert(
8ee0: 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e   (pBuf)->nSpace>
8ef0: 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20 20 20  =(pBuf)->n );   
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a         \.}.../*.
8f20: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64  ** Serialize and
8f30: 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75   store the "stru
8f40: 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a  cture" record..*
8f50: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
8f60: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
8f70: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  n error code in 
8f80: 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62  the Fts5Index ob
8f90: 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65  ject. If an.** e
8fa0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
8fb0: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
8fc0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
8fd0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
8fe0: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
8ff0: 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  eWrite(Fts5Index
9000: 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75   *p, Fts5Structu
9010: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
9020: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
9030: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
9040: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
9050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
9060: 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65  fer to serialize
9070: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a   record into */.
9080: 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
90b0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
90c0: 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  els */.    int i
90d0: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
90e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b           /* Cook
90f0: 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72  ie value to stor
9100: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
9110: 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
9120: 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
9130: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
9140: 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
9150: 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
9160: 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
9170: 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  r));..    /* App
9180: 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  end the current 
9190: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  configuration co
91a0: 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f  okie */.    iCoo
91b0: 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  kie = p->pConfig
91c0: 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69  ->iCookie;.    i
91d0: 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69  f( iCookie<0 ) i
91e0: 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a 20 20 20  Cookie = 0;..   
91f0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 46   if( 0==sqlite3F
9200: 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
9210: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 2b 39 2b  ->rc, &buf, 4+9+
9220: 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20 73 71  9+9) ){.      sq
9230: 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 62  lite3Fts5Put32(b
9240: 75 66 2e 70 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a  uf.p, iCookie);.
9250: 20 20 20 20 20 20 62 75 66 2e 6e 20 3d 20 34 3b        buf.n = 4;
9260: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
9270: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
9280: 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d  t(&buf, pStruct-
9290: 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  >nLevel);.      
92a0: 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
92b0: 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c  pendVarint(&buf,
92c0: 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
92d0: 6e 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  nt);.      fts5B
92e0: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
92f0: 61 72 69 6e 74 28 26 62 75 66 2c 20 28 69 36 34  arint(&buf, (i64
9300: 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65  )pStruct->nWrite
9310: 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 7d 0a  Counter);.    }.
9320: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
9330: 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
9340: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
9350: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 20        int iSeg; 
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
9380: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
9390: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  egments */.     
93a0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
93b0: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
93c0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
93d0: 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  l];.      fts5Bu
93e0: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
93f0: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
9400: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20  Lvl->nMerge);.  
9410: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9420: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9430: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
9440: 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Seg);.      asse
9450: 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
9460: 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
9470: 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d  .      for(iSeg=
9480: 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53  0; iSeg<pLvl->nS
9490: 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
94a0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
94b0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
94c0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
94d0: 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69  aSeg[iSeg].iSegi
94e0: 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
94f0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9500: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9510: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
9520: 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20  ].pgnoFirst);.  
9530: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9540: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9550: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9560: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
9570: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Last);.      }. 
9580: 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44 61     }..    fts5Da
9590: 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
95a0: 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c  STRUCTURE_ROWID,
95b0: 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a   buf.p, buf.n);.
95c0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
95d0: 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a  ee(&buf);.  }.}.
95e0: 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f  .#if 0.static vo
95f0: 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72 75  id fts5DebugStru
9600: 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73 35 42  cture(int*,Fts5B
9610: 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72 75 63  uffer*,Fts5Struc
9620: 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63 20 76  ture*);.static v
9630: 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53 74 72  oid fts5PrintStr
9640: 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63 68 61  ucture(const cha
9650: 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73  r *zCaption, Fts
9660: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
9670: 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  uct){.  int rc =
9680: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74   SQLITE_OK;.  Ft
9690: 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20  s5Buffer buf;.  
96a0: 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
96b0: 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20 20  sizeof(buf));.  
96c0: 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
96d0: 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20 70 53  re(&rc, &buf, pS
96e0: 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69 6e 74  truct);.  fprint
96f0: 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a 20 25  f(stdout, "%s: %
9700: 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20  s\n", zCaption, 
9710: 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68  buf.p);.  fflush
9720: 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74 73 35  (stdout);.  fts5
9730: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
9740: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
9750: 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74 72 75  ne fts5PrintStru
9760: 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e 64 69  cture(x,y).#endi
9770: 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  f..static int ft
9780: 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 46 74  s5SegmentSize(Ft
9790: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
97a0: 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72 65 74  nt *pSeg){.  ret
97b0: 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70 67  urn 1 + pSeg->pg
97c0: 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70  noLast - pSeg->p
97d0: 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a  gnoFirst;.}../*.
97e0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79  ** Return a copy
97f0: 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74   of index struct
9800: 75 72 65 20 70 53 74 72 75 63 74 2e 20 45 78 63  ure pStruct. Exc
9810: 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20  ept, promote as 
9820: 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  many .** segment
9830: 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  s as possible to
9840: 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e   level iPromote.
9850: 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
9860: 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20 72  s, NULL is .** r
9870: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
9880: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
9890: 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a  cturePromoteTo(.
98a0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
98b0: 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a    int iPromote,.
98c0: 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c    int szPromote,
98d0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
98e0: 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20 69   *pStruct.){.  i
98f0: 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46 74 73  nt il, is;.  Fts
9900: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9910: 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  *pOut = &pStruct
9920: 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f 74  ->aLevel[iPromot
9930: 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75 74 2d  e];..  if( pOut-
9940: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  >nMerge==0 ){.  
9950: 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74    for(il=iPromot
9960: 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d  e+1; il<pStruct-
9970: 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a  >nLevel; il++){.
9980: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
9990: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
99a0: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
99b0: 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  l[il];.      if(
99c0: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20   pLvl->nMerge ) 
99d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
99e0: 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d  r(is=pLvl->nSeg-
99f0: 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b  1; is>=0; is--){
9a00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
9a10: 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a  = fts5SegmentSiz
9a20: 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73  e(&pLvl->aSeg[is
9a30: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
9a40: 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72  sz>szPromote ) r
9a50: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 66  eturn;.        f
9a60: 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
9a70: 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
9a80: 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d 6f 74  pStruct, iPromot
9a90: 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 1, 1);.      
9aa0: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
9ab0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 6d 65  turn;.        me
9ac0: 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c  mcpy(pOut->aSeg,
9ad0: 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d   &pLvl->aSeg[is]
9ae0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
9af0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29 3b  uctureSegment));
9b00: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e  .        pOut->n
9b10: 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  Seg++;.        p
9b20: 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20  Lvl->nSeg--;.   
9b30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
9b40: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20 73 65  ../*.** A new se
9b50: 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20 62  gment has just b
9b60: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6c  een written to l
9b70: 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69 6e 64  evel iLvl of ind
9b80: 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ex structure.** 
9b90: 70 53 74 72 75 63 74 2e 20 54 68 69 73 20 66 75  pStruct. This fu
9ba0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
9bb0: 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65 6e 74  s if any segment
9bc0: 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 6d  s should be prom
9bd0: 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72 65 73  oted.** as a res
9be0: 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20 61 72  ult. Segments ar
9bf0: 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20 74 77  e promoted in tw
9c00: 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  o scenarios:.**.
9c10: 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65 20 73  **   a) If the s
9c20: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
9c30: 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ten is smaller t
9c40: 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  han one or more 
9c50: 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  segments.**     
9c60: 20 77 69 74 68 69 6e 20 74 68 65 20 70 72 65 76   within the prev
9c70: 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64 20 6c  ious populated l
9c80: 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72 6f 6d  evel, it is prom
9c90: 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72 65 76  oted to the prev
9ca0: 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70 6f 70  ious.**      pop
9cb0: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a  ulated level..**
9cc0: 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68 65 20  .**   b) If the 
9cd0: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
9ce0: 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72 20 74  tten is larger t
9cf0: 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74 20 73  han the newest s
9d00: 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20  egment on.**    
9d10: 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70 75 6c    the next popul
9d20: 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68 65 6e  ated level, then
9d30: 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c 20 61   that segment, a
9d40: 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61 64 6a  nd any other adj
9d50: 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20 73 65  acent.**      se
9d60: 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  gments that are 
9d70: 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74 68 61  also smaller tha
9d80: 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74 20 77  n the one just w
9d90: 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a 2a 20  ritten, are .** 
9da0: 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e 20 0a       promoted. .
9db0: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f 72 20  **.** If one or 
9dc0: 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 61 72  more segments ar
9dd0: 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68 65 20  e promoted, the 
9de0: 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
9df0: 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a 20 74   is updated.** t
9e00: 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  o reflect this..
9e10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
9e20: 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
9e30: 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ote(.  Fts5Index
9e40: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
9e50: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
9e60: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
9e70: 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20  .  int iLvl,    
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65 76 65     /* Index leve
9ea0: 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 2a  l just updated *
9eb0: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
9ec0: 65 20 2a 70 53 74 72 75 63 74 20 20 20 20 20 20  e *pStruct      
9ed0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
9ee0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ucture */.){.  i
9ef0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
9f00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
9f10: 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 50 72  Tst;.    int iPr
9f20: 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20 20 20  omote = -1;.    
9f30: 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20  int szPromote = 
9f40: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
9f50: 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68 69 6e   Promote anythin
9f60: 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72 20 73  g this size or s
9f70: 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 46 74  maller */.    Ft
9f80: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
9f90: 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 53  nt *pSeg;   /* S
9fa0: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
9fb0: 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ten */.    int s
9fc0: 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  zSeg;           
9fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9fe0: 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73 74   of segment just
9ff0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
a000: 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72 75  int nSeg = pStru
a010: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
a020: 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66 28 20  .nSeg;..    if( 
a030: 6e 53 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSeg==0 ) return
a040: 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 53  ;.    pSeg = &pS
a050: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
a060: 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74  vl].aSeg[pStruct
a070: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
a080: 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65  Seg-1];.    szSe
a090: 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70  g = (1 + pSeg->p
a0a0: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
a0b0: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20  pgnoFirst);..   
a0c0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
a0d0: 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20  ndition (a) */. 
a0e0: 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c     for(iTst=iLvl
a0f0: 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70  -1; iTst>=0 && p
a100: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a110: 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54  Tst].nSeg==0; iT
a120: 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20 69  st--);.    if( i
a130: 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tst>=0 ){.      
a140: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
a150: 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20   szMax = 0;.    
a160: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
a170: 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70 53  evel *pTst = &pS
a180: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54  truct->aLevel[iT
a190: 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st];.      asser
a1a0: 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d  t( pTst->nMerge=
a1b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
a1c0: 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65  i=0; i<pTst->nSe
a1d0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
a1e0: 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e   int sz = pTst->
a1f0: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74  aSeg[i].pgnoLast
a200: 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   - pTst->aSeg[i]
a210: 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a  .pgnoFirst + 1;.
a220: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
a230: 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73  zMax ) szMax = s
a240: 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
a250: 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65   if( szMax>=szSe
a260: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g ){.        /* 
a270: 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  Condition (a) is
a280: 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74   true. Promote t
a290: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
a2a0: 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20  t on level .    
a2b0: 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c      ** iLvl to l
a2c0: 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20  evel iTst.  */. 
a2d0: 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20         iPromote 
a2e0: 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20  = iTst;.        
a2f0: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61  szPromote = szMa
a300: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
a310: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64  ..    /* If cond
a320: 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74  ition (a) is not
a330: 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62 29   met, assume (b)
a340: 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63 74   is true. Struct
a350: 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20  urePromoteTo(). 
a360: 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70     ** is a no-op
a370: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 20   if it is not.  
a380: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d  */.    if( iProm
a390: 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ote<0 ){.      i
a3a0: 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a  Promote = iLvl;.
a3b0: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
a3c0: 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20  = szSeg;.    }. 
a3d0: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
a3e0: 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72  PromoteTo(p, iPr
a3f0: 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65  omote, szPromote
a400: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
a410: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  }.../*.** Advanc
a420: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
a430: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
a440: 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 74  y argument. If t
a450: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a  he end of the .*
a460: 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * doclist-index 
a470: 70 61 67 65 20 69 73 20 72 65 61 63 68 65 64 2c  page is reached,
a480: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
a490: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a4a0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
a4b0: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70  (Fts5DlidxLvl *p
a4c0: 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74 61  Lvl){.  Fts5Data
a4d0: 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e   *pData = pLvl->
a4e0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c  pData;..  if( pL
a4f0: 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  vl->iOff==0 ){. 
a500: 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
a510: 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >bEof==0 );.    
a520: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a  pLvl->iOff = 1;.
a530: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b      pLvl->iOff +
a540: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
a550: 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20  2(&pData->p[1], 
a560: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pLvl->iLeafPgno)
a570: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
a580: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
a590: 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c  t(&pData->p[pLvl
a5a0: 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  ->iOff], (u64*)&
a5b0: 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  pLvl->iRowid);. 
a5c0: 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f     pLvl->iFirstO
a5d0: 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b  ff = pLvl->iOff;
a5e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
a5f0: 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28  t iOff;.    for(
a600: 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b  iOff=pLvl->iOff;
a610: 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b   iOff<pData->nn;
a620: 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20   iOff++){.      
a630: 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66  if( pData->p[iOf
a640: 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20 20  f] ) break; .   
a650: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66   }..    if( iOff
a660: 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20  <pData->nn ){.  
a670: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
a680: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
a690: 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70  gno += (iOff - p
a6a0: 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a  Lvl->iOff) + 1;.
a6b0: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
a6c0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
a6d0: 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  ta->p[iOff], (u6
a6e0: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 20  4*)&iVal);.     
a6f0: 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d   pLvl->iRowid +=
a700: 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76   iVal;.      pLv
a710: 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  l->iOff = iOff;.
a720: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a730: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b   pLvl->bEof = 1;
a740: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
a750: 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b  turn pLvl->bEof;
a760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
a770: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
a780: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
a790: 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
a7a0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
a7b0: 69 64 78 49 74 65 72 4e 65 78 74 52 28 46 74 73  idxIterNextR(Fts
a7c0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
a7d0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c  lidxIter *pIter,
a7e0: 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74   int iLvl){.  Ft
a7f0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
a800: 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   = &pIter->aLvl[
a810: 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iLvl];..  assert
a820: 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c  ( iLvl<pIter->nL
a830: 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35  vl );.  if( fts5
a840: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
a850: 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69  l) ){.    if( (i
a860: 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e  Lvl+1) < pIter->
a870: 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74  nLvl ){.      ft
a880: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
a890: 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b  (p, pIter, iLvl+
a8a0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  1);.      if( pL
a8b0: 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b  vl[1].bEof==0 ){
a8c0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
a8d0: 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70  aRelease(pLvl->p
a8e0: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d  Data);.        m
a8f0: 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73  emset(pLvl, 0, s
a900: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
a910: 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  vl));.        pL
a920: 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
a930: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
a940: 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
a950: 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  IDX_ROWID(pIter-
a960: 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70  >iSegid, iLvl, p
a970: 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f  Lvl[1].iLeafPgno
a980: 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
a990: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
a9a0: 44 61 74 61 20 29 20 66 74 73 35 44 6c 69 64 78  Data ) fts5Dlidx
a9b0: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b 0a 20  LvlNext(pLvl);. 
a9c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a9d0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ..  return pIter
a9e0: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
a9f0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
aa00: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 46  5DlidxIterNext(F
aa10: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
aa20: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
aa30: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  r){.  return fts
aa40: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28  5DlidxIterNextR(
aa50: 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a  p, pIter, 0);.}.
aa60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  ./*.** The itera
aa70: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
aa80: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
aa90: 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69   has the followi
aaa0: 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a  ng fields set.**
aab0: 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69   as follows. Thi
aac0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
aad0: 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  up the rest of t
aae0: 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
aaf0: 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73  hat it.** points
ab00: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
ab10: 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
ab20: 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  st-index..**.** 
ab30: 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 20 20    pData:.**     
ab40: 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69  pointer to docli
ab50: 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  st-index record,
ab60: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69   .**.** When thi
ab70: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
ab80: 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c 65 61  lled pIter->iLea
ab90: 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70 61 67  fPgno is the pag
aba0: 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a 2a 20  e number the.** 
abb0: 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73 6f 63  doclist is assoc
abc0: 69 61 74 65 64 20 77 69 74 68 20 28 74 68 65 20  iated with (the 
abd0: 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20 74 68  one featuring th
abe0: 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74  e term)..*/.stat
abf0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
ac00: 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44 6c  IterFirst(Fts5Dl
ac10: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
ac20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
ac30: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
ac40: 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74  vl; i++){.    ft
ac50: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
ac60: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b  pIter->aLvl[i]);
ac70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
ac80: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
ac90: 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e  f;.}...static in
aca0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  t fts5DlidxIterE
acb0: 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
acc0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
acd0: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
ace0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
acf0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c 76 6c  K || pIter->aLvl
ad00: 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61  [0].bEof;.}..sta
ad10: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
ad20: 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35 49  dxIterLast(Fts5I
ad30: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
ad40: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
ad50: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
ad60: 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65 76 65  dvance each leve
ad70: 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  l to the last en
ad80: 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73 74 20  try on the last 
ad90: 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  page */.  for(i=
ada0: 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70  pIter->nLvl-1; p
adb0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
adc0: 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  && i>=0; i--){. 
add0: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
ade0: 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
adf0: 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77 68 69  aLvl[i];.    whi
ae00: 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  le( fts5DlidxLvl
ae10: 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b  Next(pLvl)==0 );
ae20: 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20  .    pLvl->bEof 
ae30: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 3e  = 0;..    if( i>
ae40: 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44  0 ){.      Fts5D
ae50: 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c 64 20  lidxLvl *pChild 
ae60: 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20  = &pLvl[-1];.   
ae70: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
ae80: 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61 74 61  se(pChild->pData
ae90: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
aea0: 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a 65 6f  pChild, 0, sizeo
aeb0: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
aec0: 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e  ;.      pChild->
aed0: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
aee0: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
aef0: 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
af00: 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69  WID(pIter->iSegi
af10: 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c  d, i-1, pLvl->iL
af20: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 29  eafPgno).      )
af30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
af40: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
af50: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
af60: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
af70: 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  nt to the previo
af80: 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  us entry..*/.sta
af90: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
afa0: 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44 6c 69  xLvlPrev(Fts5Dli
afb0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  dxLvl *pLvl){.  
afc0: 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76 6c 2d  int iOff = pLvl-
afd0: 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74  >iOff;..  assert
afe0: 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20  ( pLvl->bEof==0 
aff0: 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d 70  );.  if( iOff<=p
b000: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29  Lvl->iFirstOff )
b010: 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66  {.    pLvl->bEof
b020: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
b030: 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76 6c 2d     u8 *a = pLvl-
b040: 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69  >pData->p;.    i
b050: 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74  64 iVal;.    int
b060: 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 6e 74   iLimit;.    int
b070: 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 5a 65   ii;.    int nZe
b080: 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ro = 0;..    /* 
b090: 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70  Currently iOff p
b0a0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
b0b0: 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61 72  st byte of a var
b0c0: 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  int. This block 
b0d0: 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e  .    ** decremen
b0e0: 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74  ts iOff until it
b0f0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
b100: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b110: 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a   previous .    *
b120: 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67  * varint. Taking
b130: 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61   care not to rea
b140: 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63  d any memory loc
b150: 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75  ations that occu
b160: 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  r.    ** before 
b170: 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65  the buffer in me
b180: 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c  mory.  */.    iL
b190: 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f  imit = (iOff>9 ?
b1a0: 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20   iOff-9 : 0);.  
b1b0: 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f    for(iOff--; iO
b1c0: 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d  ff>iLimit; iOff-
b1d0: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61  -){.      if( (a
b1e0: 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29  [iOff-1] & 0x80)
b1f0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b200: 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65 74 56   }..    fts5GetV
b210: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
b220: 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20  (u64*)&iVal);.  
b230: 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d    pLvl->iRowid -
b240: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c  = iVal;.    pLvl
b250: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a  ->iLeafPgno--;..
b260: 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b      /* Skip back
b270: 77 61 72 64 73 20 70 61 73 74 20 61 6e 79 20 30  wards past any 0
b280: 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a  x00 varints. */.
b290: 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d      for(ii=iOff-
b2a0: 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69  1; ii>=pLvl->iFi
b2b0: 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d  rstOff && a[ii]=
b2c0: 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20  =0x00; ii--){.  
b2d0: 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20      nZero++;.   
b2e0: 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d 70   }.    if( ii>=p
b2f0: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26  Lvl->iFirstOff &
b300: 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30 29  & (a[ii] & 0x80)
b310: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
b320: 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c   byte immediatel
b330: 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  y before the las
b340: 74 20 30 78 30 30 20 62 79 74 65 20 68 61 73 20  t 0x00 byte has 
b350: 74 68 65 20 30 78 38 30 20 62 69 74 0a 20 20 20  the 0x80 bit.   
b360: 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68     ** set. So th
b370: 65 20 6c 61 73 74 20 30 78 30 30 20 69 73 20 6f  e last 0x00 is o
b380: 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20 69  nly a varint 0 i
b390: 66 20 74 68 65 72 65 20 61 72 65 20 38 20 6d 6f  f there are 8 mo
b3a0: 72 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a 2a  re 0x80.      **
b3b0: 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 61 5b   bytes before a[
b3c0: 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ii]. */.      in
b3d0: 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20  t bZero = 0;    
b3e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
b3f0: 65 20 69 66 20 6c 61 73 74 20 30 78 30 30 20 63  e if last 0x00 c
b400: 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ounts */.      i
b410: 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d  f( (ii-8)>=pLvl-
b420: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
b430: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
b440: 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
b450: 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26  =8 && (a[ii-j] &
b460: 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20   0x80); j++);.  
b470: 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a        bZero = (j
b480: 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >8);.      }.   
b490: 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20     if( bZero==0 
b4a0: 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d  ) nZero--;.    }
b4b0: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  .    pLvl->iLeaf
b4c0: 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20  Pgno -= nZero;. 
b4d0: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20     pLvl->iOff = 
b4e0: 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20  iOff - nZero;.  
b4f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c  }..  return pLvl
b500: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69  ->bEof;.}..stati
b510: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
b520: 74 65 72 50 72 65 76 52 28 46 74 73 35 49 6e 64  terPrevR(Fts5Ind
b530: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
b540: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
b550: 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c   iLvl){.  Fts5Dl
b560: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
b570: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c  pIter->aLvl[iLvl
b580: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  ];..  assert( iL
b590: 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29  vl<pIter->nLvl )
b5a0: 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64  ;.  if( fts5Dlid
b5b0: 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20 29  xLvlPrev(pLvl) )
b5c0: 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b  {.    if( (iLvl+
b5d0: 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c  1) < pIter->nLvl
b5e0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
b5f0: 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20  idxIterPrevR(p, 
b600: 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a  pIter, iLvl+1);.
b610: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31        if( pLvl[1
b620: 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  ].bEof==0 ){.   
b630: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
b640: 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
b650: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
b660: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
b670: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
b680: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
b690: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
b6a0: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
b6b0: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
b6c0: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
b6d0: 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b  gid, iLvl, pLvl[
b6e0: 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  1].iLeafPgno).  
b6f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
b700: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
b710: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
b720: 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76  ile( fts5DlidxLv
b730: 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29  lNext(pLvl)==0 )
b740: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c  ;.          pLvl
b750: 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20  ->bEof = 0;.    
b760: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b770: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
b780: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
b790: 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20  .bEof;.}.static 
b7a0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
b7b0: 72 50 72 65 76 28 46 74 73 35 49 6e 64 65 78 20  rPrev(Fts5Index 
b7c0: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
b7d0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
b7e0: 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65  urn fts5DlidxIte
b7f0: 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c  rPrevR(p, pIter,
b800: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   0);.}../*.** Fr
b810: 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  ee a doclist-ind
b820: 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  ex iterator obje
b830: 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ct allocated by 
b840: 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
b850: 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t()..*/.static v
b860: 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65  oid fts5DlidxIte
b870: 72 46 72 65 65 28 46 74 73 35 44 6c 69 64 78 49  rFree(Fts5DlidxI
b880: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
b890: 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
b8a0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
b8b0: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76  =0; i<pIter->nLv
b8c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
b8d0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
b8e0: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44  Iter->aLvl[i].pD
b8f0: 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
b900: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
b910: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  er);.  }.}..stat
b920: 69 63 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ic Fts5DlidxIter
b930: 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72 49   *fts5DlidxIterI
b940: 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
b950: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b960: 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42         /* Fts5 B
b970: 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
b980: 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e  e within */.  in
b990: 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9b0: 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20   True for ORDER 
b9c0: 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20  BY ASC */.  int 
b9d0: 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b9f0: 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69  egment id */.  i
ba00: 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20 20 20  nt iLeafPg      
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba20: 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  * Leaf page numb
ba30: 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78  er to load dlidx
ba40: 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73   for */.){.  Fts
ba50: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
ba60: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
ba70: 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
ba80: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e  ..  for(i=0; p->
ba90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
baa0: 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b   bDone==0; i++){
bab0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
bac0: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
bad0: 78 49 74 65 72 29 20 2b 20 69 20 2a 20 73 69 7a  xIter) + i * siz
bae0: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
baf0: 29 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  );.    Fts5Dlidx
bb00: 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20  Iter *pNew;..   
bb10: 20 70 4e 65 77 20 3d 20 28 46 74 73 35 44 6c 69   pNew = (Fts5Dli
bb20: 64 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 5f  dxIter*)sqlite3_
bb30: 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e  realloc(pIter, n
bb40: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
bb50: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
bb60: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
bb70: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
bb80: 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
bb90: 64 20 3d 20 46 54 53 35 5f 44 4c 49 44 58 5f 52  d = FTS5_DLIDX_R
bba0: 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 2c 20  OWID(iSegid, i, 
bbb0: 69 4c 65 61 66 50 67 29 3b 0a 20 20 20 20 20 20  iLeafPg);.      
bbc0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
bbd0: 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c  vl = &pNew->aLvl
bbe0: 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49 74 65 72  [i];.      pIter
bbf0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d   = pNew;.      m
bc00: 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73  emset(pLvl, 0, s
bc10: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
bc20: 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  vl));.      pLvl
bc30: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
bc40: 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64  taRead(p, iRowid
bc50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  );.      if( pLv
bc60: 6c 2d 3e 70 44 61 74 61 20 26 26 20 28 70 4c 76  l->pData && (pLv
bc70: 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26  l->pData->p[0] &
bc80: 20 30 78 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20   0x0001)==0 ){. 
bc90: 20 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31         bDone = 1
bca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bcb0: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b  pIter->nLvl = i+
bcc0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
bcd0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
bce0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65  E_OK ){.    pIte
bcf0: 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  r->iSegid = iSeg
bd00: 69 64 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  id;.    if( bRev
bd10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
bd20: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
bd30: 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73  pIter);.    }els
bd40: 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  e{.      fts5Dli
bd50: 64 78 49 74 65 72 4c 61 73 74 28 70 2c 20 70 49  dxIterLast(p, pI
bd60: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
bd70: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
bd80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
bd90: 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
bda0: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74  (pIter);.    pIt
bdb0: 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  er = 0;.  }..  r
bdc0: 65 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a  eturn pIter;.}..
bdd0: 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44  static i64 fts5D
bde0: 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 46 74  lidxIterRowid(Ft
bdf0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
be00: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49  er){.  return pI
be10: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f  ter->aLvl[0].iRo
be20: 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  wid;.}.static in
be30: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  t fts5DlidxIterP
be40: 67 6e 6f 28 46 74 73 35 44 6c 69 64 78 49 74 65  gno(Fts5DlidxIte
be50: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
be60: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
be70: 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a  0].iLeafPgno;.}.
be80: 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
be90: 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65 20 69  next leaf page i
bea0: 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20  nto the segment 
beb0: 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  iterator..*/.sta
bec0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
bed0: 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20 20  IterNextPage(.  
bee0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
bf10: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
bf20: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
bf40: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
bf50: 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65 20  ce to next page 
bf60: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61  */.){.  Fts5Data
bf70: 20 2a 70 4c 65 61 66 3b 0a 20 20 46 74 73 35 53   *pLeaf;.  Fts5S
bf80: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
bf90: 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70  *pSeg = pIter->p
bfa0: 53 65 67 3b 0a 20 20 66 74 73 35 44 61 74 61 52  Seg;.  fts5DataR
bfb0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
bfc0: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  eaf);.  pIter->i
bfd0: 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66  LeafPgno++;.  if
bfe0: 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
bff0: 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  af ){.    pIter-
c000: 3e 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  >pLeaf = pIter->
c010: 70 4e 65 78 74 4c 65 61 66 3b 0a 20 20 20 20 70  pNextLeaf;.    p
c020: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
c030: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
c040: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
c050: 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  o<=pSeg->pgnoLas
c060: 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  t ){.    pIter->
c070: 70 4c 65 61 66 20 3d 20 66 74 73 35 4c 65 61 66  pLeaf = fts5Leaf
c080: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
c090: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
c0a0: 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
c0b0: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  , pIter->iLeafPg
c0c0: 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  no).    );.  }el
c0d0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  se{.    pIter->p
c0e0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Leaf = 0;.  }.  
c0f0: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
c100: 4c 65 61 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65  Leaf;..  if( pLe
c110: 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  af ){.    pIter-
c120: 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65  >iPgidxOff = pLe
c130: 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20  af->szLeaf;.    
c140: 69 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65  if( fts5LeafIsTe
c150: 72 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29 7b  rmless(pLeaf) ){
c160: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
c170: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c  ndofDoclist = pL
c180: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d  eaf->nn+1;.    }
c190: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
c1a0: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d 20  r->iPgidxOff += 
c1b0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
c1c0: 26 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d  &pLeaf->p[pIter-
c1d0: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20  >iPgidxOff],.   
c1e0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45         pIter->iE
c1f0: 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20  ndofDoclist.    
c200: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
c210: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
c220: 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62   p points to a b
c230: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
c240: 20 61 20 76 61 72 69 6e 74 20 74 6f 20 62 65 20   a varint to be 
c250: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
c260: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  .** position lis
c270: 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65  t size field. Re
c280: 61 64 20 74 68 65 20 76 61 72 69 6e 74 20 61 6e  ad the varint an
c290: 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  d return the num
c2a0: 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20  ber of bytes.** 
c2b0: 72 65 61 64 2e 20 42 65 66 6f 72 65 20 72 65 74  read. Before ret
c2c0: 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53  urning, set *pnS
c2d0: 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  z to the number 
c2e0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
c2f0: 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74  position.** list
c300: 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20  , and *pbDel to 
c310: 74 72 75 65 20 69 66 20 74 68 65 20 64 65 6c 65  true if the dele
c320: 74 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  te flag is set, 
c330: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
c340: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
c350: 74 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  t fts5GetPoslist
c360: 53 69 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a 70  Size(const u8 *p
c370: 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74  , int *pnSz, int
c380: 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20   *pbDel){.  int 
c390: 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  nSz;.  int n = 0
c3a0: 3b 0a 20 20 66 74 73 35 46 61 73 74 47 65 74 56  ;.  fts5FastGetV
c3b0: 61 72 69 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53  arint32(p, n, nS
c3c0: 7a 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28  z);.  assert_nc(
c3d0: 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e   nSz>=0 );.  *pn
c3e0: 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70  Sz = nSz/2;.  *p
c3f0: 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30  bDel = nSz & 0x0
c400: 30 30 31 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  001;.  return n;
c410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65  .}../*.** Fts5Se
c420: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
c430: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
c440: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
c450: 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73  byte of a.** pos
c460: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
c470: 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20  field. Read the 
c480: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69 65  value of the fie
c490: 6c 64 20 61 6e 64 20 73 74 6f 72 65 20 69 74 0a  ld and store it.
c4a0: 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
c4b0: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a  ing variables:.*
c4c0: 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  *.**   Fts5SegIt
c4d0: 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73  er.nPos.**   Fts
c4e0: 35 53 65 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a  5SegIter.bDel.**
c4f0: 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73 35 53 65  .** Leave Fts5Se
c500: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
c510: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
c520: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c530: 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  the .** position
c540: 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 28 69   list content (i
c550: 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69  f any)..*/.stati
c560: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c570: 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74 73 35 49  erLoadNPos(Fts5I
c580: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
c590: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
c5a0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c5b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
c5c0: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
c5d0: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
c5e0: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
c5f0: 20 2a 2f 0a 20 20 20 20 41 53 53 45 52 54 5f 53   */.    ASSERT_S
c600: 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e  ZLEAF_OK(pIter->
c610: 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
c620: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
c630: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
c640: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
c650: 6e 74 20 69 45 6f 64 20 3d 20 4d 49 4e 28 70 49  nt iEod = MIN(pI
c660: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
c670: 73 74 2c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  st, pIter->pLeaf
c680: 2d 3e 73 7a 4c 65 61 66 29 3b 0a 20 20 20 20 20  ->szLeaf);.     
c690: 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 30   pIter->bDel = 0
c6a0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
c6b0: 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Pos = 1;.      i
c6c0: 66 28 20 69 4f 66 66 3c 69 45 6f 64 20 26 26 20  f( iOff<iEod && 
c6d0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
c6e0: 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iOff]==0 ){.    
c6f0: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20      pIter->bDel 
c700: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  = 1;.        iOf
c710: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f++;.        if(
c720: 20 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49   iOff<iEod && pI
c730: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f  ter->pLeaf->p[iO
c740: 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ff]==0 ){.      
c750: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
c760: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 1;.          i
c770: 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Off++;.        }
c780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c790: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b  pIter->nPos = 0;
c7a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c7b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
c7c0: 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20      int nSz;.   
c7d0: 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
c7e0: 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c  rint32(pIter->pL
c7f0: 65 61 66 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53  eaf->p, iOff, nS
c800: 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  z);.      pIter-
c810: 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30  >bDel = (nSz & 0
c820: 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49  x0001);.      pI
c830: 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e  ter->nPos = nSz>
c840: 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  >1;.      assert
c850: 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73  _nc( pIter->nPos
c860: 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >=0 );.    }.   
c870: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c880: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a  set = iOff;.  }.
c890: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
c8a0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
c8b0: 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  wid(Fts5Index *p
c8c0: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
c8d0: 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d  Iter){.  u8 *a =
c8e0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
c8f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66  ;        /* Buff
c900: 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20  er to read data 
c910: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  from */.  int iO
c920: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
c930: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53 53 45  fOffset;..  ASSE
c940: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
c950: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66  er->pLeaf);.  if
c960: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  ( iOff>=pIter->p
c970: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
c980: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
c990: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
c9a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
c9b0: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
c9c0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
c9d0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
c9e0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
c9f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
ca00: 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20     }.    iOff = 
ca10: 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72  4;.    a = pIter
ca20: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a  ->pLeaf->p;.  }.
ca30: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
ca40: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
ca50: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
ca60: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
ca70: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
ca80: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a  fset = iOff;.}..
ca90: 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  /*.** Fts5SegIte
caa0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75  r.iLeafOffset cu
cab0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
cac0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
cad0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75   of the .** "nSu
cae0: 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20 61  ffix" field of a
caf0: 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20   term. Function 
cb00: 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70 20  parameter nKeep 
cb10: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
cb20: 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50  ue.** of the "nP
cb30: 72 65 66 69 78 22 20 66 69 65 6c 64 20 28 69 66  refix" field (if
cb40: 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20 2d   there was one -
cb50: 20 69 74 20 69 73 20 70 61 73 73 65 64 20 30 20   it is passed 0 
cb60: 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74 68  if this is.** th
cb70: 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20  e first term in 
cb80: 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a  the segment)..**
cb90: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
cba0: 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a  n populates:.**.
cbb0: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
cbc0: 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53  .term.**   Fts5S
cbd0: 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a  egIter.rowid.**.
cbe0: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  ** accordingly a
cbf0: 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73 35 53  nd leaves (Fts5S
cc00: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
cc10: 65 74 29 20 73 65 74 20 74 6f 20 74 68 65 20 63  et) set to the c
cc20: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65  ontent of.** the
cc30: 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e 20   first position 
cc40: 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69  list. The positi
cc50: 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e  on list belongin
cc60: 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a  g to document .*
cc70: 2a 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  * (Fts5SegIter.i
cc80: 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  Rowid)..*/.stati
cc90: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
cca0: 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49  erLoadTerm(Fts5I
ccb0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
ccc0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
ccd0: 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61   nKeep){.  u8 *a
cce0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
ccf0: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
cd00: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
cd10: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
cd20: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
cd30: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
cd40: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
cd50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd70: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
cd80: 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20  f new data */.. 
cd90: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
cda0: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
cdb0: 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20  ], nNew);.  if( 
cdc0: 69 4f 66 66 2b 6e 4e 65 77 3e 70 49 74 65 72 2d  iOff+nNew>pIter-
cdd0: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20  >pLeaf->nn ){.  
cde0: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
cdf0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75  ORRUPT;.    retu
ce00: 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d  rn;.  }.  pIter-
ce10: 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b  >term.n = nKeep;
ce20: 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
ce30: 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
ce40: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e  &pIter->term, nN
ce50: 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  ew, &a[iOff]);. 
ce60: 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20   iOff += nNew;. 
ce70: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
ce80: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
ce90: 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
cea0: 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e  afPgno = pIter->
ceb0: 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70 49 74  iLeafPgno;.  pIt
cec0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
ced0: 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70  = iOff;..  if( p
cee0: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 3e  Iter->iPgidxOff>
cef0: 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e  =pIter->pLeaf->n
cf00: 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  n ){.    pIter->
cf10: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
cf20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
cf30: 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  +1;.  }else{.   
cf40: 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20   int nExtra;.   
cf50: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
cf60: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
cf70: 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d 3e 69  nt32(&a[pIter->i
cf80: 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78 74 72  PgidxOff], nExtr
cf90: 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
cfa0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b 3d 20  EndofDoclist += 
cfb0: 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20 20 66  nExtra;.  }..  f
cfc0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
cfd0: 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  wid(p, pIter);.}
cfe0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
cff0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 46 74  s5SegIterNext(Ft
d000: 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65  s5Index*, Fts5Se
d010: 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73  gIter*, int*);.s
d020: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
d030: 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72  egIterNext_Rever
d040: 73 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46  se(Fts5Index*, F
d050: 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74  ts5SegIter*, int
d060: 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
d070: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
d080: 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65 78 2a 2c  None(Fts5Index*,
d090: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
d0a0: 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f  nt*);..static vo
d0b0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 53 65  id fts5SegIterSe
d0c0: 74 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20  tNext(Fts5Index 
d0d0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
d0e0: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
d0f0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
d100: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
d110: 53 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  SE ){.    pIter-
d120: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67  >xNext = fts5Seg
d130: 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65  IterNext_Reverse
d140: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
d150: 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
d160: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
d170: 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ONE ){.    pIter
d180: 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65  ->xNext = fts5Se
d190: 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a  gIterNext_None;.
d1a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
d1b0: 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  er->xNext = fts5
d1c0: 53 65 67 49 74 65 72 4e 65 78 74 3b 0a 20 20 7d  SegIterNext;.  }
d1d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
d1e0: 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f  lize the iterato
d1f0: 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  r object pIter t
d200: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
d210: 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  h the entries in
d220: 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67  .** segment pSeg
d230: 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  . The iterator i
d240: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
d250: 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
d260: 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73  ry when .** this
d270: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d280: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
d290: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
d2a0: 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
d2b0: 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
d2c0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
d2d0: 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
d2e0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
d2f0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
d300: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d310: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
d320: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d330: 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
d340: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
d370: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
d380: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
d390: 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
d3a0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
d3b0: 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
d3c0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
d3d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
d3e0: 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
d3f0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65   */.){.  if( pSe
d400: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
d410: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
d420: 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65  appens if the se
d430: 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75  gment is being u
d440: 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20  sed as an input 
d450: 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  to an incrementa
d460: 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61  l.    ** merge a
d470: 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  nd all data has 
d480: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72  already been "tr
d490: 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63  immed". See func
d4a0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35  tion.    ** fts5
d4b0: 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66  TrimSegments() f
d4c0: 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74  or details. In t
d4d0: 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74  his case leave t
d4e0: 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74  he iterator empt
d4f0: 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  y..    ** The ca
d500: 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68  ller will see th
d510: 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  e (pIter->pLeaf=
d520: 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74  =0) and assume t
d530: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20  he iterator is. 
d540: 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72     ** at EOF alr
d550: 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  eady. */.    ass
d560: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
d570: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  f==0 );.    retu
d580: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
d590: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d5a0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ){.    memset(pI
d5b0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
d5c0: 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66 74 73  pIter));.    fts
d5d0: 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
d5e0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70  p, pIter);.    p
d5f0: 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
d600: 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  g;.    pIter->iL
d610: 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  eafPgno = pSeg->
d620: 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20  pgnoFirst-1;.   
d630: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d640: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
d650: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
d660: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d670: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
d680: 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61  ffset = 4;.    a
d690: 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d  ssert_nc( pIter-
d6a0: 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a  >pLeaf->nn>4 );.
d6b0: 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
d6c0: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
d6d0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d  (pIter->pLeaf)==
d6e0: 34 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  4 );.    pIter->
d6f0: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65  iPgidxOff = pIte
d700: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
d710: 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  +1;.    fts5SegI
d720: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
d730: 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74  Iter, 0);.    ft
d740: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
d750: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  s(p, pIter);.  }
d760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
d770: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
d780: 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69  ever called on i
d790: 74 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64  terators created
d7a0: 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20   by calls to.** 
d7b0: 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
d7c0: 20 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e   with the FTS5IN
d7d0: 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66  DEX_QUERY_DESC f
d7e0: 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54  lag set..**.** T
d7f0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69  he iterator is i
d800: 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61  n an unusual sta
d810: 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
d820: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a  ction is called:
d830: 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49   the.** Fts5SegI
d840: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
d850: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
d860: 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  to the offset of
d870: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
d880: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
d890: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f  st size field fo
d8a0: 72 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65  r the first rele
d8b0: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
d8c0: 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53  e page..** Fts5S
d8d0: 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20  egIter.rowid is 
d8e0: 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e  set, but nPos an
d8f0: 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a  d bDel are not..
d900: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d910: 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65  ion advances the
d920: 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61   iterator so tha
d930: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
d940: 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65  he last .** rele
d950: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
d960: 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e  e page and, if n
d970: 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61  ecessary, initia
d980: 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52  lizes the .** aR
d990: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64  owidOffset[] and
d9a0: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61   iRowidOffset va
d9b0: 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73  riables. At this
d9c0: 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61   point the itera
d9d0: 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73  tor.** is in its
d9e0: 20 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d   regular state -
d9f0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
da00: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20  afOffset points 
da10: 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
da20: 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69  byte of the posi
da30: 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e  tion list conten
da40: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
da50: 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f  h said rowid..*/
da60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
da70: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
da80: 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65  nitPage(Fts5Inde
da90: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
daa0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
dab0: 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
dac0: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
dad0: 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d    int n = pIter-
dae0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a  >pLeaf->szLeaf;.
daf0: 20 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d    int i = pIter-
db00: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
db10: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
db20: 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69  Leaf->p;.  int i
db30: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b  RowidOffset = 0;
db40: 0a 0a 20 20 69 66 28 20 6e 3e 70 49 74 65 72 2d  ..  if( n>pIter-
db50: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29  >iEndofDoclist )
db60: 7b 0a 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d  {.    n = pIter-
db70: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a  >iEndofDoclist;.
db80: 20 20 7d 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a    }..  ASSERT_SZ
db90: 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70  LEAF_OK(pIter->p
dba0: 4c 65 61 66 29 3b 0a 20 20 77 68 69 6c 65 28 20  Leaf);.  while( 
dbb0: 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65  1 ){.    i64 iDe
dbc0: 6c 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  lta = 0;..    if
dbd0: 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
dbe0: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
dbf0: 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a       /* todo */.
dc00: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26        if( i<n &&
dc10: 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
dc20: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
dc30: 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d   if( i<n && a[i]
dc40: 3d 3d 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  ==0 ) i++;.     
dc50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
dc60: 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
dc70: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
dc80: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
dc90: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
dca0: 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  [i], &nPos, &bDu
dcb0: 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  mmy);.      i +=
dcc0: 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20   nPos;.    }.   
dcd0: 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61   if( i>=n ) brea
dce0: 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35  k;.    i += fts5
dcf0: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c  GetVarint(&a[i],
dd00: 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
dd10: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
dd20: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20  id += iDelta;.. 
dd30: 20 20 20 2f 2a 20 49 66 20 6e 65 63 65 73 73 61     /* If necessa
dd40: 72 79 2c 20 67 72 6f 77 20 74 68 65 20 70 49 74  ry, grow the pIt
dd50: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
dd60: 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20  [] array. */.   
dd70: 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65   if( iRowidOffse
dd80: 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64  t>=pIter->nRowid
dd90: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
dda0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72  int nNew = pIter
ddb0: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b  ->nRowidOffset +
ddc0: 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   8;.      int *a
ddd0: 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  New = (int*)sqli
dde0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65  te3_realloc(pIte
ddf0: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c  r->aRowidOffset,
de00: 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74   nNew*sizeof(int
de10: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e  ));.      if( aN
de20: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
de30: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
de40: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
de50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
de60: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
de70: 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a  dOffset = aNew;.
de80: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f        pIter->nRo
de90: 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77  widOffset = nNew
dea0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74  ;.    }..    pIt
deb0: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
dec0: 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d  [iRowidOffset++]
ded0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
dee0: 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72  ffset;.    pIter
def0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
df00: 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  i;.  }.  pIter->
df10: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69  iRowidOffset = i
df20: 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66  RowidOffset;.  f
df30: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
df40: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  os(p, pIter);.}.
df50: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
df60: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
df70: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
df80: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
df90: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
dfa0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
dfb0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
dfc0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
dfd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
dfe0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
dff0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
e000: 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61  M );..  fts5Data
e010: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
e020: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
e030: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69  pLeaf = 0;.  whi
e040: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
e050: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69  E_OK && pIter->i
e060: 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
e070: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
e080: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
e090: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
e0a0: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
e0b0: 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61   pNew = fts5Data
e0c0: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
e0d0: 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20  MENT_ROWID(.    
e0e0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65        pIter->pSe
e0f0: 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72  g->iSegid, pIter
e100: 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20  ->iLeafPgno.    
e110: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
e120: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 54 65   ){.      /* iTe
e130: 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 6d 61 79  rmLeafOffset may
e140: 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c   be equal to szL
e150: 65 61 66 20 69 66 20 74 68 65 20 74 65 72 6d 20  eaf if the term 
e160: 69 73 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  is the last.    
e170: 20 20 2a 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68    ** thing on th
e180: 65 20 70 61 67 65 20 2d 20 69 2e 65 2e 20 74 68  e page - i.e. th
e190: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 73  e first rowid is
e1a0: 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   on the followin
e1b0: 67 20 70 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a  g page..      **
e1c0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65   In this case le
e1d0: 61 76 65 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ave pIter->pLeaf
e1e0: 3d 3d 30 2c 20 74 68 69 73 20 69 74 65 72 61 74  ==0, this iterat
e1f0: 6f 72 20 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f  or is at EOF. */
e200: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
e210: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74  ->iLeafPgno==pIt
e220: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
e230: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  o ){.        ass
e240: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
e250: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  f==0 );.        
e260: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
e270: 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d  LeafOffset<pNew-
e280: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
e290: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e2a0: 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  f = pNew;.      
e2b0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e2c0: 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Offset = pIter->
e2d0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
e2e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e2f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e300: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  int iRowidOff;. 
e310: 20 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66         iRowidOff
e320: 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
e330: 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a  RowidOff(pNew);.
e340: 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
e350: 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  idOff ){.       
e360: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
e370: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
e380: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e390: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
e3a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e3b0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
e3c0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
e3d0: 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26         u8 *a = &
e3e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
e3f0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e400: 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74  et];.        pIt
e410: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
e420: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
e430: 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  (a, (u64*)&pIter
e440: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
e450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e460: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
e470: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
e480: 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
e490: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
e4a0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
e4b0: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
e4c0: 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Doclist = pIter-
e4d0: 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20  >pLeaf->nn+1;.  
e4e0: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
e4f0: 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
e500: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
e510: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
e520: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
e530: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
e540: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
e550: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
e560: 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20 6d  ts to a delete m
e570: 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65 20  arker. A delete 
e580: 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e 74  marker is an ent
e590: 72 79 20 77 69 74 68 20 61 20 30 20 62 79 74 65  ry with a 0 byte
e5a0: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
e5b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e5c0: 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
e5d0: 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78 20  Empty(Fts5Index 
e5e0: 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
e5f0: 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49  ter){.  Fts5SegI
e600: 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
e610: 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
e620: 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
e630: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  ];.  return (p->
e640: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e650: 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20   pSeg->pLeaf && 
e660: 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a  pSeg->nPos==0);.
e670: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
e680: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
e690: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
e6a0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65  y..**.** This ve
e6b0: 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67  rsion of fts5Seg
e6c0: 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e  IterNext() is on
e6d0: 6c 79 20 75 73 65 64 20 62 79 20 72 65 76 65 72  ly used by rever
e6e0: 73 65 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f  se iterators..*/
e6f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
e700: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76  5SegIterNext_Rev
e710: 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erse(.  Fts5Inde
e720: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
e730: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
e740: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
e750: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
e760: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
e770: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
e780: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
e790: 69 6e 74 20 2a 70 62 55 6e 75 73 65 64 20 20 20  int *pbUnused   
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a  /* Unused */.){.
e7c0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
e7d0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e7e0: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
e7f0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
e800: 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
e810: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
e820: 28 70 62 55 6e 75 73 65 64 29 3b 0a 0a 20 20 69  (pbUnused);..  i
e830: 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  f( pIter->iRowid
e840: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
e850: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
e860: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74  Leaf->p;.    int
e870: 20 69 4f 66 66 3b 0a 20 20 20 20 69 36 34 20 69   iOff;.    i64 i
e880: 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 49 74 65  Delta;..    pIte
e890: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d  r->iRowidOffset-
e8a0: 2d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  -;.    pIter->iL
e8b0: 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65  eafOffset = pIte
e8c0: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
e8d0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
e8e0: 73 65 74 5d 3b 0a 20 20 20 20 66 74 73 35 53 65  set];.    fts5Se
e8f0: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
e900: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 4f 66   pIter);.    iOf
e910: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
e920: 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 66 28 20  Offset;.    if( 
e930: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
e940: 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail!=FTS5_DETAIL
e950: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
e960: 4f 66 66 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50  Off += pIter->nP
e970: 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  os;.    }.    ft
e980: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
e990: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
e9a0: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
e9b0: 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74  >iRowid -= iDelt
e9c0: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
e9d0: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
e9e0: 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
e9f0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
ea00: 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74  * Advance iterat
ea10: 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20  or pIter to the 
ea20: 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  next entry..**.*
ea30: 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
ea40: 66 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  f fts5SegIterNex
ea50: 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t() is only used
ea60: 20 69 66 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20   if detail=none 
ea70: 61 6e 64 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  and the.** itera
ea80: 74 6f 72 20 69 73 20 6e 6f 74 20 61 20 72 65 76  tor is not a rev
ea90: 65 72 73 65 20 64 69 72 65 63 74 69 6f 6e 20 69  erse direction i
eaa0: 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  terator..*/.stat
eab0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
eac0: 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 0a 20 20  terNext_None(.  
ead0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaf0: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
eb00: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
eb10: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
eb30: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
eb40: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e  ce */.  int *pbN
eb50: 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
eb60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
eb70: 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d  Set for new term
eb80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66   */.){.  int iOf
eb90: 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  f;..  assert( p-
eba0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
ebb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 74  ;.  assert( (pIt
ebc0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
ebd0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
ebe0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
ebf0: 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
ec00: 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
ec10: 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 41 53  IL_NONE );..  AS
ec20: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
ec30: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
ec40: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
ec50: 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a  eafOffset;..  /*
ec60: 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f   Next entry is o
ec70: 6e 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  n the next page 
ec80: 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
ec90: 70 53 65 67 20 26 26 20 69 4f 66 66 3e 3d 70 49  pSeg && iOff>=pI
eca0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
ecb0: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
ecc0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
ecd0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28   pIter);.    if(
ece0: 20 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d   p->rc || pIter-
ecf0: 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75  >pLeaf==0 ) retu
ed00: 72 6e 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  rn;.    pIter->i
ed10: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 69  Rowid = 0;.    i
ed20: 4f 66 66 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20  Off = 4;.  }..  
ed30: 69 66 28 20 69 4f 66 66 3c 70 49 74 65 72 2d 3e  if( iOff<pIter->
ed40: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
ed50: 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  .    /* Next ent
ed60: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
ed70: 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20  rent page */.   
ed80: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   i64 iDelta;.   
ed90: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
eda0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
edb0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69  Iter->pLeaf->p[i
edc0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
edd0: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
ede0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
edf0: 4f 66 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Off;.    pIter->
ee00: 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
ee10: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
ee20: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
ee30: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
ee40: 52 4d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  RM)==0 ){.    if
ee50: 28 20 70 49 74 65 72 2d 3e 70 53 65 67 20 29 7b  ( pIter->pSeg ){
ee60: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70  .      int nKeep
ee70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
ee80: 69 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69  iOff!=fts5LeafFi
ee90: 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72  rstTermOff(pIter
eea0: 2d 3e 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  ->pLeaf) ){.    
eeb0: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
eec0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
eed0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  er->pLeaf->p[iOf
eee0: 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
eef0: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d    }.      pIter-
ef00: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
ef10: 4f 66 66 3b 0a 20 20 20 20 20 20 66 74 73 35 53  Off;.      fts5S
ef20: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
ef30: 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b  , pIter, nKeep);
ef40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ef50: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73    const u8 *pLis
ef60: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  t = 0;.      con
ef70: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
ef80: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
ef90: 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
efa0: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65  e3Fts5HashScanNe
efb0: 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  xt(p->pHash);.  
efc0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
efd0: 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e  ashScanEntry(p->
efe0: 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
eff0: 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
f000: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d        if( pList=
f010: 3d 30 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 6e  =0 ) goto next_n
f020: 6f 6e 65 5f 65 6f 66 3b 0a 20 20 20 20 20 20 70  one_eof;.      p
f030: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d  Iter->pLeaf->p =
f040: 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
f050: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
f060: 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  >nn = nList;.   
f070: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
f080: 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b  >szLeaf = nList;
f090: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
f0a0: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c  ndofDoclist = nL
f0b0: 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
f0c0: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
f0d0: 26 70 2d 3e 72 63 2c 26 70 49 74 65 72 2d 3e 74  &p->rc,&pIter->t
f0e0: 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  erm, (int)strlen
f0f0: 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54  (zTerm), (u8*)zT
f100: 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  erm);.      pIte
f110: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f120: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
f130: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
f140: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
f150: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 62 4e 65   }..    if( pbNe
f160: 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65  wTerm ) *pbNewTe
f170: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
f180: 0a 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 6e  .    goto next_n
f190: 6f 6e 65 5f 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20  one_eof;.  }..  
f1a0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
f1b0: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  Pos(p, pIter);..
f1c0: 20 20 72 65 74 75 72 6e 3b 0a 20 6e 65 78 74 5f    return;. next_
f1d0: 6e 6f 6e 65 5f 65 6f 66 3a 0a 20 20 66 74 73 35  none_eof:.  fts5
f1e0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
f1f0: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74  r->pLeaf);.  pIt
f200: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d  er->pLeaf = 0;.}
f210: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  .../*.** Advance
f220: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
f230: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
f240: 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  y. .**.** If an 
f250: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
f260: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
f270: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
f280: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
f290: 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  It .** is not co
f2a0: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
f2b0: 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
f2c0: 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49  r reaches EOF. I
f2d0: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
f2e0: 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
f2f0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
f300: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
f310: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
f320: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f330: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
f340: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
f370: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
f380: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
f390: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
f3a0: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
f3b0: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  vance */.  int *
f3c0: 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
f3d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f3e0: 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74  T: Set for new t
f3f0: 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  erm */.){.  Fts5
f400: 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
f410: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e  ter->pLeaf;.  in
f420: 74 20 69 4f 66 66 3b 0a 20 20 69 6e 74 20 62 4e  t iOff;.  int bN
f430: 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 69 6e  ewTerm = 0;.  in
f440: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75  t nKeep = 0;.  u
f450: 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  8 *a;.  int n;..
f460: 20 20 61 73 73 65 72 74 28 20 70 62 4e 65 77 54    assert( pbNewT
f470: 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77  erm==0 || *pbNew
f480: 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Term==0 );.  ass
f490: 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ert( p->pConfig-
f4a0: 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
f4b0: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20  ETAIL_NONE );.. 
f4c0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
f4d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f  he end of the po
f4e0: 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68  sition list with
f4f0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  in the current p
f500: 61 67 65 2e 20 2a 2f 0a 20 20 61 20 3d 20 70 4c  age. */.  a = pL
f510: 65 61 66 2d 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c  eaf->p;.  n = pL
f520: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20  eaf->szLeaf;..  
f530: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
f540: 28 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66 66 20  (pLeaf);.  iOff 
f550: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
f560: 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50  fset + pIter->nP
f570: 6f 73 3b 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c  os;..  if( iOff<
f580: 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  n ){.    /* The 
f590: 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  next entry is on
f5a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
f5b0: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
f5c0: 5f 6e 63 28 20 69 4f 66 66 3c 3d 70 49 74 65 72  _nc( iOff<=pIter
f5d0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
f5e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  );.    if( iOff>
f5f0: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
f600: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 62  clist ){.      b
f610: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
f620: 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73     if( iOff!=fts
f630: 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
f640: 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  f(pLeaf) ){.    
f650: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
f660: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
f670: 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
f680: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
f690: 0a 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74  .      u64 iDelt
f6a0: 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  a;.      iOff +=
f6b0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
f6c0: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
f6d0: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
f6e0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
f6f0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 61   iDelta;.      a
f700: 73 73 65 72 74 5f 6e 63 28 20 69 44 65 6c 74 61  ssert_nc( iDelta
f710: 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
f720: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f730: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 7d 65  et = iOff;..  }e
f740: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
f750: 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  Seg==0 ){.    co
f760: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
f770: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
f780: 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20  r *zTerm = 0;.  
f790: 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b    int nList = 0;
f7a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49  .    assert( (pI
f7b0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
f7c0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
f7d0: 4d 29 20 7c 7c 20 70 62 4e 65 77 54 65 72 6d 20  M) || pbNewTerm 
f7e0: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  );.    if( 0==(p
f7f0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
f800: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
f810: 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  RM) ){.      sql
f820: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
f830: 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a  Next(p->pHash);.
f840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
f850: 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
f860: 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  ->pHash, &zTerm,
f870: 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
f880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f890: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
f8a0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f8b0: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f8c0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
f8d0: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  eaf = 0;.    }el
f8e0: 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  se{.      pIter-
f8f0: 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a  >pLeaf->p = (u8*
f900: 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49  )pList;.      pI
f910: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d  ter->pLeaf->nn =
f920: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
f930: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
f940: 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  af = nList;.    
f950: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
f960: 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 2b 31  oclist = nList+1
f970: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
f980: 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
f990: 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
f9a0: 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  m, (int)strlen(z
f9b0: 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20  Term),.         
f9c0: 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20   (u8*)zTerm);.  
f9d0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f9e0: 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
f9f0: 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75  Varint(pList, (u
fa00: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
fa10: 69 64 29 3b 0a 20 20 20 20 20 20 2a 70 62 4e 65  id);.      *pbNe
fa20: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d  wTerm = 1;.    }
fa30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4f  .  }else{.    iO
fa40: 66 66 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e  ff = 0;.    /* N
fa50: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  ext entry is not
fa60: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
fa70: 70 61 67 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c  page */.    whil
fa80: 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  e( iOff==0 ){.  
fa90: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
faa0: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
fab0: 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 20 3d  );.      pLeaf =
fac0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
fad0: 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d       if( pLeaf==
fae0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
faf0: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
fb00: 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  K(pLeaf);.      
fb10: 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35  if( (iOff = fts5
fb20: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
fb30: 66 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f 66  f(pLeaf)) && iOf
fb40: 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f<pLeaf->szLeaf 
fb50: 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
fb60: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
fb70: 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
fb80: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
fb90: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
fba0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
fbb0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
fbc0: 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  f;..        if( 
fbd0: 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d  pLeaf->nn>pLeaf-
fbe0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fbf0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69       pIter->iPgi
fc00: 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73  dxOff = pLeaf->s
fc10: 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56  zLeaf + fts5GetV
fc20: 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20  arint32(.       
fc30: 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70         &pLeaf->p
fc40: 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c  [pLeaf->szLeaf],
fc50: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
fc60: 63 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20  clist.          
fc70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
fc80: 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20     }.      else 
fc90: 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c  if( pLeaf->nn>pL
fca0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
fcb0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50         pIter->iP
fcc0: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
fcd0: 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65  >szLeaf + fts5Ge
fce0: 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20  tVarint32(.     
fcf0: 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70         &pLeaf->p
fd00: 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c  [pLeaf->szLeaf],
fd10: 20 69 4f 66 66 0a 20 20 20 20 20 20 20 20 20 20   iOff.          
fd20: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74    );.        pIt
fd30: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
fd40: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
fd50: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
fd60: 6c 69 73 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  list = iOff;.   
fd70: 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20       bNewTerm = 
fd80: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
fd90: 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66   assert_nc( iOff
fda0: 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  <pLeaf->szLeaf )
fdb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
fdc0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
fdd0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
fde0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
fdf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
fe00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fe10: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
fe20: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
fe30: 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49 66 20   now at EOF. If 
fe40: 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  so, return early
fe50: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72  . */.  if( pIter
fe60: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69  ->pLeaf ){.    i
fe70: 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20  f( bNewTerm ){. 
fe80: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
fe90: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
fea0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a  ITER_ONETERM ){.
feb0: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
fec0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
fed0: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70  Leaf);.        p
fee0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
fef0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ff00: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
ff10: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
ff20: 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  er, nKeep);.    
ff30: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
ff40: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
ff50: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
ff60: 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65  bNewTerm ) *pbNe
ff70: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
ff80: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
ff90: 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
ffa0: 77 69 6e 67 20 63 6f 75 6c 64 20 62 65 20 64 6f  wing could be do
ffb0: 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 74  ne by calling ft
ffc0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
ffd0: 73 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20 2a  s(). But.      *
ffe0: 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * this block is 
fff0: 70 61 72 74 69 63 75 6c 61 72 6c 79 20 70 65 72  particularly per
10000 66 6f 72 6d 61 6e 63 65 20 63 72 69 74 69 63 61  formance critica
10010 6c 2c 20 73 6f 20 65 71 75 69 76 61 6c 65 6e 74  l, so equivalent
10020 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 69  .      ** code i
10030 73 20 69 6e 6c 69 6e 65 64 2e 20 0a 20 20 20 20  s inlined. .    
10040 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4c 61    **.      ** La
10050 74 65 72 3a 20 53 77 69 74 63 68 65 64 20 62 61  ter: Switched ba
10060 63 6b 20 74 6f 20 66 74 73 35 53 65 67 49 74 65  ck to fts5SegIte
10070 72 4c 6f 61 64 4e 50 6f 73 28 29 20 62 65 63 61  rLoadNPos() beca
10080 75 73 65 20 69 74 20 73 75 70 70 6f 72 74 73 0a  use it supports.
10090 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c 3d        ** detail=
100a0 6e 6f 6e 65 20 6d 6f 64 65 2e 20 4e 6f 74 20 69  none mode. Not i
100b0 64 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  deal..      */. 
100c0 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20       int nSz;.  
100d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
100e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
100f0 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65        fts5FastGe
10100 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d  tVarint32(pIter-
10110 3e 70 4c 65 61 66 2d 3e 70 2c 20 70 49 74 65 72  >pLeaf->p, pIter
10120 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e  ->iLeafOffset, n
10130 53 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  Sz);.      pIter
10140 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20  ->bDel = (nSz & 
10150 30 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70  0x0001);.      p
10160 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a  Iter->nPos = nSz
10170 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >>1;.      asser
10180 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f  t_nc( pIter->nPo
10190 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  s>=0 );.    }.  
101a0 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57 41  }.}..#define SWA
101b0 50 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20  PVAL(T, a, b) { 
101c0 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d  T tmp; tmp=a; a=
101d0 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65  b; b=tmp; }..#de
101e0 66 69 6e 65 20 66 74 73 35 49 6e 64 65 78 53 6b  fine fts5IndexSk
101f0 69 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66 66  ipVarint(a, iOff
10200 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c  ) {            \
10210 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f  .  int iEnd = iO
10220 66 66 2b 39 3b 20 20 20 20 20 20 20 20 20 20 20  ff+9;           
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10240 20 20 20 5c 0a 20 20 77 68 69 6c 65 28 20 28 61     \.  while( (a
10250 5b 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30 29  [iOff++] & 0x80)
10260 20 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b   && iOff<iEnd );
10270 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
10280 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
10290 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
102a0 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
102b0 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69 73  owid in a doclis
102c0 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t. This.** funct
102d0 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74 65  ion sets the ite
102e0 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61 74  rator up so that
102f0 20 69 74 65 72 61 74 65 73 20 69 6e 20 72 65 76   iterates in rev
10300 65 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f 75  erse order throu
10310 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73  gh.** the doclis
10320 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
10330 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
10340 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  erse(Fts5Index *
10350 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
10360 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 6c  pIter){.  Fts5Dl
10370 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
10380 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b  = pIter->pDlidx;
10390 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61  .  Fts5Data *pLa
103a0 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67  st = 0;.  int pg
103b0 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69  noLast = 0;..  i
103c0 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20 20 20  f( pDlidx ){.   
103d0 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49   int iSegid = pI
103e0 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
103f0 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20  d;.    pgnoLast 
10400 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
10410 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
10420 20 70 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74   pLast = fts5Dat
10430 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
10440 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
10450 69 64 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a  id, pgnoLast));.
10460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73    }else{.    Fts
10470 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70  5Data *pLeaf = p
10480 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20  Iter->pLeaf;    
10490 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
104a0 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20  leaf data */..  
104b0 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    /* Currently, 
104c0 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
104d0 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74  fOffset points t
104e0 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
104f0 20 6f 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74   of.    ** posit
10500 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion-list content
10510 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
10520 20 72 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20   rowid. Back it 
10530 75 70 20 73 6f 20 74 68 61 74 20 69 74 0a 20 20  up so that it.  
10540 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74    ** points to t
10550 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10560 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
10570 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20  ze field. */.   
10580 20 69 6e 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20   int iPoslist;. 
10590 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
105a0 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74  ermLeafPgno==pIt
105b0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b  er->iLeafPgno ){
105c0 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74 20  .      iPoslist 
105d0 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  = pIter->iTermLe
105e0 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 65  afOffset;.    }e
105f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c  lse{.      iPosl
10600 69 73 74 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  ist = 4;.    }. 
10610 20 20 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70     fts5IndexSkip
10620 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c  Varint(pLeaf->p,
10630 20 69 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20   iPoslist);.    
10640 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10650 65 74 20 3d 20 69 50 6f 73 6c 69 73 74 3b 0a 0a  et = iPoslist;..
10660 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63      /* If this c
10670 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65  ondition is true
10680 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65 73   then the larges
10690 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  t rowid for the 
106a0 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74  current.    ** t
106b0 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20 73  erm may not be s
106c0 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72  tored on the cur
106d0 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73 65  rent page. So se
106e0 61 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f 0a  arch forward to.
106f0 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72 65      ** see where
10700 20 73 61 69 64 20 72 6f 77 69 64 20 72 65 61 6c   said rowid real
10710 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69  ly is.  */.    i
10720 66 28 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  f( pIter->iEndof
10730 44 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e  Doclist>=pLeaf->
10740 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
10750 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  int pgno;.      
10760 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
10770 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74  ment *pSeg = pIt
10780 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20  er->pSeg;..     
10790 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77   /* The last row
107a0 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  id in the doclis
107b0 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20  t may not be on 
107c0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
107d0 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a  . Search.      *
107e0 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e  * forward to fin
107f0 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  d the page conta
10800 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72  ining the last r
10810 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  owid.  */.      
10820 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e  for(pgno=pIter->
10830 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d  iLeafPgno+1; !p-
10840 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65  >rc && pgno<=pSe
10850 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e  g->pgnoLast; pgn
10860 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  o++){.        i6
10870 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45  4 iAbs = FTS5_SE
10880 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
10890 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b  ->iSegid, pgno);
108a0 0a 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74  .        Fts5Dat
108b0 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61  a *pNew = fts5Da
108c0 74 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b  taRead(p, iAbs);
108d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
108e0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  w ){.          i
108f0 6e 74 20 69 52 6f 77 69 64 2c 20 62 54 65 72 6d  nt iRowid, bTerm
10900 6c 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20  less;.          
10910 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4c 65 61  iRowid = fts5Lea
10920 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
10930 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
10940 62 54 65 72 6d 6c 65 73 73 20 3d 20 66 74 73 35  bTermless = fts5
10950 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
10960 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
10970 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20  if( iRowid ){.  
10980 20 20 20 20 20 20 20 20 20 20 53 57 41 50 56 41            SWAPVA
10990 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65  L(Fts5Data*, pNe
109a0 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20  w, pLast);.     
109b0 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20         pgnoLast 
109c0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20  = pgno;.        
109d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74    }.          ft
109e0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e  s5DataRelease(pN
109f0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ew);.          i
10a00 66 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20  f( bTermless==0 
10a10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
10a20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10a30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  .  }..  /* If pL
10a40 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74  ast is NULL at t
10a50 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
10a60 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66  the last rowid f
10a70 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a  or this doclist.
10a80 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65    ** lies on the
10a90 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
10aa0 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
10ab0 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68   iterator. In th
10ac0 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49  is case .  ** pI
10ad0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
10ae0 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
10af0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
10b00 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
10b10 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73  ze.  ** field as
10b20 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10b30 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74  e first relevant
10b40 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61   rowid on the pa
10b50 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72  ge..  **.  ** Or
10b60 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f  , if pLast is no
10b70 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  n-NULL, then it 
10b80 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
10b90 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61   contains the la
10ba0 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49  st.  ** rowid. I
10bb0 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66  n this case conf
10bc0 69 67 75 72 65 20 74 68 65 20 69 74 65 72 61 74  igure the iterat
10bd0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
10be0 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ints to the.  **
10bf0 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
10c00 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  this page..  */.
10c10 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20    if( pLast ){. 
10c20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
10c30 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
10c40 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
10c50 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
10c60 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49   = pLast;.    pI
10c70 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
10c80 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69   pgnoLast;.    i
10c90 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69  Off = fts5LeafFi
10ca0 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 61 73  rstRowidOff(pLas
10cb0 74 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  t);.    iOff += 
10cc0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
10cd0 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Last->p[iOff], (
10ce0 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
10cf0 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  wid);.    pIter-
10d00 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
10d10 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 66 74  Off;..    if( ft
10d20 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73  s5LeafIsTermless
10d30 28 70 4c 61 73 74 29 20 29 7b 0a 20 20 20 20 20  (pLast) ){.     
10d40 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
10d50 63 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e  clist = pLast->n
10d60 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n+1;.    }else{.
10d70 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
10d80 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66 74 73  dofDoclist = fts
10d90 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
10da0 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a  f(pLast);.    }.
10db0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
10dc0 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
10dd0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  ge(p, pIter);.}.
10de0 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
10df0 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
10e00 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
10e10 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64  rst rowid of a d
10e20 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65  oclist..** There
10e30 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
10e40 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
10e50 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65  ith the final te
10e60 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  rm on the curren
10e70 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74  t .** page. If t
10e80 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
10e90 69 73 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  is the last term
10ea0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f   on the page, lo
10eb0 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69  ad the .** docli
10ec0 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69  st-index from di
10ed0 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  sk and initializ
10ee0 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74  e an iterator at
10ef0 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29   (pIter->pDlidx)
10f00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10f10 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
10f20 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20  Dlidx(Fts5Index 
10f30 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
10f40 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
10f50 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  Seg = pIter->pSe
10f60 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74  g->iSegid;.  int
10f70 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e   bRev = (pIter->
10f80 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
10f90 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20  ITER_REVERSE);. 
10fa0 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
10fb0 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
10fc0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66   /* Current leaf
10fd0 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65   data */..  asse
10fe0 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
10ff0 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
11000 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
11010 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
11020 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  dx==0 );..  /* C
11030 68 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72  heck if the curr
11040 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73  ent doclist ends
11050 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49   on this page. I
11060 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72  f it does, retur
11070 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74  n.  ** early wit
11080 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65  hout loading the
11090 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28   doclist-index (
110a0 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f  as it belongs to
110b0 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a   a different.  *
110c0 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28  * term. */.  if(
110d0 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
110e0 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c  fPgno==pIter->iL
110f0 65 61 66 50 67 6e 6f 20 0a 20 20 20 26 26 20 70  eafPgno .   && p
11100 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
11110 69 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ist<pLeaf->szLea
11120 66 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  f .  ){.    retu
11130 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72  rn;.  }..  pIter
11140 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44  ->pDlidx = fts5D
11150 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
11160 62 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65  bRev, iSeg, pIte
11170 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
11180 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
11190 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
111a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
111b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75  cond argument cu
111c0 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
111d0 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c  .** no valid val
111e0 75 65 73 20 65 78 63 65 70 74 20 66 6f 72 20 74  ues except for t
111f0 68 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 70  he Fts5SegIter.p
11200 4c 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72 69  Leaf member vari
11210 61 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75  able. This.** fu
11220 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
11230 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 6f  the leaf page fo
11240 72 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69 6e  r a term matchin
11250 67 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e  g (pTerm/nTerm).
11260 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 70  .**.** If the sp
11270 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20  ecified term is 
11280 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61 67  found on the pag
11290 65 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72  e, then the iter
112a0 61 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20  ator is left.** 
112b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20  pointing to it. 
112c0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65 20  If argument bGe 
112d0 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  is zero and the 
112e0 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e  term is not foun
112f0 64 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74  d,.** the iterat
11300 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
11310 69 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ing at EOF..**.*
11320 2a 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d  * If bGe is non-
11330 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70 65  zero and the spe
11340 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 6e  cified term is n
11350 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
11360 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69  he.** iterator i
11370 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
11380 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  to the smallest 
11390 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
113a0 65 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c  ent that.** is l
113b0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
113c0 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20 65  pecified term, e
113d0 76 65 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d  ven if this term
113e0 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a   is not on the.*
113f0 2a 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 0a  * current page..
11400 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11410 74 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20 46  ts5LeafSeek(.  F
11420 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11440 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f  * Leave any erro
11450 72 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20  r code here */. 
11460 20 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20 20   int bGe,       
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 3e   /* True for a >
11490 3d 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74  = search */.  Ft
114a0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
114b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
114c0 20 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65 65   Iterator to see
114d0 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  k */.  const u8 
114e0 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
114f0 6d 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m      /* Term t
11500 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
11510 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  ){.  int iOff;. 
11520 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 70   const u8 *a = p
11530 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
11540 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70    int szLeaf = p
11550 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
11560 65 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  eaf;.  int n = p
11570 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b  Iter->pLeaf->nn;
11580 0a 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d  ..  int nMatch =
11590 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20   0;.  int nKeep 
115a0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  = 0;.  int nNew 
115b0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  = 0;.  int iTerm
115c0 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69 64  Off;.  int iPgid
115d0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
115e0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
115f0 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69 64  t offset in pgid
11600 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f  x */.  int bEndO
11610 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  fPage = 0;..  as
11620 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
11630 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67  ITE_OK );..  iPg
11640 69 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  idx = szLeaf;.  
11650 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
11660 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
11670 69 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b  idx], iTermOff);
11680 0a 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f  .  iOff = iTermO
11690 66 66 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 6e  ff;.  if( iOff>n
116a0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
116b0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
116c0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
116d0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
116e0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
116f0 68 6f 77 20 6d 61 6e 79 20 6e 65 77 20 62 79 74  how many new byt
11700 65 73 20 61 72 65 20 69 6e 20 74 68 69 73 20 74  es are in this t
11710 65 72 6d 20 2a 2f 0a 20 20 20 20 66 74 73 35 46  erm */.    fts5F
11720 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61  astGetVarint32(a
11730 2c 20 69 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20  , iOff, nNew);. 
11740 20 20 20 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61     if( nKeep<nMa
11750 74 63 68 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  tch ){.      got
11760 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b  o search_failed;
11770 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
11780 72 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63  rt( nKeep>=nMatc
11790 68 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65  h );.    if( nKe
117a0 65 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20  ep==nMatch ){.  
117b0 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20      int nCmp;.  
117c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
117d0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77   nCmp = MIN(nNew
117e0 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b  , nTerm-nMatch);
117f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
11800 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCmp; i++){.  
11810 20 20 20 20 20 20 69 66 28 20 61 5b 69 4f 66 66        if( a[iOff
11820 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63  +i]!=pTerm[nMatc
11830 68 2b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  h+i] ) break;.  
11840 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74      }.      nMat
11850 63 68 20 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20  ch += i;..      
11860 69 66 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63  if( nTerm==nMatc
11870 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  h ){.        if(
11880 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20   i==nNew ){.    
11890 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
118a0 68 5f 73 75 63 63 65 73 73 3b 0a 20 20 20 20 20  h_success;.     
118b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
118c0 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
118d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
118e0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
118f0 28 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f  ( i<nNew && a[iO
11900 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74  ff+i]>pTerm[nMat
11910 63 68 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ch] ){.        g
11920 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65  oto search_faile
11930 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
11940 0a 0a 20 20 20 20 69 66 28 20 69 50 67 69 64 78  ..    if( iPgidx
11950 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62 45 6e  >=n ){.      bEn
11960 64 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20 20 20  dOfPage = 1;.   
11970 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11980 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66  .    iPgidx += f
11990 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
119a0 61 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70  a[iPgidx], nKeep
119b0 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20  );.    iTermOff 
119c0 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f  += nKeep;.    iO
119d0 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a  ff = iTermOff;..
119e0 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20      if( iOff>=n 
119f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
11a00 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
11a10 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
11a20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   }..    /* Read 
11a30 74 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20  the nKeep field 
11a40 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  of the next term
11a50 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73  . */.    fts5Fas
11a60 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20  tGetVarint32(a, 
11a70 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  iOff, nKeep);.  
11a80 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65  }.. search_faile
11a90 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20  d:.  if( bGe==0 
11aa0 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  ){.    fts5DataR
11ab0 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
11ac0 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
11ad0 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
11ae0 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
11af0 69 66 28 20 62 45 6e 64 4f 66 50 61 67 65 20 29  if( bEndOfPage )
11b00 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
11b10 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
11b20 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
11b30 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
11b40 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75  >pLeaf==0 ) retu
11b50 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20 70 49  rn;.      a = pI
11b60 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
11b70 20 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61       if( fts5Lea
11b80 66 49 73 54 65 72 6d 6c 65 73 73 28 70 49 74 65  fIsTermless(pIte
11b90 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a  r->pLeaf)==0 ){.
11ba0 20 20 20 20 20 20 20 20 69 50 67 69 64 78 20 3d          iPgidx =
11bb0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
11bc0 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 69  zLeaf;.        i
11bd0 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74  Pgidx += fts5Get
11be0 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d  Varint32(&pIter-
11bf0 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67 69 64 78  >pLeaf->p[iPgidx
11c00 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20  ], iOff);.      
11c10 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
11c20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65  iOff>=pIter->pLe
11c30 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
11c40 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
11c50 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
11c60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11c70 20 20 20 20 20 20 20 6e 4b 65 65 70 20 3d 20 30         nKeep = 0
11c80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54 65 72  ;.          iTer
11c90 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20  mOff = iOff;.   
11ca0 20 20 20 20 20 20 20 6e 20 3d 20 70 49 74 65 72         n = pIter
11cb0 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20 20  ->pLeaf->nn;.   
11cc0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
11cd0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
11ce0 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  a[iOff], nNew);.
11cf0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11d00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11d10 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 31   }.    }while( 1
11d20 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68   );.  }.. search
11d30 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20 70 49 74  _success:..  pIt
11d40 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
11d50 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a 20  = iOff + nNew;. 
11d60 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
11d70 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d  fOffset = pIter-
11d80 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
11d90 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
11da0 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c  Pgno = pIter->iL
11db0 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73 35  eafPgno;..  fts5
11dc0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
11dd0 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
11de0 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a 20  nKeep, pTerm);. 
11df0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
11e00 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
11e10 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77  Iter->term, nNew
11e20 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20  , &a[iOff]);..  
11e30 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b  if( iPgidx>=n ){
11e40 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
11e50 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65  ofDoclist = pIte
11e60 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a  r->pLeaf->nn+1;.
11e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
11e80 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 50 67   nExtra;.    iPg
11e90 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
11ea0 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
11eb0 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
11ec0 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
11ed0 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f 66 66 20  list = iTermOff 
11ee0 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20 20  + nExtra;.  }.  
11ef0 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
11f00 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20 20 66 74   = iPgidx;..  ft
11f10 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77  s5SegIterLoadRow
11f20 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  id(p, pIter);.  
11f30 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
11f40 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  Pos(p, pIter);.}
11f50 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ..static sqlite3
11f60 5f 73 74 6d 74 20 2a 66 74 73 35 49 64 78 53 65  _stmt *fts5IdxSe
11f70 6c 65 63 74 53 74 6d 74 28 46 74 73 35 49 6e 64  lectStmt(Fts5Ind
11f80 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ex *p){.  if( p-
11f90 3e 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29  >pIdxSelect==0 )
11fa0 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
11fb0 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
11fc0 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
11fd0 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
11fe0 28 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65  (p, &p->pIdxSele
11ff0 63 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ct, sqlite3_mpri
12000 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
12010 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d  SELECT pgno FROM
12020 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57   '%q'.'%q_idx' W
12030 48 45 52 45 20 22 0a 20 20 20 20 20 20 20 20 20  HERE ".         
12040 20 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65   "segid=? AND te
12050 72 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74  rm<=? ORDER BY t
12060 65 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31  erm DESC LIMIT 1
12070 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
12080 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
12090 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29  ig->zName.    ))
120a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
120b0 2d 3e 70 49 64 78 53 65 6c 65 63 74 3b 0a 7d 0a  ->pIdxSelect;.}.
120c0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
120d0 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74  e the object pIt
120e0 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
120f0 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
12100 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a  within segment.*
12110 2a 20 70 53 65 67 2e 20 49 66 20 74 68 65 72 65  * pSeg. If there
12120 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d   is no such term
12130 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74   in the index, t
12140 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  he iterator is s
12150 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
12160 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12170 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
12180 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
12190 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
121a0 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
121b0 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
121c0 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
121d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
121e0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
121f0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12200 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
12210 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46  terSeekInit(.  F
12220 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12240 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
12250 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
12260 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
12270 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
12280 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
12290 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
122a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
122b0 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
122c0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
122d0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
122e0 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
122f0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
12300 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  f segment */.  F
12310 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
12320 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
12330 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  * Object to popu
12340 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  late */.){.  int
12350 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20   iPg = 1;.  int 
12360 62 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46  bGe = (flags & F
12370 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
12380 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69  CAN);.  int bDli
12390 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dx = 0;         
123a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
123b0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f  if there is a do
123c0 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20  clist-index */. 
123d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
123e0 49 64 78 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  IdxSelect = 0;..
123f0 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30    assert( bGe==0
12400 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
12410 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
12420 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  C)==0 );.  asser
12430 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72  t( pTerm && nTer
12440 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  m );.  memset(pI
12450 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
12460 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
12470 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a  ->pSeg = pSeg;..
12480 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
12490 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61  sets stack varia
124a0 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c  ble iPg to the l
124b0 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
124c0 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f  that may.  ** co
124d0 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72  ntain term (pTer
124e0 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20  m/nTerm), if it 
124f0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
12500 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  e segment. */.  
12510 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66 74 73  pIdxSelect = fts
12520 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 70  5IdxSelectStmt(p
12530 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  );.  if( p->rc )
12540 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
12550 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78  e3_bind_int(pIdx
12560 53 65 6c 65 63 74 2c 20 31 2c 20 70 53 65 67 2d  Select, 1, pSeg-
12570 3e 69 53 65 67 69 64 29 3b 0a 20 20 73 71 6c 69  >iSegid);.  sqli
12580 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49  te3_bind_blob(pI
12590 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65  dxSelect, 2, pTe
125a0 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54  rm, nTerm, SQLIT
125b0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  E_STATIC);.  if(
125c0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
125d0 69 74 65 33 5f 73 74 65 70 28 70 49 64 78 53 65  ite3_step(pIdxSe
125e0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36 34  lect) ){.    i64
125f0 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63   val = sqlite3_c
12600 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 64 78 53 65  olumn_int(pIdxSe
12610 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50  lect, 0);.    iP
12620 67 20 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31  g = (int)(val>>1
12630 29 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20  );.    bDlidx = 
12640 28 76 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a  (val & 0x0001);.
12650 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71    }.  p->rc = sq
12660 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 64 78  lite3_reset(pIdx
12670 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66 28 20  Select);..  if( 
12680 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  iPg<pSeg->pgnoFi
12690 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d  rst ){.    iPg =
126a0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
126b0 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30  ;.    bDlidx = 0
126c0 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  ;.  }..  pIter->
126d0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20  iLeafPgno = iPg 
126e0 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74  - 1;.  fts5SegIt
126f0 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
12700 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74  ter);..  if( pIt
12710 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
12720 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70 2c   fts5LeafSeek(p,
12730 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54 65   bGe, pIter, pTe
12740 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a  rm, nTerm);.  }.
12750 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
12760 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d  LITE_OK && bGe==
12770 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  0 ){.    pIter->
12780 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
12790 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
127a0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
127b0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28  eaf ){.      if(
127c0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
127d0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
127e0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
127f0 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
12800 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
12810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12820 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20   bDlidx ){.     
12830 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
12840 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65 72  adDlidx(p, pIter
12850 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12860 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
12870 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
12880 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  C ){.        fts
12890 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
128a0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
128b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
128c0 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
128d0 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  xt(p, pIter);.. 
128e0 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a   /* Either:.  **
128f0 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72  .  **   1) an er
12900 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
12910 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74  , or.  **   2) t
12920 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
12930 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20  ts to EOF, or.  
12940 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72  **   3) the iter
12950 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ator points to a
12960 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72  n entry with ter
12970 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
12980 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68   or.  **   4) th
12990 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
129a0 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20  Y_SCAN flag was 
129b0 73 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72  set and the iter
129c0 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  ator points.  **
129d0 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72        to an entr
129e0 79 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72  y with a term gr
129f0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
12a00 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54  ual to (pTerm/nT
12a10 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  erm)..  */.  ass
12a20 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
12a30 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  TE_OK           
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12a60 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74  * 1 */.   || pIt
12a70 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20  er->pLeaf==0    
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20             /* 2 
12ab0 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66  */.   || fts5Buf
12ac0 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
12ad0 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
12ae0 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20  rm, nTerm)==0   
12af0 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20         /* 3 */. 
12b00 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73    || (bGe && fts
12b10 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
12b20 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
12b30 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30   pTerm, nTerm)>0
12b40 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a  )  /* 4 */.  );.
12b50 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
12b60 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
12b70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
12b80 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
12b90 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
12ba0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
12bb0 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  able. If there i
12bc0 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
12bd0 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
12be0 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
12bf0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
12c00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
12c10 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
12c20 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
12c30 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
12c40 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
12c50 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
12c60 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
12c70 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
12c80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
12c90 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
12ca0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12cb0 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
12cc0 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
12cd0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12ce0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
12cf0 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ckend */.  const
12d00 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
12d10 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
12d20 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
12d30 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
12d60 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
12d70 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
12d80 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
12d90 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
12da0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
12db0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  ){.  const u8 *p
12dc0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  List = 0;.  int 
12dd0 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  nList = 0;.  con
12de0 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20  st u8 *z = 0;.  
12df0 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73  int n = 0;..  as
12e00 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29  sert( p->pHash )
12e10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
12e20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
12e30 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
12e40 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
12e50 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
12e60 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
12e70 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
12e80 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73  ScanInit(p->pHas
12e90 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
12ea0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
12eb0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
12ec0 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
12ed0 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
12ee0 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
12ef0 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
12f00 20 28 7a 20 3f 20 28 69 6e 74 29 73 74 72 6c 65   (z ? (int)strle
12f10 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  n((const char*)z
12f20 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ) : 0);.  }else{
12f30 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
12f40 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
12f50 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73  R_ONETERM;.    s
12f60 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75  qlite3Fts5HashQu
12f70 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63  ery(p->pHash, (c
12f80 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d  onst char*)pTerm
12f90 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c  , nTerm, &pList,
12fa0 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20   &nList);.    z 
12fb0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d  = pTerm;.    n =
12fc0 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69   nTerm;.  }..  i
12fd0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
12fe0 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
12ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
13000 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
13010 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
13020 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66  n, z);.    pLeaf
13030 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63   = fts5IdxMalloc
13040 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
13050 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ata));.    if( p
13060 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
13070 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d  ;.    pLeaf->p =
13080 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
13090 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65   pLeaf->nn = pLe
130a0 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
130b0 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  st;.    pIter->p
130c0 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20  Leaf = pLeaf;.  
130d0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
130e0 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
130f0 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28  rint(pLeaf->p, (
13100 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
13110 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  wid);.    pIter-
13120 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
13130 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 20   pLeaf->nn;..   
13140 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
13150 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
13160 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  C ){.      pIter
13170 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
13180 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b  SEGITER_REVERSE;
13190 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
131a0 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
131b0 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
131c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
131d0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
131e0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
131f0 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65   }.  }..  fts5Se
13200 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
13210 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
13220 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61 74   Zero the iterat
13230 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
13240 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
13250 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
13260 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
13270 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
13280 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  er){.  fts5Buffe
13290 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65  rFree(&pIter->te
132a0 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52  rm);.  fts5DataR
132b0 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
132c0 65 61 66 29 3b 0a 20 20 66 74 73 35 44 61 74 61  eaf);.  fts5Data
132d0 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
132e0 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 66 74 73  NextLeaf);.  fts
132f0 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
13300 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20  Iter->pDlidx);. 
13310 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
13320 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
13330 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  t);.  memset(pIt
13340 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
13350 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a  s5SegIter));.}..
13360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
13370 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BUG../*.** This 
13380 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
13390 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
133a0 62 69 67 20 61 73 73 65 72 74 28 29 20 70 72 6f  big assert() pro
133b0 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74  cedure implement
133c0 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41 73 73  ed by.** fts5Ass
133d0 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
133e0 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65 73 20  p(). It ensures 
133f0 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
13400 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
13410 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69 73 20  .** in *pRes is 
13420 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
13430 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
13440 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
13450 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tions of the.** 
13460 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  two iterators..*
13470 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
13480 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73  s5AssertComparis
13490 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74 73 35  onResult(.  Fts5
134a0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
134b0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 2c  Fts5SegIter *p1,
134c0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
134d0 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73 75 6c  p2,.  Fts5CResul
134e0 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74  t *pRes.){.  int
134f0 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74 65 72   i1 = p1 - pIter
13500 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20 69 32  ->aSeg;.  int i2
13510 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d 3e 61   = p2 - pIter->a
13520 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e  Seg;..  if( p1->
13530 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65  pLeaf || p2->pLe
13540 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31  af ){.    if( p1
13550 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
13560 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
13570 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
13580 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32      }else if( p2
13590 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
135a0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
135b0 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a  ->iFirst==i1 );.
135c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
135d0 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28   int nMin = MIN(
135e0 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e  p1->term.n, p2->
135f0 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69  term.n);.      i
13600 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
13610 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e  p1->term.p, p2->
13620 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20  term.p, nMin);. 
13630 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
13640 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d  ) res = p1->term
13650 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b  .n - p2->term.n;
13660 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ..      if( res=
13670 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
13680 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
13690 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  mEq==1 );.      
136a0 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e 69 52    assert( p1->iR
136b0 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64  owid!=p2->iRowid
136c0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20   );.        res 
136d0 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e  = ((p1->iRowid >
136e0 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49   p2->iRowid)==pI
136f0 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20  ter->bRev) ? -1 
13700 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : 1;.      }else
13710 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13720 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
13730 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
13740 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
13750 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13760 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d  ( pRes->iFirst==
13770 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  i1 );.      }els
13780 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
13790 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
137a0 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  =i2 );.      }. 
137b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
137c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
137d0 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
137e0 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  s SQLITE_DEBUG i
137f0 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74  s defined when t
13800 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73  his module.** is
13810 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68   compiled. In th
13820 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 66 75  at case, this fu
13830 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65 6e 74  nction is essent
13840 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72 74 28  ially an assert(
13850 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ) .** statement 
13860 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  used to verify t
13870 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
13880 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
13890 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a  First[] array.**
138a0 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f   are correct..*/
138b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
138c0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
138d0 53 65 74 75 70 28 46 74 73 35 49 6e 64 65 78 20  Setup(Fts5Index 
138e0 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
138f0 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
13900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13910 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13920 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74 65 72  *pFirst = &pIter
13930 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
13940 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
13950 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ];.    int i;.. 
13960 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
13970 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70  st->pLeaf==0)==p
13980 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20  Iter->base.bEof 
13990 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
139a0 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69 53 77   that pIter->iSw
139b0 69 74 63 68 52 6f 77 69 64 20 69 73 20 73 65 74  itchRowid is set
139c0 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
139d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
139e0 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
139f0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13a00 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13a10 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20  >aSeg[i];.      
13a20 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46 69 72  assert( p1==pFir
13a30 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  st .           |
13a40 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a  | p1->pLeaf==0 .
13a50 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 74             || ft
13a60 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
13a70 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26  &pFirst->term, &
13a80 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20 20  p1->term) .     
13a90 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f        || p1->iRo
13aa0 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69  wid==pIter->iSwi
13ab0 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20 20 20  tchRowid.       
13ac0 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77      || (p1->iRow
13ad0 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63  id<pIter->iSwitc
13ae0 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  hRowid)==pIter->
13af0 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a 20 20  bRev.      );.  
13b00 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
13b10 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
13b20 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74   i+=2){.      Ft
13b30 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
13b40 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
13b50 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13b60 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d  er *p2 = &pIter-
13b70 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20  >aSeg[i+1];.    
13b80 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
13b90 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
13ba0 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65  irst[(pIter->nSe
13bb0 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20  g + i) / 2];.   
13bc0 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d     fts5AssertCom
13bd0 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49  parisonResult(pI
13be0 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65  ter, p1, p2, pRe
13bf0 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  s);.    }..    f
13c00 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74 65 72  or(i=1; i<(pIter
13c10 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d  ->nSeg / 2); i+=
13c20 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
13c30 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
13c40 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13c50 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69  >aFirst[i*2].iFi
13c60 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73  rst ];.      Fts
13c70 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26  5SegIter *p2 = &
13c80 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
13c90 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31  er->aFirst[i*2+1
13ca0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
13cb0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
13cc0 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
13cd0 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66  irst[i];.      f
13ce0 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
13cf0 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
13d00 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
13d10 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
13d20 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 41  e.# define fts5A
13d30 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
13d40 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  tup(x,y).#endif.
13d50 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f  ./*.** Do the co
13d60 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61  mparison necessa
13d70 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70  ry to populate p
13d80 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
13d90 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  t]..**.** If the
13da0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
13db0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
13dc0 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65  n it is the inde
13dd0 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  x of an entry.**
13de0 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
13df0 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74  Seg[] array that
13e00 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45   is (a) not at E
13e10 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e  OF, and (b) poin
13e20 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79  ting.** to a key
13e30 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69   that is a dupli
13e40 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c  cate of another,
13e50 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79   higher priority
13e60 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74  , .** segment-it
13e70 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53  erator in the pS
13e80 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  eg->aSeg[] array
13e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13ea0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
13eb0 6f 6d 70 61 72 65 28 46 74 73 35 49 74 65 72 20  ompare(Fts5Iter 
13ec0 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74  *pIter, int iOut
13ed0 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20  ){.  int i1;    
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13f00 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   left-hand Fts5S
13f10 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
13f20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i2;             
13f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13f40 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61  ndex of right-ha
13f50 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
13f60 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20  /.  int iRes;.  
13f70 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b  Fts5SegIter *p1;
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73  /* Left-hand Fts
13fa0 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
13fb0 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20  s5SegIter *p2;  
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13fd0 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   Right-hand Fts5
13fe0 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73  SegIter */.  Fts
13ff0 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
14000 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
14010 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iOut];..  assert
14020 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53  ( iOut<pIter->nS
14030 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a  eg && iOut>0 );.
14040 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
14050 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65  >bRev==0 || pIte
14060 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20  r->bRev==1 );.. 
14070 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65   if( iOut>=(pIte
14080 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20  r->nSeg/2) ){.  
14090 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70    i1 = (iOut - p
140a0 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20  Iter->nSeg/2) * 
140b0 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b  2;.    i2 = i1 +
140c0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
140d0 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69   i1 = pIter->aFi
140e0 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72  rst[iOut*2].iFir
140f0 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74  st;.    i2 = pIt
14100 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
14110 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d  2+1].iFirst;.  }
14120 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  .  p1 = &pIter->
14130 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d  aSeg[i1];.  p2 =
14140 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32   &pIter->aSeg[i2
14150 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72  ];..  pRes->bTer
14160 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  mEq = 0;.  if( p
14170 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  1->pLeaf==0 ){  
14180 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
14190 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  1 is at EOF */. 
141a0 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
141b0 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
141c0 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a  eaf==0 ){     /*
141d0 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f 46   If p2 is at EOF
141e0 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
141f0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
14200 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42 75  int res = fts5Bu
14210 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d  fferCompare(&p1-
14220 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d  >term, &p2->term
14230 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  );.    if( res==
14240 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
14250 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20  t( i2>i1 );.    
14260 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30 20    assert( i2!=0 
14270 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62  );.      pRes->b
14280 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20  TermEq = 1;.    
14290 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64    if( p1->iRowid
142a0 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ==p2->iRowid ){.
142b0 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c          p1->bDel
142c0 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20   = p2->bDel;.   
142d0 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a       return i2;.
142e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
142f0 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
14300 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
14310 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
14320 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  1 : +1;.    }.  
14330 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30    assert( res!=0
14340 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c   );.    if( res<
14350 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20  0 ){.      iRes 
14360 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = i1;.    }else{
14370 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 32  .      iRes = i2
14380 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
14390 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75  Res->iFirst = (u
143a0 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74 75 72  16)iRes;.  retur
143b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  n 0;.}../*.** Mo
143c0 76 65 20 74 68 65 20 73 65 67 2d 69 74 65 72 20  ve the seg-iter 
143d0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
143e0 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
143f0 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c 65  owid on page iLe
14400 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73  afPgno..** It is
14410 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65 61   an error if lea
14420 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73  f iLeafPgno does
14430 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
14440 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73  ntains no rowids
14450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14460 20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f   fts5SegIterGoto
14470 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
14480 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
14490 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
144a0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
144b0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
144c0 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
144d0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
144e0 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
144f0 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b  int iLeafPgno.){
14500 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66  .  assert( iLeaf
14510 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
14520 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20  fPgno );..  if( 
14530 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
14540 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  >pSeg->pgnoLast 
14550 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
14560 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  TS5_CORRUPT;.  }
14570 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44 61  else{.    fts5Da
14580 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
14590 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20  >pNextLeaf);.   
145a0 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
145b0 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72  f = 0;.    pIter
145c0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c  ->iLeafPgno = iL
145d0 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66  eafPgno-1;.    f
145e0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
145f0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
14600 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
14610 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49  =SQLITE_OK || pI
14620 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d  ter->iLeafPgno==
14630 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
14640 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14660 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
14670 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
14680 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
14690 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
146a0 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20  eaf->szLeaf;..  
146b0 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c      iOff = fts5L
146c0 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
146d0 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
146e0 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34        if( iOff<4
146f0 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20   || iOff>=n ){. 
14700 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
14710 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
14720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14730 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
14740 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
14750 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
14760 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
14770 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
14780 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
14790 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
147a0 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
147b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
147c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
147d0 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
147e0 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
147f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14800 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20   until it is at 
14810 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69  or .** past rowi
14820 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c  d iFrom. Regardl
14830 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
14840 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69   of iFrom, the i
14850 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c  terator is.** al
14860 77 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74  ways advanced at
14870 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a   least once..*/.
14880 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14890 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
148a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
148d0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
148e0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
148f0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
14900 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
14910 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69  vance */.  i64 i
14920 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20  Match           
14930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
14940 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61  vance iterator a
14950 74 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72  t least this far
14960 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65   */.){.  int bRe
14970 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  v = (pIter->flag
14980 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
14990 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73  _REVERSE);.  Fts
149a0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
149b0 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69  dx = pIter->pDli
149c0 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50  dx;.  int iLeafP
149d0 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
149e0 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d  afPgno;.  int bM
149f0 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  ove = 1;..  asse
14a00 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
14a10 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
14a20 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
14a30 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
14a40 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dx );.  assert( 
14a50 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a  pIter->pLeaf );.
14a60 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29  .  if( bRev==0 )
14a70 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74  {.    while( !ft
14a80 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
14a90 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61  , pDlidx) && iMa
14aa0 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65  tch>fts5DlidxIte
14ab0 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
14ac0 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e  {.      iLeafPgn
14ad0 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
14ae0 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
14af0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
14b00 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78  erNext(p, pDlidx
14b10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
14b20 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e  ert_nc( iLeafPgn
14b30 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o>=pIter->iLeafP
14b40 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a  gno || p->rc );.
14b50 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
14b60 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o>pIter->iLeafPg
14b70 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  no ){.      fts5
14b80 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28  SegIterGotoPage(
14b90 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50  p, pIter, iLeafP
14ba0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76  gno);.      bMov
14bb0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
14bc0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
14bd0 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
14be0 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  af==0 );.    ass
14bf0 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65  ert( iMatch<pIte
14c00 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  r->iRowid );.   
14c10 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69   while( !fts5Dli
14c20 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
14c30 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66  idx) && iMatch<f
14c40 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
14c50 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20  d(pDlidx) ){.   
14c60 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
14c70 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b  Prev(p, pDlidx);
14c80 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66  .    }.    iLeaf
14c90 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  Pgno = fts5Dlidx
14ca0 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
14cb0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  ;..    assert( f
14cc0 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
14cd0 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c  p, pDlidx) || iL
14ce0 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e  eafPgno<=pIter->
14cf0 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
14d00 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c    if( iLeafPgno<
14d10 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14d20 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
14d30 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
14d40 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20  afPgno+1;.      
14d50 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
14d60 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
14d70 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  er);.      bMove
14d80 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
14d90 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 62  .  do{.    if( b
14da0 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53  Move && p->rc==S
14db0 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49 74 65 72  QLITE_OK ) pIter
14dc0 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49 74 65 72  ->xNext(p, pIter
14dd0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49  , 0);.    if( pI
14de0 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  ter->pLeaf==0 ) 
14df0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
14e00 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d  Rev==0 && pIter-
14e10 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20  >iRowid>=iMatch 
14e20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
14e30 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74 65   bRev!=0 && pIte
14e40 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63  r->iRowid<=iMatc
14e50 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62  h ) break;.    b
14e60 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69  Move = 1;.  }whi
14e70 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
14e80 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  E_OK );.}.../*.*
14e90 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72 61  * Free the itera
14ea0 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
14eb0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
14ec0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
14ed0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
14ee0 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35 49  tiIterFree(Fts5I
14ef0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
14f00 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
14f10 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
14f20 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
14f30 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  g; i++){.      f
14f40 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
14f50 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29  &pIter->aSeg[i])
14f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
14f70 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
14f80 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29  (pIter->pStruct)
14f90 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
14fa0 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73  Free(&pIter->pos
14fb0 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
14fc0 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
14fd0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
14fe0 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
14ff0 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35  Advanced(.  Fts5
15000 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
15010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15020 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
15030 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
15040 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
15050 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
15060 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
15070 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
15080 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
15090 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20   int iChanged,  
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150b0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
150c0 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
150d0 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  dvanced */.  int
150e0 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20   iMinset        
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15100 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e  Minimum entry in
15110 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74   aFirst[] to set
15120 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
15130 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e    for(i=(pIter->
15140 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32  nSeg+iChanged)/2
15150 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20  ; i>=iMinset && 
15160 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15170 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e  ; i=i/2){.    in
15180 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28  t iEq;.    if( (
15190 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  iEq = fts5MultiI
151a0 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74  terDoCompare(pIt
151b0 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20  er, i)) ){.     
151c0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
151d0 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
151e0 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 61 73  g[iEq];.      as
151f0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
15200 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
15210 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70  pSeg->xNext(p, p
15220 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Seg, 0);.      i
15230 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b   = pIter->nSeg +
15240 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iEq;.    }.  }.
15250 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65  }../*.** Sub-ite
15260 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64 20 6f  rator iChanged o
15270 66 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  f iterator pIter
15280 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
15290 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74 69 6c  dvanced. It stil
152a0 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  l.** points to t
152b0 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74 68 6f  he same term tho
152c0 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64 69 66  ugh - just a dif
152d0 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20 54 68  ferent rowid. Th
152e0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
152f0 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64 61 74  ttempts to updat
15300 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
15310 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69  f the pIter->aFi
15320 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c  rst[] accordingl
15330 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  y..** If it does
15340 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79   so successfully
15350 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
15360 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a   Otherwise 1..**
15370 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  .** If non-zero 
15380 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
15390 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63   caller should c
153a0 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  all fts5MultiIte
153b0 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f  rAdvanced().** o
153c0 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  n the iterator i
153d0 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66 75 6e  nstead. That fun
153e0 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73  ction does the s
153f0 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e 65 2c  ame as this one,
15400 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
15410 69 74 20 64 65 61 6c 73 20 77 69 74 68 20 6d 6f  it deals with mo
15420 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 63  re complicated c
15430 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ases as well..*/
15440 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73   .static int fts
15450 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
15460 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 74  eRowid(.  Fts5It
15470 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
15480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
15490 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20  rator to update 
154a0 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66  aFirst[] array f
154b0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61  or */.  int iCha
154c0 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  nged,           
154d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
154e0 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72   of sub-iterator
154f0 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a   just advanced *
15500 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
15510 2a 2a 70 70 46 69 72 73 74 0a 29 7b 0a 20 20 46  **ppFirst.){.  F
15520 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77  ts5SegIter *pNew
15530 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
15540 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66  iChanged];..  if
15550 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
15560 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
15570 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d  wid.   || (pNew-
15580 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69  >iRowid<pIter->i
15590 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49  SwitchRowid)==pI
155a0 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20  ter->bRev.  ){. 
155b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74     int i;.    Ft
155c0 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65  s5SegIter *pOthe
155d0 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
155e0 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30  [iChanged ^ 0x00
155f0 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  01];.    pIter->
15600 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15610 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41  Iter->bRev ? SMA
15620 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41  LLEST_INT64 : LA
15630 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20  RGEST_INT64;.   
15640 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
15650 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
15660 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20   1; i=i/2){.    
15670 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
15680 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
15690 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20  irst[i];..      
156a0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c  assert( pNew->pL
156b0 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eaf );.      ass
156c0 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d  ert( pRes->bTerm
156d0 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d  Eq==0 || pOther-
156e0 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20  >pLeaf );..     
156f0 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d   if( pRes->bTerm
15700 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Eq ){.        if
15710 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
15720 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29  pOther->iRowid )
15730 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
15740 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  rn 1;.        }e
15750 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
15760 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52  >iRowid>pNew->iR
15770 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
15780 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
15790 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
157a0 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
157b0 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
157c0 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20  pNew = pOther;. 
157d0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
157e0 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
157f0 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  >pIter->iSwitchR
15800 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
15810 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
15820 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
15830 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
15840 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
15850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
15860 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31  es->iFirst = (u1
15870 36 29 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d  6)(pNew - pIter-
15880 3e 61 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66  >aSeg);.      if
15890 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a  ( i==1 ) break;.
158a0 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20  .      pOther = 
158b0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
158c0 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20  ter->aFirst[i ^ 
158d0 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74 20 5d  0x0001].iFirst ]
158e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
158f0 70 70 46 69 72 73 74 20 3d 20 70 4e 65 77 3b 0a  ppFirst = pNew;.
15900 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
15910 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 49 74  *.** Set the pIt
15920 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61 62 6c  er->bEof variabl
15930 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  e based on the s
15940 74 61 74 65 20 6f 66 20 74 68 65 20 73 75 62 2d  tate of the sub-
15950 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
15960 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
15970 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 46 74  ltiIterSetEof(Ft
15980 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
15990 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
159a0 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
159b0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
159c0 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
159d0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f   pIter->base.bEo
159e0 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  f = pSeg->pLeaf=
159f0 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69 53 77  =0;.  pIter->iSw
15a00 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53 65 67  itchRowid = pSeg
15a10 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  ->iRowid;.}../*.
15a20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
15a30 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
15a40 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49   entry. .**.** I
15a50 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15a60 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
15a70 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35   is left in Fts5
15a80 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73 20  Index.rc. It is 
15a90 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  not .** consider
15aa0 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
15ab0 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
15ac0 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20 69  hes EOF, or if i
15ad0 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  t is already at 
15ae0 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68 69  .** EOF when thi
15af0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15b00 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
15b10 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
15b20 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e  erNext(.  Fts5In
15b30 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
15b40 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e  ter *pIter,.  in
15b50 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t bFrom,        
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15b70 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e   True if argumen
15b80 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64  t iFrom is valid
15b90 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20   */.  i64 iFrom 
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bb0 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
15bc0 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72   at least as far
15bd0 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20   as this */.){. 
15be0 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d 20   int bUseFrom = 
15bf0 62 46 72 6f 6d 3b 0a 20 20 77 68 69 6c 65 28 20  bFrom;.  while( 
15c00 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15c10 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 69 72   ){.    int iFir
15c20 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  st = pIter->aFir
15c30 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  st[1].iFirst;.  
15c40 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
15c50 20 30 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49   0;.    Fts5SegI
15c60 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
15c70 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d  er->aSeg[iFirst]
15c80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15c90 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15ca0 3b 0a 20 20 20 20 69 66 28 20 62 55 73 65 46 72  ;.    if( bUseFr
15cb0 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69  om && pSeg->pDli
15cc0 64 78 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  dx ){.      fts5
15cd0 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
15ce0 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b  p, pSeg, iFrom);
15cf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15d00 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c    pSeg->xNext(p,
15d10 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d   pSeg, &bNewTerm
15d20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
15d30 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
15d40 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20   || bNewTerm .  
15d50 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49     || fts5MultiI
15d60 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
15d70 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 26  pIter, iFirst, &
15d80 70 53 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20  pSeg).    ){.   
15d90 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
15da0 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65  Advanced(p, pIte
15db0 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20  r, iFirst, 1);. 
15dc0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
15dd0 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b  erSetEof(pIter);
15de0 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70  .      pSeg = &p
15df0 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
15e00 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
15e10 73 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st];.      if( p
15e20 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  Seg->pLeaf==0 ) 
15e30 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
15e40 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c     fts5AssertMul
15e50 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70  tiIterSetup(p, p
15e60 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Iter);.    asser
15e70 74 28 20 70 53 65 67 3d 3d 26 70 49 74 65 72 2d  t( pSeg==&pIter-
15e80 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69  >aSeg[pIter->aFi
15e90 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 20 26  rst[1].iFirst] &
15ea0 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 3b  & pSeg->pLeaf );
15eb0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
15ec0 62 53 6b 69 70 45 6d 70 74 79 3d 3d 30 20 7c 7c  bSkipEmpty==0 ||
15ed0 20 70 53 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20   pSeg->nPos ){. 
15ee0 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
15ef0 4f 75 74 70 75 74 73 28 70 49 74 65 72 2c 20 70  Outputs(pIter, p
15f00 53 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Seg);.      retu
15f10 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 55  rn;.    }.    bU
15f20 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 7d 0a  seFrom = 0;.  }.
15f30 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
15f40 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
15f50 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  2(.  Fts5Index *
15f60 70 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a  p, .  Fts5Iter *
15f70 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62  pIter,.  int *pb
15f80 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20  NewTerm         
15f90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15fa0 20 54 72 75 65 20 69 66 20 2a 6d 69 67 68 74 2a   True if *might*
15fb0 20 62 65 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a   be new term */.
15fc0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
15fd0 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 29  er->bSkipEmpty )
15fe0 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
15ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16000 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  do {.      int i
16010 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61  First = pIter->a
16020 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b  First[1].iFirst;
16030 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
16040 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
16050 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b  r->aSeg[iFirst];
16060 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
16070 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  erm = 0;..      
16080 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
16090 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
160a0 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c    pSeg->xNext(p,
160b0 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d   pSeg, &bNewTerm
160c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
160d0 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62  g->pLeaf==0 || b
160e0 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20  NewTerm .       
160f0 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  || fts5MultiIter
16100 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 49 74  AdvanceRowid(pIt
16110 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70 53 65  er, iFirst, &pSe
16120 67 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  g).      ){.    
16130 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
16140 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74  rAdvanced(p, pIt
16150 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a  er, iFirst, 1);.
16160 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
16170 69 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65  iIterSetEof(pIte
16180 72 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e  r);.        *pbN
16190 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
161a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
161b0 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b   *pbNewTerm = 0;
161c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
161d0 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
161e0 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65 72  erSetup(p, pIter
161f0 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  );..    }while( 
16200 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
16210 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29  mpty(p, pIter) )
16220 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
16230 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
16240 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28 46 74 73  Outputs_Noop(Fts
16250 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64 31 2c  5Iter *pUnused1,
16260 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 55   Fts5SegIter *pU
16270 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  nused2){.  UNUSE
16280 44 5f 50 41 52 41 4d 32 28 70 55 6e 75 73 65 64  D_PARAM2(pUnused
16290 31 2c 20 70 55 6e 75 73 65 64 32 29 3b 0a 7d 0a  1, pUnused2);.}.
162a0 0a 73 74 61 74 69 63 20 46 74 73 35 49 74 65 72  .static Fts5Iter
162b0 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41   *fts5MultiIterA
162c0 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e 64 65  lloc(.  Fts5Inde
162d0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
162e0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
162f0 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
16300 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
16310 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46 74 73  nt nSeg.){.  Fts
16320 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69  5Iter *pNew;.  i
16330 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16350 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e  * Power of two >
16360 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72  = nSeg */..  for
16370 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c  (nSlot=2; nSlot<
16380 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f  nSeg; nSlot=nSlo
16390 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66  t*2);.  pNew = f
163a0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
163b0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
163c0 73 35 49 74 65 72 29 20 2b 20 20 20 20 20 20 20  s5Iter) +       
163d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
163e0 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  ew */.      size
163f0 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29 20  of(Fts5SegIter) 
16400 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20  * (nSlot-1) +   
16410 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20  /* pNew->aSeg[] 
16420 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
16430 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e  Fts5CResult) * n
16440 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20  Slot         /* 
16450 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a  pNew->aFirst[] *
16460 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  /.  );.  if( pNe
16470 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  w ){.    pNew->n
16480 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20  Seg = nSlot;.   
16490 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d 20   pNew->aFirst = 
164a0 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26 70  (Fts5CResult*)&p
164b0 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d  New->aSeg[nSlot]
164c0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64  ;.    pNew->pInd
164d0 65 78 20 3d 20 70 3b 0a 20 20 20 20 70 4e 65 77  ex = p;.    pNew
164e0 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
164f0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
16500 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 20 20 72  ts_Noop;.  }.  r
16510 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 73  eturn pNew;.}..s
16520 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
16530 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a  oslistCallback(.
16540 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e    Fts5Index *pUn
16550 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70  used, .  void *p
16560 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73  Context, .  cons
16570 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
16580 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 55 4e  t nChunk.){.  UN
16590 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73  USED_PARAM(pUnus
165a0 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  ed);.  assert_nc
165b0 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
165c0 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
165d0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
165e0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 28 46  afeAppendBlob((F
165f0 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e 74  ts5Buffer*)pCont
16600 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  ext, pChunk, nCh
16610 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70  unk);.  }.}..typ
16620 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c  edef struct Posl
16630 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 50  istCallbackCtx P
16640 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16650 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73  x;.struct Poslis
16660 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20  tCallbackCtx {. 
16670 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
16680 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
16690 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
166a0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46  is buffer */.  F
166b0 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
166c0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
166d0 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68  * Restrict match
166e0 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d  es to this colum
166f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 74  n */.  int eStat
16700 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
16710 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
16720 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64  ove */.};..typed
16730 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73  ef struct Poslis
16740 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f 73 6c  tOffsetsCtx Posl
16750 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b 0a 73  istOffsetsCtx;.s
16760 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66  truct PoslistOff
16770 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74 73 35  setsCtx {.  Fts5
16780 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
16790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
167a0 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75  ppend to this bu
167b0 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f  ffer */.  Fts5Co
167c0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20  lset *pColset;  
167d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
167e0 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f  trict matches to
167f0 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   this column */.
16800 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 69    int iRead;.  i
16810 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f  nt iWrite;.};../
16820 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65 20  *.** TODO: Make 
16830 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69  this more effici
16840 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent!.*/.static i
16850 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73  nt fts5IndexCols
16860 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c 73 65  etTest(Fts5Colse
16870 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74 20  t *pColset, int 
16880 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iCol){.  int i;.
16890 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
168a0 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  lset->nCol; i++)
168b0 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  {.    if( pColse
168c0 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f  t->aiCol[i]==iCo
168d0 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  l ) return 1;.  
168e0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
168f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16900 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43  5PoslistOffsetsC
16910 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
16920 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a  ndex *pUnused, .
16930 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
16940 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
16950 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
16960 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 4f 66  k.){.  PoslistOf
16970 66 73 65 74 73 43 74 78 20 2a 70 43 74 78 20 3d  fsetsCtx *pCtx =
16980 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73   (PoslistOffsets
16990 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20  Ctx*)pContext;. 
169a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
169b0 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  nused);.  assert
169c0 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29  _nc( nChunk>=0 )
169d0 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30  ;.  if( nChunk>0
169e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
169f0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3c  0;.    while( i<
16a00 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
16a10 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  int iVal;.      
16a20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
16a30 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69 5d 2c  nt32(&pChunk[i],
16a40 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 56   iVal);.      iV
16a50 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52 65 61  al += pCtx->iRea
16a60 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70 43 74  d - 2;.      pCt
16a70 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61 6c 3b  x->iRead = iVal;
16a80 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49  .      if( fts5I
16a90 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
16aa0 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 56  Ctx->pColset, iV
16ab0 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  al) ){.        f
16ac0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
16ad0 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e  endVarint(pCtx->
16ae0 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32 20 2d  pBuf, iVal + 2 -
16af0 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29 3b 0a   pCtx->iWrite);.
16b00 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69 57          pCtx->iW
16b10 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20 20 20  rite = iVal;.   
16b20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
16b30 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16b40 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
16b50 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
16b60 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 0a 20  ndex *pUnused,. 
16b70 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
16b80 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
16b90 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
16ba0 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43 61 6c  .){.  PoslistCal
16bb0 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78 20 3d  lbackCtx *pCtx =
16bc0 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63   (PoslistCallbac
16bd0 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  kCtx*)pContext;.
16be0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
16bf0 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72  Unused);.  asser
16c00 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20  t_nc( nChunk>=0 
16c10 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e  );.  if( nChunk>
16c20 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  0 ){.    /* Sear
16c30 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20 66 69  ch through to fi
16c40 6e 64 20 74 68 65 20 66 69 72 73 74 20 76 61 72  nd the first var
16c50 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65 20 31  int with value 1
16c60 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a 20 20  . This is the.  
16c70 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68    ** start of th
16c80 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73 20 68  e next columns h
16c90 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  its. */.    int 
16ca0 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
16cb0 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20  Start = 0;..    
16cc0 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65  if( pCtx->eState
16cd0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==2 ){.      int
16ce0 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66 74 73   iCol;.      fts
16cf0 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
16d00 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c  (pChunk, i, iCol
16d10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  );.      if( fts
16d20 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74  5IndexColsetTest
16d30 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20  (pCtx->pColset, 
16d40 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  iCol) ){.       
16d50 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
16d60 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  1;.        fts5B
16d70 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
16d80 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75 66  arint(pCtx->pBuf
16d90 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
16da0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  e{.        pCtx-
16db0 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20  >eState = 0;.   
16dc0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
16dd0 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  do {.      while
16de0 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20 70 43  ( i<nChunk && pC
16df0 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20 29 7b  hunk[i]!=0x01 ){
16e00 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
16e10 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78 38 30  pChunk[i] & 0x80
16e20 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) i++;.        
16e30 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
16e40 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
16e50 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ate ){.        f
16e60 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
16e70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42  endBlob(pCtx->pB
16e80 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61  uf, &pChunk[iSta
16e90 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a  rt], i-iStart);.
16ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16eb0 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20  ( i<nChunk ){.  
16ec0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
16ed0 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
16ee0 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b   i;.        i++;
16ef0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
16f00 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
16f10 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
16f20 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 2;.        }e
16f30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
16f40 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
16f50 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43  32(pChunk, i, iC
16f60 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ol);.          p
16f70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 66 74  Ctx->eState = ft
16f80 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
16f90 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c  t(pCtx->pColset,
16fa0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
16fb0 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61    if( pCtx->eSta
16fc0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
16fd0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
16fe0 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d  AppendBlob(pCtx-
16ff0 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69  >pBuf, &pChunk[i
17000 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74  Start], i-iStart
17010 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17020 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  Start = i;.     
17030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
17050 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 3b  ile( i<nChunk );
17060 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
17070 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65  oid fts5ChunkIte
17080 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rate(.  Fts5Inde
17090 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
170a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
170b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
170c0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20  5SegIter *pSeg, 
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
170e0 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73 20  Poslist of this 
170f0 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f  iterator */.  vo
17100 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17120 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72   Context pointer
17130 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c   for xChunk call
17140 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28  back */.  void (
17150 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e 64  *xChunk)(Fts5Ind
17160 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73  ex*, void*, cons
17170 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20  t u8*, int).){. 
17180 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65 67   int nRem = pSeg
17190 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20  ->nPos;         
171a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
171b0 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d  tes still to com
171c0 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  e */.  Fts5Data 
171d0 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75 38  *pData = 0;.  u8
171e0 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65 67   *pChunk = &pSeg
171f0 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
17200 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
17210 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49   int nChunk = MI
17220 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c  N(nRem, pSeg->pL
17230 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  eaf->szLeaf - pS
17240 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 29  eg->iLeafOffset)
17250 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70  ;.  int pgno = p
17260 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  Seg->iLeafPgno;.
17270 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d    int pgnoSave =
17280 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
17290 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
172a0 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74 61 69  mwork with detai
172b0 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73 65 73  l=none databases
172c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
172d0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
172e0 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
172f0 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20 28  NONE );..  if( (
17300 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46 54  pSeg->flags & FT
17310 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
17320 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 67  SE)==0 ){.    pg
17330 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31 3b  noSave = pgno+1;
17340 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
17350 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28 70   ){.    xChunk(p
17360 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c 20  , pCtx, pChunk, 
17370 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52 65  nChunk);.    nRe
17380 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20  m -= nChunk;.   
17390 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
173a0 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  (pData);.    if(
173b0 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20 20   nRem<=0 ){.    
173c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
173d0 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b 2b  se{.      pgno++
173e0 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
173f0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
17400 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
17410 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69  ID(pSeg->pSeg->i
17420 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b 0a 20  Segid, pgno));. 
17430 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d       if( pData==
17440 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
17450 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74 61   pChunk = &pData
17460 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43  ->p[4];.      nC
17470 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c  hunk = MIN(nRem,
17480 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d   pData->szLeaf -
17490 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   4);.      if( p
174a0 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b  gno==pgnoSave ){
174b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
174c0 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66   pSeg->pNextLeaf
174d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
174e0 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  Seg->pNextLeaf =
174f0 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20   pData;.        
17500 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  pData = 0;.     
17510 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
17520 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
17530 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
17540 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64  oints to a valid
17550 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29   entry (not EOF)
17560 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
17570 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20 70  on appends the p
17580 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
17590 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  a for the curren
175a0 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75  t entry to.** bu
175b0 66 66 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f  ffer pBuf. It do
175c0 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f  es not make a co
175d0 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  py of the positi
175e0 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20  on-list size.** 
175f0 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
17600 20 76 6f 69 64 20 66 74 73 35 53 65 67 69 74 65   void fts5Segite
17610 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
17620 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
17630 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20  SegIter *pSeg,. 
17640 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
17650 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66  lset,.  Fts5Buff
17660 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66  er *pBuf.){.  if
17670 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47  ( 0==fts5BufferG
17680 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  row(&p->rc, pBuf
17690 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29 7b  , pSeg->nPos) ){
176a0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74  .    if( pColset
176b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
176c0 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c  5ChunkIterate(p,
176d0 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70 42   pSeg, (void*)pB
176e0 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 43  uf, fts5PoslistC
176f0 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65  allback);.    }e
17700 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
17710 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
17720 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
17730 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  FULL ){.        
17740 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
17750 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20  tx sCtx;.       
17760 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75   sCtx.pBuf = pBu
17770 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  f;.        sCtx.
17780 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65  pColset = pColse
17790 74 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  t;.        sCtx.
177a0 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64  eState = fts5Ind
177b0 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f  exColsetTest(pCo
177c0 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lset, 0);.      
177d0 20 20 61 73 73 65 72 74 28 20 73 43 74 78 2e 65    assert( sCtx.e
177e0 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78  State==0 || sCtx
177f0 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20  .eState==1 );.  
17800 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
17810 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
17820 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74  (void*)&sCtx, ft
17830 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
17840 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
17850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
17860 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
17870 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20 6d   sCtx;.        m
17880 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20  emset(&sCtx, 0, 
17890 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20  sizeof(sCtx));. 
178a0 20 20 20 20 20 20 20 73 43 74 78 2e 70 42 75 66         sCtx.pBuf
178b0 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20   = pBuf;.       
178c0 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20   sCtx.pColset = 
178d0 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20  pColset;.       
178e0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
178f0 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64  e(p, pSeg, (void
17900 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73  *)&sCtx, fts5Pos
17910 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62  listOffsetsCallb
17920 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ack);.      }.  
17930 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
17940 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65   IN/OUT paramete
17950 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73 20 74  r (*pa) points t
17960 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  o a position lis
17970 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  t n bytes in siz
17980 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73  e. If.** the pos
17990 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ition list conta
179a0 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
179b0 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65  column iCol, the
179c0 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74 0a 2a  n (*pa) is set.*
179d0 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  * to point to th
179e0 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c  e sub-position-l
179f0 69 73 74 20 66 6f 72 20 74 68 61 74 20 63 6f 6c  ist for that col
17a00 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  umn and the numb
17a10 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69  er of.** bytes i
17a20 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e 20 4f  n it returned. O
17a30 72 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  r, if the argume
17a40 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
17a50 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e   does not.** con
17a60 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69 65 73  tain any entries
17a70 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c   for column iCol
17a80 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
17a90 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
17aa0 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 0a 20  dexExtractCol(. 
17ab0 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20   const u8 **pa, 
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ad0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e   /* IN/OUT: Poin
17ae0 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a  ter to poslist *
17af0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65 20      /* IN: Size 
17b20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79  of poslist in by
17b30 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  tes */.  int iCo
17b40 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
17b50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
17b60 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 66 72  mn to extract fr
17b70 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b  om poslist */.){
17b80 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
17b90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17ba0 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62     /* Anything b
17bb0 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
17bc0 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f  0x01 is col 0 */
17bd0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d  .  const u8 *p =
17be0 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38   *pa;.  const u8
17bf0 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20   *pEnd = &p[n]; 
17c00 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
17c10 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
17c20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
17c30 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e  ..  while( iCol>
17c40 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  iCurrent ){.    
17c50 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74  /* Advance point
17c60 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f  er p until it po
17c70 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20  ints to pEnd or 
17c80 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68 61  an 0x01 byte tha
17c90 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  t is.    ** not 
17ca0 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74  part of a varint
17cb0 2e 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  . Note that it i
17cc0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
17cd0 6f 72 20 61 20 6e 65 67 61 74 69 76 65 0a 20 20  or a negative.  
17ce0 20 20 2a 2a 20 6f 72 20 65 78 74 72 65 6d 65 6c    ** or extremel
17cf0 79 20 6c 61 72 67 65 20 76 61 72 69 6e 74 20 74  y large varint t
17d00 6f 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20 61  o occur within a
17d10 6e 20 75 6e 63 6f 72 72 75 70 74 65 64 20 70 6f  n uncorrupted po
17d20 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6c  sition .    ** l
17d30 69 73 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74  ist. So the last
17d40 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 76 61   byte of each va
17d50 72 69 6e 74 20 6d 61 79 20 62 65 20 61 73 73 75  rint may be assu
17d60 6d 65 64 20 74 6f 20 68 61 76 65 20 61 20 63 6c  med to have a cl
17d70 65 61 72 0a 20 20 20 20 2a 2a 20 30 78 38 30 20  ear.    ** 0x80 
17d80 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69  bit.  */.    whi
17d90 6c 65 28 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a  le( *p!=0x01 ){.
17da0 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b        while( *p+
17db0 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 20 20  + & 0x80 );.    
17dc0 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 20    if( p>=pEnd ) 
17dd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
17de0 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20      *pa = p++;. 
17df0 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 2a 70     iCurrent = *p
17e00 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 75 72  ++;.    if( iCur
17e10 72 65 6e 74 20 26 20 30 78 38 30 20 29 7b 0a 20  rent & 0x80 ){. 
17e20 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20 20 20 20       p--;.      
17e30 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  p += fts5GetVari
17e40 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e 74  nt32(p, iCurrent
17e50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
17e60 66 28 20 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e  f( iCol!=iCurren
17e70 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
17e80 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e   /* Advance poin
17e90 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70  ter p until it p
17ea0 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72  oints to pEnd or
17eb0 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68   an 0x01 byte th
17ec0 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70  at is.  ** not p
17ed0 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20  art of a varint 
17ee0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45  */.  while( p<pE
17ef0 6e 64 20 26 26 20 2a 70 21 3d 30 78 30 31 20 29  nd && *p!=0x01 )
17f00 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b  {.    while( *p+
17f10 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 7d 0a  + & 0x80 );.  }.
17f20 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20 28 2a  .  return p - (*
17f30 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  pa);.}..static i
17f40 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72  nt fts5IndexExtr
17f50 61 63 74 43 6f 6c 73 65 74 20 28 0a 20 20 46 74  actColset (.  Ft
17f60 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
17f70 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
17f80 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65   Colset to filte
17f90 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  r on */.  const 
17fa0 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50  u8 *pPos, int nP
17fb0 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  os,       /* Pos
17fc0 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
17fd0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
18000 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
18010 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
18020 6e 74 20 69 3b 0a 0a 20 20 66 74 73 35 42 75 66  nt i;..  fts5Buf
18030 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
18040 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
18050 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  set->nCol; i++){
18060 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
18070 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20  Sub = pPos;.    
18080 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35 49  int nSub = fts5I
18090 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26  ndexExtractCol(&
180a0 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c  pSub, nPos, pCol
180b0 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a  set->aiCol[i]);.
180c0 20 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b 0a      if( nSub ){.
180d0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
180e0 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20  AppendBlob(&rc, 
180f0 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62  pBuf, nSub, pSub
18100 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
18110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18120 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
18130 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
18140 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c  detail=none tabl
18150 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
18160 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
18170 74 70 75 74 73 5f 4e 6f 6e 65 28 46 74 73 35 49  tputs_None(Fts5I
18180 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
18190 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
181a0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
181b0 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
181c0 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
181d0 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20  DETAIL_NONE );. 
181e0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f   pIter->base.iRo
181f0 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
18200 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  id;.  pIter->bas
18210 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d 3e  e.nData = pSeg->
18220 6e 50 6f 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  nPos;.}../*.** x
18230 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
18240 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
18250 69 6c 3d 66 75 6c 6c 20 61 6e 64 20 64 65 74 61  il=full and deta
18260 69 6c 3d 63 6f 6c 20 74 61 62 6c 65 73 20 77 68  il=col tables wh
18270 65 6e 20 6e 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  en no.** column 
18280 66 69 6c 74 65 72 73 20 61 72 65 20 73 70 65 63  filters are spec
18290 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
182a0 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
182b0 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c 73 65  tOutputs_Nocolse
182c0 74 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  t(Fts5Iter *pIte
182d0 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
182e0 70 53 65 67 29 7b 0a 20 20 70 49 74 65 72 2d 3e  pSeg){.  pIter->
182f0 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53  base.iRowid = pS
18300 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49  eg->iRowid;.  pI
18310 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
18320 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 0a 20  = pSeg->nPos;.. 
18330 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
18340 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
18350 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
18360 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20  ETAIL_NONE );.  
18370 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
18380 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 0a 20 20  Colset==0 );..  
18390 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  if( pSeg->iLeafO
183a0 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73  ffset+pSeg->nPos
183b0 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  <=pSeg->pLeaf->s
183c0 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  zLeaf ){.    /* 
183d0 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72  All data is stor
183e0 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
183f0 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61 74 65  t page. Populate
18400 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20 20 20   the output .   
18410 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f   ** variables to
18420 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20   point into the 
18430 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61 67 65  body of the page
18440 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
18450 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
18460 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  a = &pSeg->pLeaf
18470 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
18480 66 66 73 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  ffset];.  }else{
18490 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  .    /* The data
184a0 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
184b0 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65  over two or more
184c0 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74 20   pages. Copy it 
184d0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
184e0 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73 74  Fts5Iter.poslist
184f0 20 62 75 66 66 65 72 20 61 6e 64 20 74 68 65 6e   buffer and then
18500 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
18510 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
18520 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  .    ** to this 
18530 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20  buffer.  */.    
18540 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
18550 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
18560 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72  .    fts5Segiter
18570 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70  Poslist(pIter->p
18580 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 30 2c 20  Index, pSeg, 0, 
18590 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
185a0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ;.    pIter->bas
185b0 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.pData = pIter-
185c0 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a  >poslist.p;.  }.
185d0 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
185e0 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
185f0 65 64 20 77 68 65 6e 20 74 68 65 20 46 74 73 35  ed when the Fts5
18600 43 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 68 61  Colset object ha
18610 73 20 6e 43 6f 6c 3d 3d 30 20 28 6d 61 74 63 68  s nCol==0 (match
18620 0a 2a 2a 20 61 67 61 69 6e 73 74 20 6e 6f 20 63  .** against no c
18630 6f 6c 75 6d 6e 73 20 61 74 20 61 6c 6c 29 2e 0a  olumns at all)..
18640 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18650 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18660 73 5f 5a 65 72 6f 43 6f 6c 73 65 74 28 46 74 73  s_ZeroColset(Fts
18670 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
18680 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
18690 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
186a0 28 70 53 65 67 29 3b 0a 20 20 70 49 74 65 72 2d  (pSeg);.  pIter-
186b0 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 30 3b  >base.nData = 0;
186c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75  .}../*.** xSetOu
186d0 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75  tputs callback u
186e0 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 63 6f  sed by detail=co
186f0 6c 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  l when there is 
18700 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 0a  a column filter.
18710 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
18720 20 31 30 30 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   100 or more col
18730 75 6d 6e 73 2e 20 41 6c 73 6f 20 63 61 6c 6c 65  umns. Also calle
18740 64 20 61 73 20 61 20 66 61 6c 6c 62 61 63 6b 20  d as a fallback 
18750 66 72 6f 6d 0a 2a 2a 20 66 74 73 35 49 74 65 72  from.** fts5Iter
18760 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30  SetOutputs_Col10
18770 30 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  0 if the column-
18780 6c 69 73 74 20 73 70 61 6e 73 20 6d 6f 72 65 20  list spans more 
18790 74 68 61 6e 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  than one page..*
187a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
187b0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
187c0 5f 43 6f 6c 28 46 74 73 35 49 74 65 72 20 2a 70  _Col(Fts5Iter *p
187d0 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
187e0 72 20 2a 70 53 65 67 29 7b 0a 20 20 66 74 73 35  r *pSeg){.  fts5
187f0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
18800 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 66  r->poslist);.  f
18810 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
18820 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
18830 20 70 53 65 67 2c 20 70 49 74 65 72 2d 3e 70 43   pSeg, pIter->pC
18840 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70  olset, &pIter->p
18850 6f 73 6c 69 73 74 29 3b 0a 20 20 70 49 74 65 72  oslist);.  pIter
18860 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
18870 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pSeg->iRowid;.  
18880 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
18890 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
188a0 73 74 2e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 62  st.p;.  pIter->b
188b0 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65  ase.nData = pIte
188c0 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 7d 0a  r->poslist.n;.}.
188d0 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75  ./*.** xSetOutpu
188e0 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  ts callback used
188f0 20 77 68 65 6e 3a 20 0a 2a 2a 0a 2a 2a 20 20 20   when: .**.**   
18900 2a 20 64 65 74 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a  * detail=col,.**
18910 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 61 20     * there is a 
18920 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2c 20 61  column filter, a
18930 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 74 61  nd.**   * the ta
18940 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 30 30  ble contains 100
18950 20 6f 72 20 66 65 77 65 72 20 63 6f 6c 75 6d 6e   or fewer column
18960 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61  s. .**.** The la
18970 73 74 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 65  st point is to e
18980 6e 73 75 72 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e  nsure all column
18990 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73 74 6f   numbers are sto
189a0 72 65 64 20 61 73 20 0a 2a 2a 20 73 69 6e 67 6c  red as .** singl
189b0 65 2d 62 79 74 65 20 76 61 72 69 6e 74 73 2e 0a  e-byte varints..
189c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
189d0 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
189e0 73 5f 43 6f 6c 31 30 30 28 46 74 73 35 49 74 65  s_Col100(Fts5Ite
189f0 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65  r *pIter, Fts5Se
18a00 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 0a 20  gIter *pSeg){.. 
18a10 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
18a20 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
18a30 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
18a40 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b  ETAIL_COLUMNS );
18a50 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
18a60 2d 3e 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20  ->pColset );..  
18a70 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  if( pSeg->iLeafO
18a80 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73  ffset+pSeg->nPos
18a90 3e 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a  >pSeg->pLeaf->sz
18aa0 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
18ab0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43  IterSetOutputs_C
18ac0 6f 6c 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b  ol(pIter, pSeg);
18ad0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
18ae0 20 2a 61 20 3d 20 28 75 38 2a 29 26 70 53 65 67   *a = (u8*)&pSeg
18af0 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
18b00 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
18b10 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 28 75     u8 *pEnd = (u
18b20 38 2a 29 26 61 5b 70 53 65 67 2d 3e 6e 50 6f 73  8*)&a[pSeg->nPos
18b30 5d 3b 20 0a 20 20 20 20 69 6e 74 20 69 50 72 65  ]; .    int iPre
18b40 76 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a  v = 0;.    int *
18b50 61 69 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 70  aiCol = pIter->p
18b60 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b 0a 20  Colset->aiCol;. 
18b70 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 45 6e 64     int *aiColEnd
18b80 20 3d 20 26 61 69 43 6f 6c 5b 70 49 74 65 72 2d   = &aiCol[pIter-
18b90 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 5d 3b  >pColset->nCol];
18ba0 0a 0a 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d  ..    u8 *aOut =
18bb0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18bc0 70 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76  p;.    int iPrev
18bd0 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 70 49  Out = 0;..    pI
18be0 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64  ter->base.iRowid
18bf0 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
18c00 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 61 3c 70  ..    while( a<p
18c10 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 50 72  End ){.      iPr
18c20 65 76 20 2b 3d 20 28 69 6e 74 29 61 2b 2b 5b 30  ev += (int)a++[0
18c30 5d 20 2d 20 32 3b 0a 20 20 20 20 20 20 77 68 69  ] - 2;.      whi
18c40 6c 65 28 20 2a 61 69 43 6f 6c 3c 69 50 72 65 76  le( *aiCol<iPrev
18c50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43 6f   ){.        aiCo
18c60 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l++;.        if(
18c70 20 61 69 43 6f 6c 3d 3d 61 69 43 6f 6c 45 6e 64   aiCol==aiColEnd
18c80 20 29 20 67 6f 74 6f 20 73 65 74 6f 75 74 70 75   ) goto setoutpu
18c90 74 73 5f 63 6f 6c 5f 6f 75 74 3b 0a 20 20 20 20  ts_col_out;.    
18ca0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 61    }.      if( *a
18cb0 69 43 6f 6c 3d 3d 69 50 72 65 76 20 29 7b 0a 20  iCol==iPrev ){. 
18cc0 20 20 20 20 20 20 20 2a 61 4f 75 74 2b 2b 20 3d         *aOut++ =
18cd0 20 28 75 38 29 28 28 69 50 72 65 76 20 2d 20 69   (u8)((iPrev - i
18ce0 50 72 65 76 4f 75 74 29 20 2b 20 32 29 3b 0a 20  PrevOut) + 2);. 
18cf0 20 20 20 20 20 20 20 69 50 72 65 76 4f 75 74 20         iPrevOut 
18d00 3d 20 69 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  = iPrev;.      }
18d10 0a 20 20 20 20 7d 0a 0a 73 65 74 6f 75 74 70 75  .    }..setoutpu
18d20 74 73 5f 63 6f 6c 5f 6f 75 74 3a 0a 20 20 20 20  ts_col_out:.    
18d30 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
18d40 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
18d50 73 74 2e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d  st.p;.    pIter-
18d60 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 61 4f  >base.nData = aO
18d70 75 74 20 2d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ut - pIter->posl
18d80 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ist.p;.  }.}../*
18d90 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
18da0 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
18db0 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20 77 68 65   detail=full whe
18dc0 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c  n there is a col
18dd0 75 6d 6e 20 66 69 6c 74 65 72 2e 0a 2a 2f 0a 73  umn filter..*/.s
18de0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
18df0 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 46 75  terSetOutputs_Fu
18e00 6c 6c 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  ll(Fts5Iter *pIt
18e10 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  er, Fts5SegIter 
18e20 2a 70 53 65 67 29 7b 0a 20 20 46 74 73 35 43 6f  *pSeg){.  Fts5Co
18e30 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20  lset *pColset = 
18e40 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3b 0a  pIter->pColset;.
18e50 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52    pIter->base.iR
18e60 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f  owid = pSeg->iRo
18e70 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  wid;..  assert( 
18e80 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
18e90 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
18ea0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c  =FTS5_DETAIL_FUL
18eb0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  L );.  assert( p
18ec0 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69 66 28  Colset );..  if(
18ed0 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
18ee0 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70  et+pSeg->nPos<=p
18ef0 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  Seg->pLeaf->szLe
18f00 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  af ){.    /* All
18f10 20 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20   data is stored 
18f20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
18f30 61 67 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  age. Populate th
18f40 65 20 6f 75 74 70 75 74 20 0a 20 20 20 20 2a 2a  e output .    **
18f50 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 70 6f   variables to po
18f60 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  int into the bod
18f70 79 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 62  y of the page ob
18f80 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e  ject. */.    con
18f90 73 74 20 75 38 20 2a 61 20 3d 20 26 70 53 65 67  st u8 *a = &pSeg
18fa0 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
18fb0 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
18fc0 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e     if( pColset->
18fd0 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nCol==1 ){.     
18fe0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
18ff0 74 61 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78  ta = fts5IndexEx
19000 74 72 61 63 74 43 6f 6c 28 26 61 2c 20 70 53 65  tractCol(&a, pSe
19010 67 2d 3e 6e 50 6f 73 2c 70 43 6f 6c 73 65 74 2d  g->nPos,pColset-
19020 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20  >aiCol[0]);.    
19030 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
19040 61 74 61 20 3d 20 61 3b 0a 20 20 20 20 7d 65 6c  ata = a;.    }el
19050 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75  se{.      fts5Bu
19060 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
19070 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  >poslist);.     
19080 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
19090 74 43 6f 6c 73 65 74 28 70 43 6f 6c 73 65 74 2c  tColset(pColset,
190a0 20 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20   a, pSeg->nPos, 
190b0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
190c0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
190d0 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
190e0 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
190f0 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
19100 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  nData = pIter->p
19110 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 7d 0a  oslist.n;.    }.
19120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19130 54 68 65 20 64 61 74 61 20 69 73 20 64 69 73 74  The data is dist
19140 72 69 62 75 74 65 64 20 6f 76 65 72 20 74 77 6f  ributed over two
19150 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e 20   or more pages. 
19160 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68 65  Copy it into the
19170 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65 72  .    ** Fts5Iter
19180 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20  .poslist buffer 
19190 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68 65  and then set the
191a0 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20   output pointer 
191b0 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20  to point.    ** 
191c0 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e 20  to this buffer. 
191d0 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66   */.    fts5Buff
191e0 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
191f0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73  oslist);.    fts
19200 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
19210 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
19220 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70  Seg, pColset, &p
19230 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
19240 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
19250 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  pData = pIter->p
19260 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70 49  oslist.p;.    pI
19270 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
19280 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
19290 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  .n;.  }.}..stati
192a0 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
192b0 65 74 4f 75 74 70 75 74 43 62 28 69 6e 74 20 2a  etOutputCb(int *
192c0 70 52 63 2c 20 46 74 73 35 49 74 65 72 20 2a 70  pRc, Fts5Iter *p
192d0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 2a 70 52  Iter){.  if( *pR
192e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
192f0 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
19300 70 43 6f 6e 66 69 67 20 3d 20 70 49 74 65 72 2d  pConfig = pIter-
19310 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
19320 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69  ;.    if( pConfi
19330 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
19340 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
19350 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65        pIter->xSe
19360 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49  tOutputs = fts5I
19370 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
19380 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65  ne;.    }..    e
19390 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
193a0 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Colset==0 ){.   
193b0 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75     pIter->xSetOu
193c0 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72  tputs = fts5Iter
193d0 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c  SetOutputs_Nocol
193e0 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  set;.    }..    
193f0 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e  else if( pIter->
19400 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 30  pColset->nCol==0
19410 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
19420 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66  >xSetOutputs = f
19430 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
19440 73 5f 5a 65 72 6f 43 6f 6c 73 65 74 3b 0a 20 20  s_ZeroColset;.  
19450 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66    }..    else if
19460 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ( pConfig->eDeta
19470 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
19480 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 49  FULL ){.      pI
19490 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
194a0 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
194b0 74 70 75 74 73 5f 46 75 6c 6c 3b 0a 20 20 20 20  tputs_Full;.    
194c0 7d 0a 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  }..    else{.   
194d0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6e 66     assert( pConf
194e0 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
194f0 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53  5_DETAIL_COLUMNS
19500 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
19510 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31 30 30  onfig->nCol<=100
19520 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
19530 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
19540 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
19550 75 74 73 5f 43 6f 6c 31 30 30 3b 0a 20 20 20 20  uts_Col100;.    
19560 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
19570 75 66 66 65 72 53 69 7a 65 28 70 52 63 2c 20 26  ufferSize(pRc, &
19580 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2c 20  pIter->poslist, 
19590 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a  pConfig->nCol);.
195a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
195b0 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
195c0 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
195d0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c  erSetOutputs_Col
195e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
195f0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c    }.}.../*.** Al
19600 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74 73  locate a new Fts
19610 35 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  5Iter object..**
19620 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
19630 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ct will be used 
19640 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
19650 67 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63  gh data in struc
19660 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a  ture pStruct..**
19670 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76   If iLevel is -v
19680 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61  e, then all data
19690 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73   in all segments
196a0 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20   is merged. Or, 
196b0 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  if iLevel.** is 
196c0 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c  zero or greater,
196d0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66   data from the f
196e0 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65  irst nSegment se
196f0 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20  gments on level 
19700 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72  iLevel.** is mer
19710 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ged..**.** The i
19720 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c  terator initiall
19730 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
19740 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64  first term/rowid
19750 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a   entry in the .*
19760 2a 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e  * iterated data.
19770 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19780 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
19790 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
197a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
197b0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
197c0 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
197d0 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53  ithin */.  Fts5S
197e0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
197f0 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  t,         /* St
19800 72 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69  ructure of speci
19810 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  fic index */.  i
19820 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19840 2a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  * FTS5INDEX_QUER
19850 59 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  Y_XXX flags */. 
19860 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
19870 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
19880 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69   /* Colset to fi
19890 6c 74 65 72 20 6f 6e 20 28 6f 72 20 4e 55 4c 4c  lter on (or NULL
198a0 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  ) */.  const u8 
198b0 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
198c0 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
198d0 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55  o seek to (or NU
198e0 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69  LL/0) */.  int i
198f0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
19900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
19910 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28  vel to iterate (
19920 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20  -1 for all) */. 
19930 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20   int nSegment,  
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19950 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
19960 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20  gments to merge 
19970 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20  (iLevel>=0) */. 
19980 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75   Fts5Iter **ppOu
19990 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
199a0 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
199b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 20  /.){.  int nSeg 
199c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
199d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
199e0 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65 72   of segment-iter
199f0 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  s in use */.  in
19a00 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20  t iIter = 0;    
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a20 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20   */.  int iSeg; 
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
19a50 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
19a60 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
19a70 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
19a80 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49  l *pLvl;.  Fts5I
19a90 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73  ter *pNew;..  as
19aa0 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20  sert( (pTerm==0 
19ab0 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20  && nTerm==0) || 
19ac0 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f  iLevel<0 );..  /
19ad0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
19ae0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c   for the new mul
19af0 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e  ti-seg-iterator.
19b00 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
19b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19b20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29    if( iLevel<0 )
19b30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19b40 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
19b50 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65  t==fts5Structure
19b60 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
19b70 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20  truct) );.      
19b80 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
19b90 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20  nSegment;.      
19ba0 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73  nSeg += (p->pHas
19bb0 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  h ? 1 : 0);.    
19bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65  }else{.      nSe
19bd0 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d  g = MIN(pStruct-
19be0 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e  >aLevel[iLevel].
19bf0 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  nSeg, nSegment);
19c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
19c10 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
19c20 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
19c30 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66 28 20  p, nSeg);.  if( 
19c40 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
19c50 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d  ;.  pNew->bRev =
19c60 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54   (0!=(flags & FT
19c70 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
19c80 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53  SC));.  pNew->bS
19c90 6b 69 70 45 6d 70 74 79 20 3d 20 28 30 21 3d 28  kipEmpty = (0!=(
19ca0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
19cb0 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54  X_QUERY_SKIPEMPT
19cc0 59 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 74  Y));.  pNew->pSt
19cd0 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
19ce0 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 73 65 74 20    pNew->pColset 
19cf0 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 66 74 73  = pColset;.  fts
19d00 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 53  5StructureRef(pS
19d10 74 72 75 63 74 29 3b 0a 20 20 69 66 28 20 28 66  truct);.  if( (f
19d20 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
19d30 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 29  _QUERY_NOOUTPUT)
19d40 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 49  ==0 ){.    fts5I
19d50 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 26  terSetOutputCb(&
19d60 70 2d 3e 72 63 2c 20 70 4e 65 77 29 3b 0a 20 20  p->rc, pNew);.  
19d70 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
19d80 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  ze each of the c
19d90 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74  omponent segment
19da0 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20   iterators. */. 
19db0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19dc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
19dd0 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
19de0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
19df0 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70  Level *pEnd = &p
19e00 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70  Struct->aLevel[p
19e10 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b  Struct->nLevel];
19e20 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48  .      if( p->pH
19e30 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ash ){.        /
19e40 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20  * Add a segment 
19e50 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  iterator for the
19e60 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
19e70 73 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61  s of the hash ta
19e80 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ble. */.        
19e90 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
19ea0 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
19eb0 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
19ec0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 48 61     fts5SegIterHa
19ed0 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c  shInit(p, pTerm,
19ee0 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70   nTerm, flags, p
19ef0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
19f00 20 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70       for(pLvl=&p
19f10 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
19f20 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c  ]; pLvl<pEnd; pL
19f30 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  vl++){.        f
19f40 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53  or(iSeg=pLvl->nS
19f50 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
19f60 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Seg--){.        
19f70 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
19f80 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
19f90 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
19fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35  ;.          Fts5
19fb0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
19fc0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
19fd0 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 20  er++];.         
19fe0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
19ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1a000 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
1a010 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20  pSeg, pIter);.  
1a020 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a030 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
1a040 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70  egIterSeekInit(p
1a050 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , pTerm, nTerm, 
1a060 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74  flags, pSeg, pIt
1a070 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
1a080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a090 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1a0a0 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72      pLvl = &pStr
1a0b0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
1a0c0 65 6c 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  el];.      for(i
1a0d0 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67  Seg=nSeg-1; iSeg
1a0e0 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20  >=0; iSeg--){.  
1a0f0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
1a100 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e  rInit(p, &pLvl->
1a110 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65  aSeg[iSeg], &pNe
1a120 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
1a130 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a140 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 49 74  .    assert( iIt
1a150 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 20 20 7d 0a  er==nSeg );.  }.
1a160 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
1a170 76 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ve was successfu
1a180 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  l, each componen
1a190 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20  t iterators now 
1a1a0 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20  points .  ** to 
1a1b0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1a1c0 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20  in its segment. 
1a1d0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 69  In this case ini
1a1e0 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a  tialize the .  *
1a1f0 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  * aFirst[] array
1a200 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
1a210 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
1a220 66 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f  free the iterato
1a230 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e  r.  ** object an
1a240 64 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  d set the output
1a250 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
1a260 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  L.  */.  if( p->
1a270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a280 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72 3d 70  .    for(iIter=p
1a290 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74  New->nSeg-1; iIt
1a2a0 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a  er>0; iIter--){.
1a2b0 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20        int iEq;. 
1a2c0 20 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20       if( (iEq = 
1a2d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
1a2e0 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74  ompare(pNew, iIt
1a2f0 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  er)) ){.        
1a300 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
1a310 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  g = &pNew->aSeg[
1a320 69 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  iEq];.        if
1a330 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1a340 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e 65 78 74  OK ) pSeg->xNext
1a350 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20  (p, pSeg, 0);.  
1a360 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1a370 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
1a380 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29  New, iEq, iIter)
1a390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a3a0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1a3b0 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20  rSetEof(pNew);. 
1a3c0 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c     fts5AssertMul
1a3d0 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70  tiIterSetup(p, p
1a3e0 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
1a3f0 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
1a400 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  && fts5MultiIter
1a410 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29  IsEmpty(p, pNew)
1a420 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75   ){.      fts5Mu
1a430 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
1a440 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  New, 0, 0);.    
1a450 7d 65 6c 73 65 20 69 66 28 20 70 4e 65 77 2d 3e  }else if( pNew->
1a460 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a  base.bEof==0 ){.
1a470 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
1a480 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77 2d  r *pSeg = &pNew-
1a490 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69 72  >aSeg[pNew->aFir
1a4a0 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
1a4b0 20 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f       pNew->xSetO
1a4c0 75 74 70 75 74 73 28 70 4e 65 77 2c 20 70 53 65  utputs(pNew, pSe
1a4d0 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  g);.    }..  }el
1a4e0 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  se{.    fts5Mult
1a4f0 69 49 74 65 72 46 72 65 65 28 70 4e 65 77 29 3b  iIterFree(pNew);
1a500 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b  .    *ppOut = 0;
1a510 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
1a520 65 61 74 65 20 61 6e 20 46 74 73 35 49 74 65 72  eate an Fts5Iter
1a530 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 74   that iterates t
1a540 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69  hrough the docli
1a550 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61  st provided.** a
1a560 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1a570 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
1a580 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
1a590 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49  terNew2(.  Fts5I
1a5a0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1a5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1a5c0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
1a5d0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
1a5e0 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
1a5f0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
1a600 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20    /* Doclist to 
1a610 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1a620 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20  */.  int bDesc, 
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1a650 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
1a660 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73  d order */.  Fts
1a670 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  5Iter **ppOut   
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a690 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  New object */.){
1a6a0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65  .  Fts5Iter *pNe
1a6b0 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35  w;.  pNew = fts5
1a6c0 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70  MultiIterAlloc(p
1a6d0 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 2);.  if( pNew
1a6e0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
1a6f0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
1a700 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20  ew->aSeg[1];..  
1a710 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d    pIter->flags =
1a720 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
1a730 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70  ETERM;.    if( p
1a740 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29  Data->szLeaf>0 )
1a750 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  {.      pIter->p
1a760 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20  Leaf = pData;.  
1a770 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
1a780 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
1a790 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c  Varint(pData->p,
1a7a0 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
1a7b0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49  Rowid);.      pI
1a7c0 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
1a7d0 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a  st = pData->nn;.
1a7e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72        pNew->aFir
1a7f0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31  st[1].iFirst = 1
1a800 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 73  ;.      if( bDes
1a810 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  c ){.        pNe
1a820 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20  w->bRev = 1;.   
1a830 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
1a840 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
1a850 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
1a860 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
1a870 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
1a880 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
1a890 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
1a8a0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
1a8b0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
1a8c0 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61     }.      pData
1a8d0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1a8e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73  .      pNew->bas
1a8f0 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  e.bEof = 1;.    
1a900 7d 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  }.    fts5SegIte
1a910 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65  rSetNext(p, pIte
1a920 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20  r);..    *ppOut 
1a930 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66  = pNew;.  }..  f
1a940 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
1a950 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
1a960 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1a970 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 61  he iterator is a
1a980 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65  t EOF or if an e
1a990 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
1a9a0 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68  d. .** False oth
1a9b0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1a9c0 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
1a9d0 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
1a9e0 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70   *p, Fts5Iter *p
1a9f0 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
1aa00 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c   p->rc .      ||
1aa10 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   (pIter->aSeg[ p
1aa20 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
1aa30 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d  iFirst ].pLeaf==
1aa40 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e  0)==pIter->base.
1aa50 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65 74  bEof .  );.  ret
1aa60 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49  urn (p->rc || pI
1aa70 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 29 3b  ter->base.bEof);
1aa80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1aa90 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
1aaa0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
1aab0 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
1aac0 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  tly points.** to
1aad0 2e 20 49 66 20 74 68 65 20 69 74 65 72 61 74 6f  . If the iterato
1aae0 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20  r points to EOF 
1aaf0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1ab00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
1ab10 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20  .** results are 
1ab20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
1ab30 61 74 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c  atic i64 fts5Mul
1ab40 74 69 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  tiIterRowid(Fts5
1ab50 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1ab60 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61  assert( pIter->a
1ab70 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1ab80 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70  st[1].iFirst ].p
1ab90 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75 72 6e  Leaf );.  return
1aba0 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
1abb0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1abc0 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a  First ].iRowid;.
1abd0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1abe0 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
1abf0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74 20  e next entry at 
1ac00 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61  or following iMa
1ac10 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tch..*/.static v
1ac20 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
1ac30 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73  rNextFrom(.  Fts
1ac40 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1ac50 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  s5Iter *pIter, .
1ac60 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a    i64 iMatch.){.
1ac70 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1ac80 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
1ac90 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
1aca0 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c  ext(p, pIter, 1,
1acb0 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66   iMatch);.    if
1acc0 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
1acd0 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 20 62  of(p, pIter) ) b
1ace0 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64  reak;.    iRowid
1acf0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1ad00 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
1ad10 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65    if( pIter->bRe
1ad20 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d  v==0 && iRowid>=
1ad30 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
1ad40 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
1ad50 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev!=0 && iRowid
1ad60 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  <=iMatch ) break
1ad70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1ad80 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1ad90 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1ada0 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20  aining the term 
1adb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1adc0 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68  the .** entry th
1add0 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  at the iterator 
1ade0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1adf0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63   to..*/.static c
1ae00 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c  onst u8 *fts5Mul
1ae10 74 69 49 74 65 72 54 65 72 6d 28 46 74 73 35 49  tiIterTerm(Fts5I
1ae20 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
1ae30 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67 49  *pn){.  Fts5SegI
1ae40 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72 2d  ter *p = &pIter-
1ae50 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
1ae60 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
1ae70 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72  ;.  *pn = p->ter
1ae80 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  m.n;.  return p-
1ae90 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  >term.p;.}../*.*
1aea0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1aeb0 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20   segment-id for 
1aec0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 53  the structure pS
1aed0 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73  truct. The new s
1aee0 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73  egment.** id mus
1aef0 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  t be between 1 a
1af00 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69  nd 65335 inclusi
1af10 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74  ve, and must not
1af20 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   be used by .** 
1af30 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78  any currently ex
1af40 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20  isting segment. 
1af50 49 66 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e  If a free segmen
1af60 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66  t id cannot be f
1af70 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
1af80 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  FULL is returned
1af90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1afa0 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
1afb0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
1afc0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1afd0 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74  op. 0 is .** ret
1afe0 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
1aff0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1b000 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  t fts5AllocateSe
1b010 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  gid(Fts5Index *p
1b020 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
1b030 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
1b040 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20   iSegid = 0;..  
1b050 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1b060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1b070 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1b080 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  t>=FTS5_MAX_SEGM
1b090 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ENT ){.      p->
1b0a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
1b0b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b0c0 20 20 20 2f 2a 20 46 54 53 35 5f 4d 41 58 5f 53     /* FTS5_MAX_S
1b0d0 45 47 4d 45 4e 54 20 69 73 20 63 75 72 72 65 6e  EGMENT is curren
1b0e0 74 6c 79 20 64 65 66 69 6e 65 64 20 61 73 20 32  tly defined as 2
1b0f0 30 30 30 2e 20 53 6f 20 74 68 65 20 66 6f 6c 6c  000. So the foll
1b100 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  owing.      ** a
1b110 72 72 61 79 20 69 73 20 36 33 20 65 6c 65 6d 65  rray is 63 eleme
1b120 6e 74 73 2c 20 6f 72 20 32 35 32 20 62 79 74 65  nts, or 252 byte
1b130 73 2c 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a  s, in size.  */.
1b140 20 20 20 20 20 20 75 33 32 20 61 55 73 65 64 5b        u32 aUsed[
1b150 28 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e  (FTS5_MAX_SEGMEN
1b160 54 2b 33 31 29 20 2f 20 33 32 5d 3b 0a 20 20 20  T+31) / 32];.   
1b170 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65     int iLvl, iSe
1b180 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  g;.      int i;.
1b190 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a        u32 mask;.
1b1a0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 55 73        memset(aUs
1b1b0 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 55  ed, 0, sizeof(aU
1b1c0 73 65 64 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  sed));.      for
1b1d0 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1b1e0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1b1f0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
1b200 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
1b210 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  <pStruct->aLevel
1b220 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65  [iLvl].nSeg; iSe
1b230 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
1b240 69 6e 74 20 69 49 64 20 3d 20 70 53 74 72 75 63  int iId = pStruc
1b250 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1b260 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69  aSeg[iSeg].iSegi
1b270 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  d;.          if(
1b280 20 69 49 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53   iId<=FTS5_MAX_S
1b290 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  EGMENT ){.      
1b2a0 20 20 20 20 20 20 61 55 73 65 64 5b 28 69 49 64        aUsed[(iId
1b2b0 2d 31 29 20 2f 20 33 32 5d 20 7c 3d 20 31 20 3c  -1) / 32] |= 1 <
1b2c0 3c 20 28 28 69 49 64 2d 31 29 20 25 20 33 32 29  < ((iId-1) % 32)
1b2d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b2f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1b300 61 55 73 65 64 5b 69 5d 3d 3d 30 78 46 46 46 46  aUsed[i]==0xFFFF
1b310 46 46 46 46 3b 20 69 2b 2b 29 3b 0a 20 20 20 20  FFFF; i++);.    
1b320 20 20 6d 61 73 6b 20 3d 20 61 55 73 65 64 5b 69    mask = aUsed[i
1b330 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ];.      for(iSe
1b340 67 69 64 3d 30 3b 20 6d 61 73 6b 20 26 20 28 31  gid=0; mask & (1
1b350 20 3c 3c 20 69 53 65 67 69 64 29 3b 20 69 53 65   << iSegid); iSe
1b360 67 69 64 2b 2b 29 3b 0a 20 20 20 20 20 20 69 53  gid++);.      iS
1b370 65 67 69 64 20 2b 3d 20 31 20 2b 20 69 2a 33 32  egid += 1 + i*32
1b380 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1b390 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 6f 72  _DEBUG.      for
1b3a0 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1b3b0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1b3c0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
1b3d0 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
1b3e0 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  <pStruct->aLevel
1b3f0 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65  [iLvl].nSeg; iSe
1b400 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
1b410 61 73 73 65 72 74 28 20 69 53 65 67 69 64 21 3d  assert( iSegid!=
1b420 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1b430 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d  iLvl].aSeg[iSeg]
1b440 2e 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20 20  .iSegid );.     
1b450 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b460 20 20 20 61 73 73 65 72 74 28 20 69 53 65 67 69     assert( iSegi
1b470 64 3e 30 20 26 26 20 69 53 65 67 69 64 3c 3d 46  d>0 && iSegid<=F
1b480 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20  TS5_MAX_SEGMENT 
1b490 29 3b 0a 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  );..      {.    
1b4a0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1b4b0 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66   *pIdxSelect = f
1b4c0 74 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74  ts5IdxSelectStmt
1b4d0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
1b4e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b4f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  K ){.          u
1b500 38 20 61 42 6c 6f 62 5b 32 5d 20 3d 20 7b 30 78  8 aBlob[2] = {0x
1b510 66 66 2c 20 30 78 66 66 7d 3b 0a 20 20 20 20 20  ff, 0xff};.     
1b520 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1b530 64 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74  d_int(pIdxSelect
1b540 2c 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20  , 1, iSegid);.  
1b550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b560 62 69 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53 65  bind_blob(pIdxSe
1b570 6c 65 63 74 2c 20 32 2c 20 61 42 6c 6f 62 2c 20  lect, 2, aBlob, 
1b580 32 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  2, SQLITE_STATIC
1b590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1b5a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ert( sqlite3_ste
1b5b0 70 28 70 49 64 78 53 65 6c 65 63 74 29 21 3d 53  p(pIdxSelect)!=S
1b5c0 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20  QLITE_ROW );.   
1b5d0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
1b5e0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 64  qlite3_reset(pId
1b5f0 78 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  xSelect);.      
1b600 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
1b610 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
1b620 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d  return iSegid;.}
1b630 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
1b640 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e 74  all data current
1b650 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74 68 65  ly cached in the
1b660 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f   hash-tables..*/
1b670 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b680 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
1b690 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  a(Fts5Index *p){
1b6a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48  .  assert( p->pH
1b6b0 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69  ash || p->nPendi
1b6c0 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69  ngData==0 );.  i
1b6d0 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20  f( p->pHash ){. 
1b6e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
1b6f0 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73 68  shClear(p->pHash
1b700 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
1b710 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a  ngData = 0;.  }.
1b720 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b730 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1b740 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73  prefix, in bytes
1b750 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 0a 2a  , that buffer .*
1b760 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d  * (pNew/<length-
1b770 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61 72 65 73  unknown>) shares
1b780 20 77 69 74 68 20 62 75 66 66 65 72 20 28 70 4f   with buffer (pO
1b790 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a 2a 2a 20  ld/nOld)..**.** 
1b7a0 42 75 66 66 65 72 20 28 70 4e 65 77 2f 3c 6c 65  Buffer (pNew/<le
1b7b0 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 69  ngth-unknown>) i
1b7c0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1b7d0 62 65 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 74  be greater .** t
1b7e0 68 61 6e 20 62 75 66 66 65 72 20 28 70 4f 6c 64  han buffer (pOld
1b7f0 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  /nOld)..*/.stati
1b800 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78  c int fts5Prefix
1b810 43 6f 6d 70 72 65 73 73 28 69 6e 74 20 6e 4f 6c  Compress(int nOl
1b820 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c  d, const u8 *pOl
1b830 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65  d, const u8 *pNe
1b840 77 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  w){.  int i;.  f
1b850 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
1b860 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  i++){.    if( pO
1b870 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29  ld[i]!=pNew[i] )
1b880 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
1b890 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69  turn i;.}..stati
1b8a0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1b8b0 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46 74  DlidxClear(.  Ft
1b8c0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1b8d0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1b8e0 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c  riter,.  int bFl
1b8f0 75 73 68 20 20 20 20 20 20 20 20 20 20 20 20 20  ush             
1b900 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1b910 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64 78  rue, write dlidx
1b920 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20   to disk */.){. 
1b930 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b940 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28  ( bFlush==0 || (
1b950 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e  pWriter->nDlidx>
1b960 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44  0 && pWriter->aD
1b970 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29  lidx[0].buf.n>0)
1b980 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1b990 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  <pWriter->nDlidx
1b9a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
1b9b0 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c  DlidxWriter *pDl
1b9c0 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1b9d0 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69  aDlidx[i];.    i
1b9e0 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  f( pDlidx->buf.n
1b9f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
1ba00 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a 20   if( bFlush ){. 
1ba10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c       assert( pDl
1ba20 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a  idx->pgno!=0 );.
1ba30 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
1ba40 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ite(p, .        
1ba50 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
1ba60 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67  ID(pWriter->iSeg
1ba70 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70  id, i, pDlidx->p
1ba80 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  gno),.          
1ba90 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70  pDlidx->buf.p, p
1baa0 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20  Dlidx->buf.n.   
1bab0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
1bac0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1bad0 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62  rZero(&pDlidx->b
1bae0 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d  uf);.    pDlidx-
1baf0 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b  >bPrevValid = 0;
1bb00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72  .  }.}../*.** Gr
1bb10 6f 77 20 74 68 65 20 70 57 72 69 74 65 72 2d 3e  ow the pWriter->
1bb20 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 74  aDlidx[] array t
1bb30 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20  o at least nLvl 
1bb40 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65  elements in size
1bb50 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72 72  ..** Any new arr
1bb60 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20  ay elements are 
1bb70 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65  zeroed before re
1bb80 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1bb90 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65  ic int fts5Write
1bba0 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74 73  DlidxGrow(.  Fts
1bbb0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
1bbc0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1bbd0 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a  ter,.  int nLvl.
1bbe0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
1bbf0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76  SQLITE_OK && nLv
1bc00 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  l>=pWriter->nDli
1bc10 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  dx ){.    Fts5Dl
1bc20 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64  idxWriter *aDlid
1bc30 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57 72  x = (Fts5DlidxWr
1bc40 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65  iter*)sqlite3_re
1bc50 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
1bc60 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c 20  Writer->aDlidx, 
1bc70 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
1bc80 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a 20  Writer) * nLvl. 
1bc90 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61 44     );.    if( aD
1bca0 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lidx==0 ){.     
1bcb0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1bcc0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
1bcd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
1bce0 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44  e = sizeof(Fts5D
1bcf0 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 28 6e  lidxWriter) * (n
1bd00 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e  Lvl - pWriter->n
1bd10 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d 65  Dlidx);.      me
1bd20 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57 72  mset(&aDlidx[pWr
1bd30 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30  iter->nDlidx], 0
1bd40 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
1bd50 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 20  pWriter->aDlidx 
1bd60 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20 20  = aDlidx;.      
1bd70 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20  pWriter->nDlidx 
1bd80 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20 20  = nLvl;.    }.  
1bd90 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  }.  return p->rc
1bda0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
1bdb0 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
1bdc0 74 2d 69 6e 64 65 78 20 61 63 63 75 6d 75 6c 61  t-index accumula
1bdd0 74 69 6e 67 20 69 6e 20 70 57 72 69 74 65 72 2d  ting in pWriter-
1bde0 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61 72  >aDlidx[] is lar
1bdf0 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66 6c  ge.** enough, fl
1be00 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 20 61  ush it to disk a
1be10 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 4f 74 68  nd return 1. Oth
1be20 65 72 77 69 73 65 20 64 69 73 63 61 72 64 20 69  erwise discard i
1be30 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  t and return.** 
1be40 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
1be50 69 6e 74 20 66 74 73 35 57 72 69 74 65 46 6c 75  int fts5WriteFlu
1be60 73 68 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65  shDlidx(Fts5Inde
1be70 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
1be80 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
1be90 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a   int bFlag = 0;.
1bea0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
1beb0 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ere FTS5_MIN_DLI
1bec0 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65 20  DX_SIZE or more 
1bed0 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65 73  empty leaf pages
1bee0 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
1bef0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
1bf00 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 64 6f  lso write the do
1bf10 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f 20 64  clist-index to d
1bf20 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  isk.  */.  if( p
1bf30 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1bf40 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70 57 72  ].buf.n>0 && pWr
1bf50 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54  iter->nEmpty>=FT
1bf60 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
1bf70 45 20 29 7b 0a 20 20 20 20 62 46 6c 61 67 20 3d  E ){.    bFlag =
1bf80 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57 72   1;.  }.  fts5Wr
1bf90 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70 2c  iteDlidxClear(p,
1bfa0 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67 29   pWriter, bFlag)
1bfb0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  ;.  pWriter->nEm
1bfc0 70 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pty = 0;.  retur
1bfd0 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n bFlag;.}../*.*
1bfe0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1bff0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
1c000 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  er processing of
1c010 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
1c020 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74 65   the .** last te
1c030 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20  rm on leaf page 
1c040 28 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67  (pWriter->iBtPag
1c050 65 29 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  e) is completed.
1c060 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63 6c   .**.** The docl
1c070 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68  ist-index for th
1c080 61 74 20 74 65 72 6d 20 69 73 20 63 75 72 72 65  at term is curre
1c090 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d 6d  ntly stored in-m
1c0a0 65 6d 6f 72 79 20 77 69 74 68 69 6e 20 74 68 65  emory within the
1c0b0 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74 65  .** Fts5SegWrite
1c0c0 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79  r.aDlidx[] array
1c0d0 2e 20 49 66 20 69 74 20 69 73 20 6c 61 72 67 65  . If it is large
1c0e0 20 65 6e 6f 75 67 68 2c 20 74 68 69 73 20 66 75   enough, this fu
1c0f0 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65 73  nction.** writes
1c100 20 69 74 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e   it out to disk.
1c110 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 74 6f   Or, if it is to
1c120 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68 65  o small to bothe
1c130 72 20 77 69 74 68 2c 20 64 69 73 63 61 72 64 73  r with, discards
1c140 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74  .** it..**.** Ft
1c150 73 35 53 65 67 57 72 69 74 65 72 2e 62 74 74 65  s5SegWriter.btte
1c160 72 6d 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  rm currently con
1c170 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20  tains the first 
1c180 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 69 42 74  term on page iBt
1c190 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
1c1a0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c  void fts5WriteFl
1c1b0 75 73 68 42 74 72 65 65 28 46 74 73 35 49 6e 64  ushBtree(Fts5Ind
1c1c0 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
1c1d0 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
1c1e0 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20 20    int bFlag;..  
1c1f0 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d  assert( pWriter-
1c200 3e 69 42 74 50 61 67 65 20 7c 7c 20 70 57 72 69  >iBtPage || pWri
1c210 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20 29  ter->nEmpty==0 )
1c220 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ;.  if( pWriter-
1c230 3e 69 42 74 50 61 67 65 3d 3d 30 20 29 20 72 65  >iBtPage==0 ) re
1c240 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d 20  turn;.  bFlag = 
1c250 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c  fts5WriteFlushDl
1c260 69 64 78 28 70 2c 20 70 57 72 69 74 65 72 29 3b  idx(p, pWriter);
1c270 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
1c280 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c290 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1c2a0 28 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  (pWriter->btterm
1c2b0 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61 72  .n>0?(const char
1c2c0 2a 29 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72  *)pWriter->btter
1c2d0 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a 20  m.p:"");.    /* 
1c2e0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61  The following wa
1c2f0 73 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 69  s already done i
1c300 6e 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  n fts5WriteInit(
1c310 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c  ): */.    /* sql
1c320 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
1c330 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20  >pIdxWriter, 1, 
1c340 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29  pWriter->iSegid)
1c350 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
1c360 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49  _bind_blob(p->pI
1c370 64 78 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c 20  dxWriter, 2, z, 
1c380 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e  pWriter->btterm.
1c390 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
1c3a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
1c3b0 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49 64  ind_int64(p->pId
1c3c0 78 57 72 69 74 65 72 2c 20 33 2c 20 62 46 6c 61  xWriter, 3, bFla
1c3d0 67 20 2b 20 28 28 69 36 34 29 70 57 72 69 74 65  g + ((i64)pWrite
1c3e0 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29 29 3b  r->iBtPage<<1));
1c3f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
1c400 70 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29  p(p->pIdxWriter)
1c410 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  ;.    p->rc = sq
1c420 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
1c430 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  IdxWriter);.  }.
1c440 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61    pWriter->iBtPa
1c450 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge = 0;.}../*.**
1c460 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
1c470 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c 65  once for each le
1c480 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20 74  af page except t
1c490 68 65 20 66 69 72 73 74 20 74 68 61 74 20 63 6f  he first that co
1c4a0 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61  ntains.** at lea
1c4b0 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67  st one term. Arg
1c4c0 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65  ument (nTerm/pTe
1c4d0 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c 69 74  rm) is the split
1c4e0 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20 74 68  -key - a term th
1c4f0 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20  at.** is larger 
1c500 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77  than all terms w
1c510 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c 69 65  ritten to earlie
1c520 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 65 71  r leaves, and eq
1c530 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61  ual to or.** sma
1c540 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 66 69  ller than the fi
1c550 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  rst term on the 
1c560 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20  new leaf..**.** 
1c570 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1c580 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1c590 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73  e is left in Fts
1c5a0 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61 6e  5Index.rc. If an
1c5b0 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c   error.** has al
1c5c0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
1c5d0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1c5e0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
1c5f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1c600 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1c610 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 0a 20  riteBtreeTerm(. 
1c620 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c640 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1c650 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1c660 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1c670 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
1c680 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
1c690 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f  .  int nTerm, co
1c6a0 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 20 20  nst u8 *pTerm   
1c6b0 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d     /* First term
1c6c0 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a   on new page */.
1c6d0 29 7b 0a 20 20 66 74 73 35 57 72 69 74 65 46 6c  ){.  fts5WriteFl
1c6e0 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69  ushBtree(p, pWri
1c6f0 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66  ter);.  fts5Buff
1c700 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1c710 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20  Writer->btterm, 
1c720 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1c730 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
1c740 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77 72 69  e = pWriter->wri
1c750 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ter.pgno;.}../*.
1c760 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c770 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1c780 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20  flushing a leaf 
1c790 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1c7a0 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61  ns no.** terms a
1c7b0 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a  t all to disk..*
1c7c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1c7d0 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
1c7e0 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rm(.  Fts5Index 
1c7f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1c800 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1c810 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1c820 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1c830 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20  *pWriter        
1c840 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
1c850 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  ct */.){.  /* If
1c860 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72   there were no r
1c870 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61  owids on the lea
1c880 66 20 70 61 67 65 20 65 69 74 68 65 72 20 61 6e  f page either an
1c890 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  d the doclist-in
1c8a0 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72  dex.  ** has alr
1c8b0 65 61 64 79 20 62 65 65 6e 20 73 74 61 72 74 65  eady been starte
1c8c0 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30  d, append an 0x0
1c8d0 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a  0 byte to it.  *
1c8e0 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
1c8f0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
1c900 67 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  ge && pWriter->a
1c910 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
1c920 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64   ){.    Fts5Dlid
1c930 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
1c940 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
1c950 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  dx[0];.    asser
1c960 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76  t( pDlidx->bPrev
1c970 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c  Valid );.    sql
1c980 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1c990 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1c9a0 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
1c9b0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
1c9c0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75  ncrement the "nu
1c9d0 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69  mber of sequenti
1c9e0 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75  al leaves withou
1c9f0 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65  t a term" counte
1ca00 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  r. */.  pWriter-
1ca10 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74  >nEmpty++;.}..st
1ca20 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69  atic i64 fts5Dli
1ca30 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
1ca40 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a  wid(Fts5Buffer *
1ca50 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f  pBuf){.  i64 iRo
1ca60 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  wid;.  int iOff;
1ca70 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 66  ..  iOff = 1 + f
1ca80 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
1ca90 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29  uf->p[1], (u64*)
1caa0 26 69 52 6f 77 69 64 29 3b 0a 20 20 66 74 73 35  &iRowid);.  fts5
1cab0 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  GetVarint(&pBuf-
1cac0 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
1cad0 26 69 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75  &iRowid);.  retu
1cae0 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  rn iRowid;.}../*
1caf0 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77 69 64  .** Rowid iRowid
1cb00 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
1cb10 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
1cb20 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
1cb30 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 66  . It is the.** f
1cb40 69 72 73 74 20 6f 6e 20 74 68 65 20 70 61 67 65  irst on the page
1cb50 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1cb60 61 70 70 65 6e 64 73 20 61 6e 20 61 70 70 72 6f  appends an appro
1cb70 70 72 69 61 74 65 20 65 6e 74 72 79 20 74 6f 20  priate entry to 
1cb80 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
1cb90 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f  oclist-index..*/
1cba0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1cbb0 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e  5WriteDlidxAppen
1cbc0 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
1cbd0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1cbe0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20  ter *pWriter, . 
1cbf0 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20   i64 iRowid.){. 
1cc00 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44   int i;.  int bD
1cc10 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  one = 0;..  for(
1cc20 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
1cc30 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d  TE_OK && bDone==
1cc40 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34  0; i++){.    i64
1cc50 20 69 56 61 6c 3b 0a 20 20 20 20 46 74 73 35 44   iVal;.    Fts5D
1cc60 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
1cc70 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
1cc80 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69  Dlidx[i];..    i
1cc90 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  f( pDlidx->buf.n
1cca0 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  >=p->pConfig->pg
1ccb0 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  sz ){.      /* T
1ccc0 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
1ccd0 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73  st-index page is
1cce0 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20   full. Write it 
1ccf0 74 6f 20 64 69 73 6b 20 61 6e 64 20 70 75 73 68  to disk and push
1cd00 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79  .      ** a copy
1cd10 20 6f 66 20 69 52 6f 77 69 64 20 28 77 68 69 63   of iRowid (whic
1cd20 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  h will become th
1cd30 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1cd40 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20   the next.      
1cd50 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
1cd60 20 6c 65 61 66 20 70 61 67 65 29 20 75 70 20 69   leaf page) up i
1cd70 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 76  nto the next lev
1cd80 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  el of the b-tree
1cd90 20 0a 20 20 20 20 20 20 2a 2a 20 68 69 65 72 61   .      ** hiera
1cda0 72 63 68 79 2e 20 49 66 20 74 68 65 20 6e 6f 64  rchy. If the nod
1cdb0 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65 64 20  e being flushed 
1cdc0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
1cdd0 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20   root node,.    
1cde0 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20 69    ** also push i
1cdf0 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75  ts first rowid u
1ce00 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20  pwards. */.     
1ce10 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30   pDlidx->buf.p[0
1ce20 5d 20 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a 20  ] = 0x01;    /* 
1ce30 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  Not the root nod
1ce40 65 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44  e */.      fts5D
1ce50 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20  ataWrite(p, .   
1ce60 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44         FTS5_DLID
1ce70 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  X_ROWID(pWriter-
1ce80 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69  >iSegid, i, pDli
1ce90 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20  dx->pgno),.     
1cea0 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66       pDlidx->buf
1ceb0 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  .p, pDlidx->buf.
1cec0 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  n.      );.     
1ced0 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47   fts5WriteDlidxG
1cee0 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20  row(p, pWriter, 
1cef0 69 2b 32 29 3b 0a 20 20 20 20 20 20 70 44 6c 69  i+2);.      pDli
1cf00 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
1cf10 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20  Dlidx[i];.      
1cf20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1cf30 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b 31  E_OK && pDlidx[1
1cf40 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20  ].buf.n==0 ){.  
1cf50 20 20 20 20 20 20 69 36 34 20 69 46 69 72 73 74        i64 iFirst
1cf60 20 3d 20 66 74 73 35 44 6c 69 64 78 45 78 74 72   = fts5DlidxExtr
1cf70 61 63 74 46 69 72 73 74 52 6f 77 69 64 28 26 70  actFirstRowid(&p
1cf80 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20  Dlidx->buf);..  
1cf90 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 77 61        /* This wa
1cfa0 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  s the root node.
1cfb0 20 50 75 73 68 20 69 74 73 20 66 69 72 73 74 20   Push its first 
1cfc0 72 6f 77 69 64 20 75 70 20 74 6f 20 74 68 65 20  rowid up to the 
1cfd0 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20  new root. */.   
1cfe0 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70       pDlidx[1].p
1cff0 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67  gno = pDlidx->pg
1d000 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  no;.        sqli
1d010 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1d020 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d030 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  , &pDlidx[1].buf
1d040 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
1d050 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1d060 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1d070 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
1d080 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f  uf, pDlidx->pgno
1d090 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d0a0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1d0b0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1d0c0 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c   &pDlidx[1].buf,
1d0d0 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20   iFirst);.      
1d0e0 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65    pDlidx[1].bPre
1d0f0 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  vValid = 1;.    
1d100 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50      pDlidx[1].iP
1d110 72 65 76 20 3d 20 69 46 69 72 73 74 3b 0a 20 20  rev = iFirst;.  
1d120 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
1d130 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65  ite3Fts5BufferZe
1d140 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29  ro(&pDlidx->buf)
1d150 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e  ;.      pDlidx->
1d160 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a  bPrevValid = 0;.
1d170 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 70 67        pDlidx->pg
1d180 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no++;.    }else{
1d190 0a 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31  .      bDone = 1
1d1a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1d1b0 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
1d1c0 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69 56 61  lid ){.      iVa
1d1d0 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20 70 44 6c  l = iRowid - pDl
1d1e0 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20  idx->iPrev;.    
1d1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34  }else{.      i64
1d200 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f   iPgno = (i==0 ?
1d210 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1d220 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d  .pgno : pDlidx[-
1d230 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  1].pgno);.      
1d240 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e  assert( pDlidx->
1d250 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  buf.n==0 );.    
1d260 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d270 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d280 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
1d290 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20  >buf, !bDone);. 
1d2a0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d2b0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1d2c0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1d2d0 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b  dx->buf, iPgno);
1d2e0 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52  .      iVal = iR
1d2f0 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  owid;.    }..   
1d300 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d310 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d320 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
1d330 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  buf, iVal);.    
1d340 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
1d350 69 64 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69  id = 1;.    pDli
1d360 64 78 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f 77  dx->iPrev = iRow
1d370 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  id;.  }.}..stati
1d380 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1d390 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e  FlushLeaf(Fts5In
1d3a0 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
1d3b0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
1d3c0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1d3d0 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78  u8 zero[] = { 0x
1d3e0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  00, 0x00, 0x00, 
1d3f0 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61  0x00 };.  Fts5Pa
1d400 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1d410 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1d420 65 72 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  er;.  i64 iRowid
1d430 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 43  ;..static int nC
1d440 61 6c 6c 20 3d 20 30 3b 0a 6e 43 61 6c 6c 2b 2b  all = 0;.nCall++
1d450 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  ;..  assert( (pP
1d460 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 29  age->pgidx.n==0)
1d470 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62 46 69 72  ==(pWriter->bFir
1d480 73 74 54 65 72 6d 49 6e 50 61 67 65 29 20 29 3b  stTermInPage) );
1d490 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73  ..  /* Set the s
1d4a0 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65  zLeaf header fie
1d4b0 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ld. */.  assert(
1d4c0 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26   0==fts5GetU16(&
1d4d0 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29  pPage->buf.p[2])
1d4e0 20 29 3b 0a 20 20 66 74 73 35 50 75 74 55 31 36   );.  fts5PutU16
1d4f0 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32  (&pPage->buf.p[2
1d500 5d 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62  ], (u16)pPage->b
1d510 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57  uf.n);..  if( pW
1d520 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1d530 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  mInPage ){.    /
1d540 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72  * No term was wr
1d550 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61  itten to this pa
1d560 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
1d570 74 28 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  t( pPage->pgidx.
1d580 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  n==0 );.    fts5
1d590 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d  WriteBtreeNoTerm
1d5a0 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1d5b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70  }else{.    /* Ap
1d5c0 70 65 6e 64 20 74 68 65 20 70 67 69 64 78 20 74  pend the pgidx t
1d5d0 6f 20 74 68 65 20 70 61 67 65 20 62 75 66 66 65  o the page buffe
1d5e0 72 2e 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  r. Set the szLea
1d5f0 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20  f header field. 
1d600 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  */.    fts5Buffe
1d610 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1d620 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1d630 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c   pPage->pgidx.n,
1d640 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 70 29   pPage->pgidx.p)
1d650 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1d660 65 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  e the page out t
1d670 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77  o disk */.  iRow
1d680 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1d690 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  T_ROWID(pWriter-
1d6a0 3e 69 53 65 67 69 64 2c 20 70 50 61 67 65 2d 3e  >iSegid, pPage->
1d6b0 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74  pgno);.  fts5Dat
1d6c0 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64  aWrite(p, iRowid
1d6d0 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20  , pPage->buf.p, 
1d6e0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a  pPage->buf.n);..
1d6f0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1d700 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a  the next page. *
1d710 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  /.  fts5BufferZe
1d720 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b  ro(&pPage->buf);
1d730 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
1d740 6f 28 26 70 50 61 67 65 2d 3e 70 67 69 64 78 29  o(&pPage->pgidx)
1d750 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
1d760 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1d770 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c   &pPage->buf, 4,
1d780 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d   zero);.  pPage-
1d790 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 30 3b  >iPrevPgidx = 0;
1d7a0 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b  .  pPage->pgno++
1d7b0 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65  ;..  /* Increase
1d7c0 20 74 68 65 20 6c 65 61 76 65 73 20 77 72 69 74   the leaves writ
1d7d0 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ten counter */. 
1d7e0 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57   pWriter->nLeafW
1d7f0 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20  ritten++;..  /* 
1d800 54 68 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c  The new leaf hol
1d810 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72  ds no terms or r
1d820 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57 72 69 74  owids */.  pWrit
1d830 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1d840 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69  Page = 1;.  pWri
1d850 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1d860 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f  InPage = 1;.}../
1d870 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 72 6d  *.** Append term
1d880 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20   pTerm/nTerm to 
1d890 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e  the segment bein
1d8a0 67 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 65  g written by the
1d8b0 20 77 72 69 74 65 72 20 70 61 73 73 65 64 0a 2a   writer passed.*
1d8c0 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
1d8d0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
1d8e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1d8f0 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
1d900 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
1d910 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
1d920 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
1d930 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1d940 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1d950 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1d960 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
1d970 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73 35 49  endTerm(.  Fts5I
1d980 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1d990 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1d9a0 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c  er,.  int nTerm,
1d9b0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
1d9c0 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66   .){.  int nPref
1d9d0 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
1d9e0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1d9f0 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65  of prefix compre
1da00 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a  ssion for term *
1da10 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  /.  Fts5PageWrit
1da20 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
1da30 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
1da40 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67 69  Fts5Buffer *pPgi
1da50 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  dx = &pWriter->w
1da60 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20  riter.pgidx;..  
1da70 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
1da80 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
1da90 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66  sert( pPage->buf
1daa0 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  .n>=4 );.  asser
1dab0 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  t( pPage->buf.n>
1dac0 34 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  4 || pWriter->bF
1dad0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
1dae0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1daf0 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
1db00 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20   is full, flush 
1db10 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20  it to disk. */. 
1db20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66   if( (pPage->buf
1db30 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  .n + pPgidx->n +
1db40 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e   nTerm + 2)>=p->
1db50 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
1db60 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1db70 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20  buf.n>4 ){.     
1db80 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1db90 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1dba0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
1dbb0 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
1dbc0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1dbd0 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50  Term+FTS5_DATA_P
1dbe0 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a  ADDING);.  }.  .
1dbf0 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61    /* TODO1: Upda
1dc00 74 69 6e 67 20 70 67 69 64 78 20 68 65 72 65 2e  ting pgidx here.
1dc10 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20   */.  pPgidx->n 
1dc20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
1dc30 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20 26  tVarint(.      &
1dc40 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78  pPgidx->p[pPgidx
1dc50 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  ->n], pPage->buf
1dc60 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50 72 65  .n - pPage->iPre
1dc70 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20 70 50  vPgidx.  );.  pP
1dc80 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20  age->iPrevPgidx 
1dc90 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a  = pPage->buf.n;.
1dca0 23 69 66 20 30 0a 20 20 66 74 73 35 50 75 74 55  #if 0.  fts5PutU
1dcb0 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b 70 50  16(&pPgidx->p[pP
1dcc0 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d  gidx->n], pPage-
1dcd0 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64  >buf.n);.  pPgid
1dce0 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69  x->n += 2;.#endi
1dcf0 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  f..  if( pWriter
1dd00 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1dd10 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65 66 69  ge ){.    nPrefi
1dd20 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
1dd30 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  Page->pgno!=1 ){
1dd40 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
1dd50 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1dd60 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20   on a leaf that 
1dd70 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d  is not the leftm
1dd80 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20  ost leaf in.    
1dd90 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74    ** the segment
1dda0 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73   b-tree. In this
1ddb0 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65   case it is nece
1ddc0 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74  ssary to add a t
1ddd0 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  erm to.      ** 
1dde0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
1ddf0 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29  rchy that is (a)
1de00 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1de10 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20   largest term . 
1de20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
1de30 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
1de40 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73  egment and (b) s
1de50 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65  maller than or e
1de60 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  qual to.      **
1de70 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f   this term. In o
1de80 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72  ther words, a pr
1de90 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e  efix of (pTerm/n
1dea0 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e  Term) that is on
1deb0 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
1dec0 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
1ded0 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28  longest prefix (
1dee0 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61  pTerm/nTerm) sha
1def0 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  res with the.   
1df00 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74     ** previous t
1df10 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  erm. .      **. 
1df20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c       ** Usually,
1df30 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
1df40 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  rm is available 
1df50 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20  in pPage->term. 
1df60 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  The exception.  
1df70 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69      ** is if thi
1df80 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1df90 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61  erm written in a
1dfa0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
1dfb0 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20  rge step..      
1dfc0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
1dfd0 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
1dfe0 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  m is not availab
1dff0 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74  le, so just writ
1e000 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
1e010 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  y of (pTerm/nTer
1e020 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  m) into the pare
1e030 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  nt node. This is
1e040 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
1e050 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20  ** inefficient, 
1e060 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63  but still correc
1e070 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  t.  */.      int
1e080 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
1e090 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
1e0a0 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  m.n ){.        n
1e0b0 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69   = 1 + fts5Prefi
1e0c0 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
1e0d0 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
1e0e0 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a  term.p, pTerm);.
1e0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1e100 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
1e110 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e 2c 20  (p, pWriter, n, 
1e120 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 50  pTerm);.      pP
1e130 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
1e140 77 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  writer;.    }.  
1e150 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66  }else{.    nPref
1e160 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  ix = fts5PrefixC
1e170 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74  ompress(pPage->t
1e180 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65  erm.n, pPage->te
1e190 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20  rm.p, pTerm);.  
1e1a0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1e1b0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1e1c0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50   &pPage->buf, nP
1e1d0 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  refix);.  }..  /
1e1e0 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d  * Append the num
1e1f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1e200 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74  new data, then t
1e210 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74 73  he term data its
1e220 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  elf.  ** to the 
1e230 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42  page. */.  fts5B
1e240 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1e250 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
1e260 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
1e270 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42  Prefix);.  fts5B
1e280 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1e290 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1e2a0 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
1e2b0 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72  efix, &pTerm[nPr
1e2c0 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70  efix]);..  /* Up
1e2d0 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61 67  date the Fts5Pag
1e2e0 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65  eWriter.term fie
1e2f0 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ld. */.  fts5Buf
1e300 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
1e310 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65  pPage->term, nTe
1e320 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57  rm, pTerm);.  pW
1e330 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1e340 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  mInPage = 0;..  
1e350 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1e360 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
1e370 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1e380 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
1e390 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
1e3a0 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65  p->rc || (pWrite
1e3b0 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70  r->nDlidx>0 && p
1e3c0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1e3d0 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20  ].buf.n==0) );. 
1e3e0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1e3f0 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65  [0].pgno = pPage
1e400 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
1e410 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69 64 20   Append a rowid 
1e420 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  and position-lis
1e430 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20  t size field to 
1e440 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74 70  the writers outp
1e450 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ut. .*/.static v
1e460 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
1e470 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35  endRowid(.  Fts5
1e480 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1e490 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1e4a0 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69  ter,.  i64 iRowi
1e4b0 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  d.){.  if( p->rc
1e4c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e4d0 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
1e4e0 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
1e4f0 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20  ter->writer;..  
1e500 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75    if( (pPage->bu
1e510 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69  f.n + pPage->pgi
1e520 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69  dx.n)>=p->pConfi
1e530 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  g->pgsz ){.     
1e540 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1e550 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1e560 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1e570 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65 20  f this is to be 
1e580 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
1e590 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70  written to the p
1e5a0 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20  age, set the .  
1e5b0 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e 74    ** rowid-point
1e5c0 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68  er in the page-h
1e5d0 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65  eader. Also appe
1e5e0 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68  nd a value to th
1e5f0 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62  e dlidx.    ** b
1e600 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61  uffer, in case a
1e610 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
1e620 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
1e630 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
1e640 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
1e650 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ge ){.      fts5
1e660 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75  PutU16(pPage->bu
1e670 66 2e 70 2c 20 28 75 31 36 29 70 50 61 67 65 2d  f.p, (u16)pPage-
1e680 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66  >buf.n);.      f
1e690 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
1e6a0 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20  end(p, pWriter, 
1e6b0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iRowid);.    }..
1e6c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1e6d0 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 69   rowid. */.    i
1e6e0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
1e6f0 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
1e700 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69   || pWriter->bFi
1e710 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
1e720 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
1e730 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1e740 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1e750 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  uf, iRowid);.   
1e760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1e770 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69  sert( p->rc || i
1e780 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69  Rowid>pWriter->i
1e790 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20  PrevRowid );.   
1e7a0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1e7b0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1e7c0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69  , &pPage->buf, i
1e7d0 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d  Rowid - pWriter-
1e7e0 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20  >iPrevRowid);.  
1e7f0 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d    }.    pWriter-
1e800 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52  >iPrevRowid = iR
1e810 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65  owid;.    pWrite
1e820 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1e830 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Doclist = 0;.   
1e840 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1e850 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
1e860 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
1e870 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
1e880 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a  endPoslistData(.
1e890 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1e8a0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1e8b0 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f   *pWriter, .  co
1e8c0 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a  nst u8 *aData, .
1e8d0 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20    int nData.){. 
1e8e0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
1e8f0 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
1e900 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e  r->writer;.  con
1e910 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61  st u8 *a = aData
1e920 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74  ;.  int n = nDat
1e930 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  a;.  .  assert( 
1e940 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1e950 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  >0 );.  while( p
1e960 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1e970 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65 2d  .     && (pPage-
1e980 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e  >buf.n + pPage->
1e990 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d  pgidx.n + n)>=p-
1e9a0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a  >pConfig->pgsz .
1e9b0 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65    ){.    int nRe
1e9c0 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  q = p->pConfig->
1e9d0 70 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75  pgsz - pPage->bu
1e9e0 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69  f.n - pPage->pgi
1e9f0 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43  dx.n;.    int nC
1ea00 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  opy = 0;.    whi
1ea10 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29  le( nCopy<nReq )
1ea20 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d  {.      i64 dumm
1ea30 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b  y;.      nCopy +
1ea40 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
1ea50 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a  &a[nCopy], (u64*
1ea60 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a  )&dummy);.    }.
1ea70 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1ea80 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1ea90 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43   &pPage->buf, nC
1eaa0 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b  opy, a);.    a +
1eab0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d  = nCopy;.    n -
1eac0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73  = nCopy;.    fts
1ead0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1eae0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d  p, pWriter);.  }
1eaf0 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
1eb00 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1eb10 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1eb20 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61  pPage->buf, n, a
1eb30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1eb40 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63  Flush any data c
1eb50 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69  ached by the wri
1eb60 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ter object to th
1eb70 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65  e database. Free
1eb80 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   any.** allocati
1eb90 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
1eba0 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a  ith the writer..
1ebb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1ebc0 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a  ts5WriteFinish(.
1ebd0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1ebe0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1ebf0 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
1ec00 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
1ec10 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ect */.  int *pn
1ec20 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
1ec30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1ec40 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
1ec50 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20  pages in b-tree 
1ec60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1ec70 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
1ec80 2a 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65  *pLeaf = &pWrite
1ec90 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28  r->writer;.  if(
1eca0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ecb0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1ecc0 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20   pLeaf->pgno>=1 
1ecd0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
1ece0 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20  ->buf.n>4 ){.   
1ecf0 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1ed00 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
1ed10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  );.    }.    *pn
1ed20 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67  Leaf = pLeaf->pg
1ed30 6e 6f 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4c  no-1;.    if( pL
1ed40 65 61 66 2d 3e 70 67 6e 6f 3e 31 20 29 7b 0a 20  eaf->pgno>1 ){. 
1ed50 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
1ed60 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69  ushBtree(p, pWri
1ed70 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
1ed80 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1ed90 28 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a  (&pLeaf->term);.
1eda0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1edb0 28 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20  (&pLeaf->buf);. 
1edc0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1edd0 26 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a  &pLeaf->pgidx);.
1ede0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1edf0 28 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72  (&pWriter->btter
1ee00 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  m);..  for(i=0; 
1ee10 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
1ee20 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  x; i++){.    sql
1ee30 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
1ee40 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c  ee(&pWriter->aDl
1ee50 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d  idx[i].buf);.  }
1ee60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1ee70 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29  pWriter->aDlidx)
1ee80 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1ee90 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a   fts5WriteInit(.
1eea0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1eeb0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1eec0 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e   *pWriter, .  in
1eed0 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f  t iSegid.){.  co
1eee0 6e 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72 20  nst int nBuffer 
1eef0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
1ef00 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  sz + FTS5_DATA_P
1ef10 41 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65  ADDING;..  memse
1ef20 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69  t(pWriter, 0, si
1ef30 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74  zeof(Fts5SegWrit
1ef40 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  er));.  pWriter-
1ef50 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1ef60 3b 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c  ;..  fts5WriteDl
1ef70 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74  idxGrow(p, pWrit
1ef80 65 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65  er, 1);.  pWrite
1ef90 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d  r->writer.pgno =
1efa0 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
1efb0 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
1efc0 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
1efd0 69 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20  iBtPage = 1;..  
1efe0 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d  assert( pWriter-
1eff0 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30  >writer.buf.n==0
1f000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
1f010 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67  riter->writer.pg
1f020 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f  idx.n==0 );..  /
1f030 2a 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20 62  * Grow the two b
1f040 75 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20 2b  uffers to pgsz +
1f050 20 70 61 64 64 69 6e 67 20 62 79 74 65 73 20 69   padding bytes i
1f060 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c  n size. */.  sql
1f070 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
1f080 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  ze(&p->rc, &pWri
1f090 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64  ter->writer.pgid
1f0a0 78 2c 20 6e 42 75 66 66 65 72 29 3b 0a 20 20 73  x, nBuffer);.  s
1f0b0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1f0c0 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57  Size(&p->rc, &pW
1f0d0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75  riter->writer.bu
1f0e0 66 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20  f, nBuffer);..  
1f0f0 69 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65  if( p->pIdxWrite
1f100 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  r==0 ){.    Fts5
1f110 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
1f120 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
1f130 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
1f140 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49  reStmt(p, &p->pI
1f150 64 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65  dxWriter, sqlite
1f160 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
1f170 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1f180 4f 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28  O '%q'.'%q_idx'(
1f190 73 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29  segid,term,pgno)
1f1a0 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c   VALUES(?,?,?)",
1f1b0 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
1f1c0 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
1f1d0 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
1f1e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
1f1f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f200 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1f210 65 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65 61  e the 4-byte lea
1f220 66 2d 70 61 67 65 20 68 65 61 64 65 72 20 74 6f  f-page header to
1f230 20 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65   0x00. */.    me
1f240 6d 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77 72  mset(pWriter->wr
1f250 69 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34  iter.buf.p, 0, 4
1f260 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  );.    pWriter->
1f270 77 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34  writer.buf.n = 4
1f280 3b 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20 74  ;..    /* Bind t
1f290 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75  he current outpu
1f2a0 74 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f 20  t segment id to 
1f2b0 74 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65 72  the index-writer
1f2c0 2e 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20 20  . This is an.   
1f2d0 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
1f2e0 20 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74 68   over binding th
1f2f0 65 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76 65  e same value ove
1f300 72 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72 6f  r and over as ro
1f310 77 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e  ws are.    ** in
1f320 73 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69 64  serted into %_id
1f330 78 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  x by the current
1f340 20 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20   writer.  */.   
1f350 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1f360 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c  t(p->pIdxWriter,
1f370 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65   1, pWriter->iSe
1f380 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gid);.  }.}../*.
1f390 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
1f3a0 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74  r was used to it
1f3b0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
1f3c0 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  e input segments
1f3d0 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63   of on an.** inc
1f3e0 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f  remental merge o
1f3f0 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66  peration. This f
1f400 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1f410 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65  d if the increme
1f420 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74  ntal.** merge st
1f430 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ep has finished 
1f440 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61  but the input ha
1f450 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c  s not been compl
1f460 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e  etely exhausted.
1f470 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f480 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
1f490 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
1f4a0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
1f4b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35  .  int i;.  Fts5
1f4c0 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65  Buffer buf;.  me
1f4d0 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
1f4e0 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
1f4f0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1f500 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b  pIter->nSeg; i++
1f510 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
1f520 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
1f530 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20  r->aSeg[i];.    
1f540 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d  if( pSeg->pSeg==
1f550 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  0 ){.      /* no
1f560 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  -op */.    }else
1f570 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
1f580 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1f590 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  All keys from th
1f5a0 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  is input segment
1f5b0 20 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e 73   have been trans
1f5c0 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75 74  fered to the out
1f5d0 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65  put..      ** Se
1f5e0 74 20 62 6f 74 68 20 74 68 65 20 66 69 72 73 74  t both the first
1f5f0 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d 6e   and last page-n
1f600 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20 69  umbers to 0 to i
1f610 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1f620 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
1f630 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20  t is now empty. 
1f640 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  */.      pSeg->p
1f650 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20  Seg->pgnoLast = 
1f660 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  0;.      pSeg->p
1f670 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
1f680 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1f690 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
1f6a0 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  pSeg->iTermLeafO
1f6b0 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66  ffset;     /* Of
1f6c0 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72 73  fset on new firs
1f6d0 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  t leaf page */. 
1f6e0 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52 6f       i64 iLeafRo
1f6f0 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35 44  wid;.      Fts5D
1f700 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
1f710 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67    int iId = pSeg
1f720 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
1f730 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34 5d        u8 aHdr[4]
1f740 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20   = {0x00, 0x00, 
1f750 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20 20  0x00, 0x00};..  
1f760 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20 3d      iLeafRowid =
1f770 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1f780 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d 3e 69  WID(iId, pSeg->i
1f790 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  TermLeafPgno);. 
1f7a0 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73       pData = fts
1f7b0 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c 65  5DataRead(p, iLe
1f7c0 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  afRowid);.      
1f7d0 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
1f7e0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
1f7f0 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20  ero(&buf);.     
1f800 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f     fts5BufferGro
1f810 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  w(&p->rc, &buf, 
1f820 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20  pData->nn);.    
1f830 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f840 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1f850 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48   &buf, sizeof(aH
1f860 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20  dr), aHdr);.    
1f870 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f880 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1f890 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74  c, &buf, pSeg->t
1f8a0 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  erm.n);.        
1f8b0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1f8c0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1f8d0 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c  f, pSeg->term.n,
1f8e0 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a   pSeg->term.p);.
1f8f0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f900 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1f910 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61  >rc, &buf, pData
1f920 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20 26  ->szLeaf-iOff, &
1f930 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b  pData->p[iOff]);
1f940 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1f950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f960 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  .          /* Se
1f970 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66 69 65  t the szLeaf fie
1f980 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ld */.          
1f990 66 74 73 35 50 75 74 55 31 36 28 26 62 75 66 2e  fts5PutU16(&buf.
1f9a0 70 5b 32 5d 2c 20 28 75 31 36 29 62 75 66 2e 6e  p[2], (u16)buf.n
1f9b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
1f9c0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20        /* Set up 
1f9d0 74 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e 64  the new page-ind
1f9e0 65 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  ex array */.    
1f9f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1fa00 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1fa10 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20 20  c, &buf, 4);.   
1fa20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69       if( pSeg->i
1fa30 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e  LeafPgno==pSeg->
1fa40 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20  iTermLeafPgno . 
1fa50 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67 2d          && pSeg-
1fa60 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70  >iEndofDoclist<p
1fa70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20 20  Data->szLeaf .  
1fa80 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1fa90 20 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20 70     int nDiff = p
1faa0 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70  Data->szLeaf - p
1fab0 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  Seg->iEndofDocli
1fac0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  st;.          ft
1fad0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1fae0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
1faf0 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e  f, buf.n - 1 - n
1fb00 44 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20  Diff - 4);.     
1fb10 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1fb20 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1fb30 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20 20  , &buf, .       
1fb40 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e         pData->nn
1fb50 20 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78 4f   - pSeg->iPgidxO
1fb60 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70 53  ff, &pData->p[pS
1fb70 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20  eg->iPgidxOff]. 
1fb80 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1fb90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
1fba0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
1fbb0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70  Data);.        p
1fbc0 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46  Seg->pSeg->pgnoF
1fbd0 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65  irst = pSeg->iTe
1fbe0 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20  rmLeafPgno;.    
1fbf0 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c 65      fts5DataDele
1fc00 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  te(p, FTS5_SEGME
1fc10 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31 29  NT_ROWID(iId, 1)
1fc20 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  , iLeafRowid);. 
1fc30 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57         fts5DataW
1fc40 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77  rite(p, iLeafRow
1fc50 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e  id, buf.p, buf.n
1fc60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1fc70 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
1fc80 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a  rFree(&buf);.}..
1fc90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1fca0 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61  MergeChunkCallba
1fcb0 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ck(.  Fts5Index 
1fcc0 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74  *p, .  void *pCt
1fcd0 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  x, .  const u8 *
1fce0 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75  pChunk, int nChu
1fcf0 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57  nk.){.  Fts5SegW
1fd00 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d  riter *pWriter =
1fd10 20 28 46 74 73 35 53 65 67 57 72 69 74 65 72 2a   (Fts5SegWriter*
1fd20 29 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69  )pCtx;.  fts5Wri
1fd30 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44  teAppendPoslistD
1fd40 61 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20  ata(p, pWriter, 
1fd50 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b  pChunk, nChunk);
1fd60 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61  .}../*.**.*/.sta
1fd70 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
1fd80 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20  exMergeLevel(.  
1fd90 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdb0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1fdc0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
1fdd0 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
1fde0 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
1fdf0 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20  N/OUT: Stucture 
1fe00 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
1fe10 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20  t iLvl,         
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe30 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69   Level to read i
1fe40 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  nput from */.  i
1fe50 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20  nt *pnRem       
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fe70 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 74 68  * Write up to th
1fe80 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c  is many output l
1fe90 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74  eaves */.){.  Ft
1fea0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1feb0 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
1fec0 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
1fed0 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
1fee0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1fef0 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72  iLvl];.  Fts5Str
1ff00 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
1ff10 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49 74 65 72  lOut;.  Fts5Iter
1ff20 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20   *pIter = 0;    
1ff30 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
1ff40 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74  o read input dat
1ff50 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20  a */.  int nRem 
1ff60 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d  = pnRem ? *pnRem
1ff70 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74   : 0;  /* Output
1ff80 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74   leaf pages left
1ff90 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
1ffa0 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20  nt nInput;      
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ffc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  * Number of inpu
1ffd0 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
1ffe0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
1fff0 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
20000 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
20010 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
20020 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
20030 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  ;     /* Output 
20040 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
20050 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20  5Buffer term;.  
20060 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20  int bOldest;    
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
20090 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73  utput segment is
200a0 20 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 20   the oldest */. 
200b0 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70   int eDetail = p
200c0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
200d0 69 6c 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  il;.  const int 
200e0 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45  flags = FTS5INDE
200f0 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54  X_QUERY_NOOUTPUT
20100 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
20110 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
20120 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
20130 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
20140 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65  l->nSeg );..  me
20150 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
20160 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
20170 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  riter));.  memse
20180 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65  t(&term, 0, size
20190 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
201a0 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65  .  if( pLvl->nMe
201b0 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f  rge ){.    pLvlO
201c0 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
201d0 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20  Level[iLvl+1];. 
201e0 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f     assert( pLvlO
201f0 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20  ut->nSeg>0 );.  
20200 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d    nInput = pLvl-
20210 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53 65  >nMerge;.    pSe
20220 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
20230 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
20240 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  -1];..    fts5Wr
20250 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74  iteInit(p, &writ
20260 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  er, pSeg->iSegid
20270 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77 72  );.    writer.wr
20280 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67  iter.pgno = pSeg
20290 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20  ->pgnoLast+1;.  
202a0 20 20 77 72 69 74 65 72 2e 69 42 74 50 61 67 65    writer.iBtPage
202b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
202c0 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
202d0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
202e0 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a  d(p, pStruct);..
202f0 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68      /* Extend th
20300 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e Fts5Structure 
20310 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72  object as requir
20320 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  ed to ensure the
20330 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73   output.    ** s
20340 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a  egment exists. *
20350 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d  /.    if( iLvl==
20360 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d  pStruct->nLevel-
20370 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  1 ){.      fts5S
20380 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
20390 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63  (&p->rc, ppStruc
203a0 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  t);.      pStruc
203b0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
203c0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
203d0 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
203e0 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
203f0 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29  t, iLvl+1, 1, 0)
20400 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
20410 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  ) return;.    pL
20420 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
20430 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
20440 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72   pLvlOut = &pStr
20450 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
20460 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  +1];..    fts5Wr
20470 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74  iteInit(p, &writ
20480 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20  er, iSegid);..  
20490 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
204a0 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20   segment to the 
204b0 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a  output level */.
204c0 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c      pSeg = &pLvl
204d0 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75  Out->aSeg[pLvlOu
204e0 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c  t->nSeg];.    pL
204f0 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20  vlOut->nSeg++;. 
20500 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
20510 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67  st = 1;.    pSeg
20520 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
20530 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e  d;.    pStruct->
20540 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20  nSegment++;..   
20550 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66   /* Read input f
20560 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rom all segments
20570 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65   in the input le
20580 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75  vel */.    nInpu
20590 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a  t = pLvl->nSeg;.
205a0 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20    }.  bOldest = 
205b0 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d  (pLvlOut->nSeg==
205c0 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c  1 && pStruct->nL
205d0 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a  evel==iLvl+2);..
205e0 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d    assert( iLvl>=
205f0 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d  0 );.  for(fts5M
20600 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
20610 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30  Struct, flags, 0
20620 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49  , 0, 0, iLvl, nI
20630 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20  nput, &pIter);. 
20640 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
20650 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
20660 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
20670 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
20680 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
20690 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
206a0 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70 49   *pSegIter = &pI
206b0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
206c0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
206d0 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50  st ];.    int nP
206e0 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
206f0 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74          /* posit
20700 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
20710 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  eld value */.   
20720 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20   int nTerm;.    
20730 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b  const u8 *pTerm;
20740 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
20750 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74  or key annihilat
20760 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
20770 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d  pSegIter->nPos==
20780 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c  0 && (bOldest ||
20790 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d   pSegIter->bDel=
207a0 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
207b0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73  .    pTerm = fts
207c0 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
207d0 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20  Iter, &nTerm);. 
207e0 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65     if( nTerm!=te
207f0 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  rm.n || memcmp(p
20800 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54  Term, term.p, nT
20810 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66  erm) ){.      if
20820 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65  ( pnRem && write
20830 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e  r.nLeafWritten>n
20840 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62  Rem ){.        b
20850 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
20860 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
20870 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65  a new term. Appe
20880 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  nd a term to the
20890 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
208a0 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72   */.      fts5Wr
208b0 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
208c0 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c   &writer, nTerm,
208d0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66   pTerm);.      f
208e0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
208f0 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72  >rc, &term, nTer
20900 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 7d  m, pTerm);.    }
20910 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
20920 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65  the rowid to the
20930 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f   output */.    /
20940 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
20950 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73 35 57 72  ZE */.    fts5Wr
20960 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70  iteAppendRowid(p
20970 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d  , &writer, fts5M
20980 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
20990 74 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20  ter));..    if( 
209a0 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
209b0 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
209c0 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72 2d     if( pSegIter-
209d0 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  >bDel ){.       
209e0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
209f0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
20a00 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62  &writer.writer.b
20a10 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  uf, 0);.        
20a20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50  if( pSegIter->nP
20a30 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  os>0 ){.        
20a40 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
20a50 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
20a60 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
20a70 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
20a80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20a90 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
20aa0 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74 69  ppend the positi
20ab0 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f 20  on-list data to 
20ac0 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
20ad0 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67 49      nPos = pSegI
20ae0 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 53  ter->nPos*2 + pS
20af0 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20 20  egIter->bDel;.  
20b00 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
20b10 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
20b20 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65  c, &writer.write
20b30 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20 20  r.buf, nPos);.  
20b40 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
20b50 72 61 74 65 28 70 2c 20 70 53 65 67 49 74 65 72  rate(p, pSegIter
20b60 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65 72  , (void*)&writer
20b70 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b  , fts5MergeChunk
20b80 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d  Callback);.    }
20b90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68  .  }..  /* Flush
20ba0 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70   the last leaf p
20bb0 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74  age to disk. Set
20bc0 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
20bd0 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67 68  ent b-tree heigh
20be0 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20  t.  ** and last 
20bf0 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
20c00 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
20c10 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69  e.  */.  fts5Wri
20c20 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69  teFinish(p, &wri
20c30 74 65 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f  ter, &pSeg->pgno
20c40 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74  Last);..  if( ft
20c50 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
20c60 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20  , pIter) ){.    
20c70 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52  int i;..    /* R
20c80 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64  emove the redund
20c90 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  ant segments fro
20ca0 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
20cb0 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  le */.    for(i=
20cc0 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b  0; i<nInput; i++
20cd0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ){.      fts5Dat
20ce0 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70  aRemoveSegment(p
20cf0 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e  , pLvl->aSeg[i].
20d00 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iSegid);.    }..
20d10 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
20d20 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d  e redundant segm
20d30 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  ents from the in
20d40 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
20d50 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21   if( pLvl->nSeg!
20d60 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20  =nInput ){.     
20d70 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c   int nMove = (pL
20d80 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75  vl->nSeg - nInpu
20d90 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  t) * sizeof(Fts5
20da0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
20db0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  );.      memmove
20dc0 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c  (pLvl->aSeg, &pL
20dd0 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d  vl->aSeg[nInput]
20de0 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a  , nMove);.    }.
20df0 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
20e00 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b  gment -= nInput;
20e10 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20  .    pLvl->nSeg 
20e20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70  -= nInput;.    p
20e30 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b  Lvl->nMerge = 0;
20e40 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
20e50 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20  gnoLast==0 ){.  
20e60 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65      pLvlOut->nSe
20e70 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72 75  g--;.      pStru
20e80 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a  ct->nSegment--;.
20e90 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
20ea0 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d     assert( pSeg-
20eb0 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20  >pgnoLast>0 );. 
20ec0 20 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65     fts5TrimSegme
20ed0 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  nts(p, pIter);. 
20ee0 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20     pLvl->nMerge 
20ef0 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20  = nInput;.  }.. 
20f00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
20f10 65 65 28 70 49 74 65 72 29 3b 0a 20 20 66 74 73  ee(pIter);.  fts
20f20 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
20f30 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20  m);.  if( pnRem 
20f40 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74  ) *pnRem -= writ
20f50 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b  er.nLeafWritten;
20f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20  .}../*.** Do up 
20f70 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66 20  to nPg pages of 
20f80 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f  automerge work o
20f90 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a  n the index..**.
20fa0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
20fb0 66 20 61 6e 79 20 63 68 61 6e 67 65 73 20 77 65  f any changes we
20fc0 72 65 20 61 63 74 75 61 6c 6c 79 20 6d 61 64 65  re actually made
20fd0 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
20fe0 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
20ff0 69 6e 74 20 66 74 73 35 49 6e 64 65 78 4d 65 72  int fts5IndexMer
21000 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
21010 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21020 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
21030 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
21040 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
21050 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
21060 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
21070 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
21080 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
21090 20 6e 50 67 2c 20 20 20 20 20 20 20 20 20 20 20   nPg,           
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
210b0 50 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f  Pages of work to
210c0 20 64 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 69   do */.  int nMi
210d0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
210e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69           /* Mini
210f0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  mum number of se
21100 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20  gments to merge 
21110 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d  */.){.  int nRem
21120 20 3d 20 6e 50 67 3b 0a 20 20 69 6e 74 20 62 52   = nPg;.  int bR
21130 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 53 74  et = 0;.  Fts5St
21140 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
21150 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
21160 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26  while( nRem>0 &&
21170 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
21180 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76  K ){.    int iLv
21190 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
211a0 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61       /* To itera
211b0 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
211c0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 65  s */.    int iBe
211d0 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20  stLvl = 0;      
211e0 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66       /* Level of
211f0 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20  fering the most 
21200 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
21210 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20  /.    int nBest 
21220 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
21230 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
21240 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e  nput segments on
21250 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a   best level */..
21260 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74      /* Set iBest
21270 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c  Lvl to the level
21280 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73   to read input s
21290 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f  egments from. */
212a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
212b0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29  ruct->nLevel>0 )
212c0 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ;.    for(iLvl=0
212d0 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
212e0 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
212f0 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
21300 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
21310 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
21320 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
21330 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
21340 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21350 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65  pLvl->nMerge>nBe
21360 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
21370 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
21380 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74  .          nBest
21390 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b   = pLvl->nMerge;
213a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
213b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
213c0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  }.      if( pLvl
213d0 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a  ->nSeg>nBest ){.
213e0 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20          nBest = 
213f0 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20  pLvl->nSeg;.    
21400 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69      iBestLvl = i
21410 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Lvl;.      }.   
21420 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42   }..    /* If nB
21430 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20  est is still 0, 
21440 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d  then the index m
21450 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f  ust be empty. */
21460 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21470 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c 76  EBUG.    for(iLv
21480 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26  l=0; nBest==0 &&
21490 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
214a0 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
214b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
214c0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
214d0 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20  vl].nSeg==0 );. 
214e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
214f0 20 69 66 28 20 6e 42 65 73 74 3c 6e 4d 69 6e 20   if( nBest<nMin 
21500 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
21510 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65  el[iBestLvl].nMe
21520 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rge==0 ){.      
21530 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
21540 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20 20 66   bRet = 1;.    f
21550 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
21560 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  el(p, &pStruct, 
21570 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29  iBestLvl, &nRem)
21580 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
21590 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53  =SQLITE_OK && pS
215a0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42  truct->aLevel[iB
215b0 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d  estLvl].nMerge==
215c0 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
215d0 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
215e0 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70  p, iBestLvl+1, p
215f0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20  Struct);.    }. 
21600 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d   }.  *ppStruct =
21610 20 70 53 74 72 75 63 74 3b 0a 20 20 72 65 74 75   pStruct;.  retu
21620 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn bRet;.}../*.*
21630 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65  * A total of nLe
21640 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66  af leaf pages of
21650 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20 62   data has just b
21660 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 61  een flushed to a
21670 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d   level-0.** segm
21680 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ent. This functi
21690 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20 77  on updates the w
216a0 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63  rite-counter acc
216b0 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66  ordingly and, if
216c0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20 70  .** necessary, p
216d0 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e  erforms incremen
216e0 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a  tal merge work..
216f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
21700 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68  r occurs, set th
21710 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
21720 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e  rror code. If an
21730 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
21740 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
21750 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
21760 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
21770 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
21780 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20 20  dexAutomerge(.  
21790 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
217c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
217d0 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
217e0 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
217f0 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
21800 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
21810 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  x */.  int nLeaf
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21840 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65   of output leave
21850 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  s just written *
21860 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
21870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
21880 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f  ->pConfig->nAuto
21890 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20 46  merge>0 ){.    F
218a0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
218b0 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
218c0 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69 74  t;.    u64 nWrit
218d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
218e0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
218f0 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63  value of write-c
21900 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
21910 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20  t nWork;        
21920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21930 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75  umber of work-qu
21940 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20  anta to perform 
21950 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b  */.    int nRem;
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21970 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21980 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66  f leaf pages lef
21990 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20  t to write */.. 
219a0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
219b0 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20   write-counter. 
219c0 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20  While doing so, 
219d0 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20  set nWork. */.  
219e0 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72 75    nWrite = pStru
219f0 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
21a00 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28  r;.    nWork = (
21a10 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b 20  int)(((nWrite + 
21a20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72  nLeaf) / p->nWor
21a30 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74 65  kUnit) - (nWrite
21a40 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
21a50 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e  );.    pStruct->
21a60 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d  nWriteCounter +=
21a70 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d   nLeaf;.    nRem
21a80 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72   = (int)(p->nWor
21a90 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20  kUnit * nWork * 
21aa0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29  pStruct->nLevel)
21ab0 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ;..    fts5Index
21ac0 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75 63  Merge(p, ppStruc
21ad0 74 2c 20 6e 52 65 6d 2c 20 70 2d 3e 70 43 6f 6e  t, nRem, p->pCon
21ae0 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 29  fig->nAutomerge)
21af0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
21b00 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43 72  void fts5IndexCr
21b10 69 73 69 73 6d 65 72 67 65 28 0a 20 20 46 74 73  isismerge(.  Fts
21b20 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b40 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
21b50 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
21b60 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
21b70 74 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t        /* IN/O
21b80 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
21b90 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
21ba0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  /.){.  const int
21bb0 20 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e 70 43   nCrisis = p->pC
21bc0 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65  onfig->nCrisisMe
21bd0 72 67 65 3b 0a 20 20 46 74 73 35 53 74 72 75 63  rge;.  Fts5Struc
21be0 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
21bf0 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74  *ppStruct;.  int
21c00 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61 73   iLvl = 0;..  as
21c10 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
21c20 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63  ITE_OK || pStruc
21c30 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20  t->nLevel>0 );. 
21c40 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
21c50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72  QLITE_OK && pStr
21c60 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
21c70 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73 20  ].nSeg>=nCrisis 
21c80 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
21c90 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70  MergeLevel(p, &p
21ca0 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29  Struct, iLvl, 0)
21cb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
21cc0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
21cd0 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  | pStruct->nLeve
21ce0 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20 20  l>(iLvl+1) );.  
21cf0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
21d00 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31  romote(p, iLvl+1
21d10 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  , pStruct);.    
21d20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  iLvl++;.  }.  *p
21d30 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
21d40 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  t;.}..static int
21d50 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
21d60 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
21d70 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
21d80 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
21d90 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20  TE_OK;.  return 
21da0 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73  rc;.}..typedef s
21db0 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
21dc0 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b  tx Fts5FlushCtx;
21dd0 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73  .struct Fts5Flus
21de0 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64  hCtx {.  Fts5Ind
21df0 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35  ex *pIdx;.  Fts5
21e00 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
21e10 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66  ; .};../*.** Buf
21e20 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61  fer aBuf[] conta
21e30 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61  ins a list of va
21e40 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c  rints, all small
21e50 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a   enough to fit.*
21e60 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  * in a 32-bit in
21e70 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68  teger. Return th
21e80 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61  e size of the la
21e90 72 67 65 73 74 20 70 72 65 66 69 78 20 6f 66 20  rgest prefix of 
21ea0 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d  this .** list nM
21eb0 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73  ax bytes or less
21ec0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
21ed0 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c  tic int fts5Posl
21ee0 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20  istPrefix(const 
21ef0 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d  u8 *aBuf, int nM
21f00 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a  ax){.  int ret;.
21f10 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72    u32 dummy;.  r
21f20 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
21f30 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79  nt32(aBuf, dummy
21f40 29 3b 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d 61  );.  if( ret<nMa
21f50 78 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  x ){.    while( 
21f60 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
21f70 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
21f80 33 32 28 26 61 42 75 66 5b 72 65 74 5d 2c 20 64  32(&aBuf[ret], d
21f90 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28  ummy);.      if(
21fa0 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d 61   (ret + i) > nMa
21fb0 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  x ) break;.     
21fc0 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20 7d   ret += i;.    }
21fd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
21fe0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  t;.}../*.** Flus
21ff0 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
22000 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  f in-memory hash
22010 20 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20   table iHash to 
22020 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a  a new level-0 .*
22030 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73  * segment on dis
22040 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74  k. Also update t
22050 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
22060 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
22070 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
22080 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
22090 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72   the Fts5Index.r
220a0 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  c error code. If
220b0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
220c0 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
220d0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
220e0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
220f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
22100 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74  5FlushOneHash(Ft
22110 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
22120 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d  ts5Hash *pHash =
22130 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73   p->pHash;.  Fts
22140 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
22150 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69  uct;.  int iSegi
22160 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73  d;.  int pgnoLas
22170 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
22180 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c         /* Last l
22190 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
221a0 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20  in segment */.. 
221b0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66   /* Obtain a ref
221c0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e  erence to the in
221d0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6e  dex structure an
221e0 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  d allocate a new
221f0 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a   segment-id.  **
22200 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76   for the new lev
22210 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a  el-0 segment.  *
22220 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  /.  pStruct = ft
22230 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
22240 70 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66  p);.  iSegid = f
22250 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
22260 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
22270 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76  fts5StructureInv
22280 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20 69  alidate(p);..  i
22290 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20  f( iSegid ){.   
222a0 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
222b0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
222c0 73 7a 3b 0a 20 20 20 20 69 6e 74 20 65 44 65 74  sz;.    int eDet
222d0 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
222e0 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 20 20 46  ->eDetail;.    F
222f0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
22300 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20  ent *pSeg;   /* 
22310 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68  New segment with
22320 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20  in pStruct */.  
22330 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
22340 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
22350 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69  /* Buffer in whi
22360 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c  ch to assemble l
22370 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
22380 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67 69  Fts5Buffer *pPgi
22390 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dx;           /*
223a0 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   Buffer in which
223b0 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 70 67 69   to assemble pgi
223c0 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35 53  dx */..    Fts5S
223d0 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  egWriter writer;
223e0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e  .    fts5WriteIn
223f0 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69  it(p, &writer, i
22400 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 70 42 75  Segid);..    pBu
22410 66 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74  f = &writer.writ
22420 65 72 2e 62 75 66 3b 0a 20 20 20 20 70 50 67 69  er.buf;.    pPgi
22430 64 78 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69  dx = &writer.wri
22440 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20 20  ter.pgidx;..    
22450 2f 2a 20 66 74 73 35 57 72 69 74 65 49 6e 69 74  /* fts5WriteInit
22460 28 29 20 73 68 6f 75 6c 64 20 68 61 76 65 20 69  () should have i
22470 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 62  nitialized the b
22480 75 66 66 65 72 73 20 74 6f 20 28 6d 6f 73 74 20  uffers to (most 
22490 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20 74  likely).    ** t
224a0 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
224b0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
224c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
224d0 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e  || pBuf->nSpace>
224e0 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41  =(pgsz + FTS5_DA
224f0 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 20  TA_PADDING) );. 
22500 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
22510 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70 61   || pPgidx->nSpa
22520 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35  ce>=(pgsz + FTS5
22530 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29  _DATA_PADDING) )
22540 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
22550 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
22560 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72   hash table entr
22570 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72  ies. This loop r
22580 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
22590 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64 6f  h.    ** term/do
225a0 63 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20  clist currently 
225b0 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68  stored within th
225c0 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f  e hash table. */
225d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
225e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
225f0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
22600 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e  e3Fts5HashScanIn
22610 69 74 28 70 48 61 73 68 2c 20 30 2c 20 30 29 3b  it(pHash, 0, 0);
22620 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
22630 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
22640 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  OK && 0==sqlite3
22650 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28  Fts5HashScanEof(
22660 70 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20  pHash) ){.      
22670 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
22680 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  m;          /* B
22690 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
226a0 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 63   term */.      c
226b0 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c 69 73  onst u8 *pDoclis
226c0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  t;         /* Po
226d0 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
226e0 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a   for this term *
226f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63  /.      int nDoc
22700 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
22710 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
22720 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  oclist in bytes 
22730 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  */..      /* Wri
22740 74 65 20 74 68 65 20 74 65 72 6d 20 66 6f 72 20  te the term for 
22750 74 68 69 73 20 65 6e 74 72 79 20 74 6f 20 64 69  this entry to di
22760 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  sk. */.      sql
22770 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
22780 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a 54  Entry(pHash, &zT
22790 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20  erm, &pDoclist, 
227a0 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  &nDoclist);.    
227b0 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
227c0 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72  dTerm(p, &writer
227d0 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  , (int)strlen(zT
227e0 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38 2a  erm), (const u8*
227f0 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20 20  )zTerm);..      
22800 61 73 73 65 72 74 28 20 77 72 69 74 65 72 2e 62  assert( writer.b
22810 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
22820 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
22830 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20   pgsz>=(pBuf->n 
22840 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44  + pPgidx->n + nD
22850 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20  oclist + 1) ){. 
22860 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
22870 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c  tire doclist wil
22880 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72  l fit on the cur
22890 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20  rent leaf. */.  
228a0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
228b0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
228c0 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e  Buf, pDoclist, n
228d0 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Doclist);.      
228e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
228f0 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20  64 iRowid = 0;. 
22900 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74         i64 iDelt
22910 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  a = 0;.        i
22920 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  nt iOff = 0;..  
22930 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
22940 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c  ire doclist will
22950 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73   not fit on this
22960 20 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f   leaf. The follo
22970 77 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  wing .        **
22980 20 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74   loop iterates t
22990 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69  hrough the posli
229a0 73 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  sts that make up
229b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
229c0 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74        ** doclist
229d0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
229e0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
229f0 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44  TE_OK && iOff<nD
22a00 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oclist ){.      
22a10 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
22a20 47 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c  GetVarint(&pDocl
22a30 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ist[iOff], (u64*
22a40 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
22a50 20 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69       iRowid += i
22a60 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20  Delta;.         
22a70 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20   .          if( 
22a80 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77  writer.bFirstRow
22a90 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
22aa0 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55          fts5PutU
22ab0 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20  16(&pBuf->p[0], 
22ac0 28 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20 20  (u16)pBuf->n);  
22ad0 20 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20   /* first rowid 
22ae0 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  on page */.     
22af0 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
22b00 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  = sqlite3Fts5Put
22b10 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
22b20 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64  pBuf->n], iRowid
22b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  );.            w
22b40 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
22b50 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  dInPage = 0;.   
22b60 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
22b70 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c  teDlidxAppend(p,
22b80 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64   &writer, iRowid
22b90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
22ba0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22bb0 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
22bc0 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
22bd0 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
22be0 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  ], iDelta);.    
22bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22c00 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
22c10 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20  n<=pBuf->nSpace 
22c20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
22c30 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
22c40 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
22c50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
22c60 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20  Off<nDoclist && 
22c70 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d  pDoclist[iOff]==
22c80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
22c90 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d     pBuf->p[pBuf-
22ca0 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  >n++] = 0;.     
22cb0 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b           iOff++;
22cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
22cd0 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  f( iOff<nDoclist
22ce0 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66   && pDoclist[iOf
22cf0 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
22d00 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70           pBuf->p
22d10 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b  [pBuf->n++] = 0;
22d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d30 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20   iOff++;.       
22d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22d60 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20     if( (pBuf->n 
22d70 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67  + pPgidx->n)>=pg
22d80 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
22d90 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
22da0 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65  shLeaf(p, &write
22db0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
22dc0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
22dd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
22de0 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20  nt bDummy;.     
22df0 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b         int nPos;
22e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
22e10 20 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74   nCopy = fts5Get
22e20 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f  PoslistSize(&pDo
22e30 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50  clist[iOff], &nP
22e40 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
22e50 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
22e60 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  += nPos;.       
22e70 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e       if( (pBuf->
22e80 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20  n + pPgidx->n + 
22e90 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20 29  nCopy) <= pgsz )
22ea0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22eb0 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f  /* The entire po
22ec0 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f  slist will fit o
22ed0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  n the current le
22ee0 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20 20  af. So copy.    
22ef0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
22f00 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20  in one go. */.  
22f10 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
22f20 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
22f30 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63  Blob(pBuf, &pDoc
22f40 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70  list[iOff], nCop
22f50 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
22f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22f70 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
22f80 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20  re poslist will 
22f90 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20  not fit on this 
22fa0 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64  leaf. So it need
22fb0 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
22fc0 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20  ** to be broken 
22fd0 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54  into sections. T
22fe0 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63  he only qualific
22ff0 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20  ation being.    
23000 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
23010 74 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75  t each varint mu
23020 73 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e  st be stored con
23030 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20  tiguously.  */. 
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
23050 73 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74 20  st u8 *pPoslist 
23060 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  = &pDoclist[iOff
23070 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
23080 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20   int iPos = 0;. 
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69               whi
230a0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
230b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
230c0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61          int nSpa
230d0 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66  ce = pgsz - pBuf
230e0 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e 3b  ->n - pPgidx->n;
230f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23100 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
23110 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23120 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d  (nCopy - iPos)<=
23130 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  nSpace ){.      
23140 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
23150 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20  nCopy - iPos;.  
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
23170 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23180 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50         n = fts5P
23190 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26 70 50  oslistPrefix(&pP
231a0 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53  oslist[iPos], nS
231b0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  pace);.         
231c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
231d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
231e0 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   n>0 );.        
231f0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
23200 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
23210 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74  (pBuf, &pPoslist
23220 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20  [iPos], n);.    
23230 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73              iPos
23240 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   += n;.         
23250 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66         if( (pBuf
23260 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29  ->n + pPgidx->n)
23270 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  >=pgsz ){.      
23280 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
23290 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
232a0 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20  , &writer);.    
232b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
232d0 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20  ( iPos>=nCopy ) 
232e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
232f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23310 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a   iOff += nCopy;.
23320 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23330 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
23340 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20 44       /* TODO2: D
23350 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  oclist terminato
23360 72 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e 20  r written here. 
23370 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75 66  */.      /* pBuf
23380 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
23390 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20 20   '\0'; */.      
233a0 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c  assert( pBuf->n<
233b0 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b  =pBuf->nSpace );
233c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
233d0 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
233e0 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Hash);.    }.   
233f0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
23400 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
23410 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
23420 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70  h(p, &writer, &p
23430 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f  gnoLast);..    /
23440 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73  * Update the Fts
23450 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20 69  5Structure. It i
23460 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74  s written back t
23470 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
23480 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74 73  y the.    ** fts
23490 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
234a0 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20  e() call below. 
234b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72   */.    if( pStr
234c0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29  uct->nLevel==0 )
234d0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
234e0 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70  ctureAddLevel(&p
234f0 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b  ->rc, &pStruct);
23500 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
23510 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
23520 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
23530 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  uct, 0, 1, 0);. 
23540 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
23550 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23560 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74   pSeg = &pStruct
23570 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67  ->aLevel[0].aSeg
23580 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  [ pStruct->aLeve
23590 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20  l[0].nSeg++ ];. 
235a0 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69       pSeg->iSegi
235b0 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
235c0 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
235d0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65  t = 1;.      pSe
235e0 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67  g->pgnoLast = pg
235f0 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 53  noLast;.      pS
23600 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b  truct->nSegment+
23610 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  +;.    }.    fts
23620 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
23630 65 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29  e(p, 0, pStruct)
23640 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64  ;.  }..  fts5Ind
23650 65 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20 26  exAutomerge(p, &
23660 70 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73  pStruct, pgnoLas
23670 74 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 43  t);.  fts5IndexC
23680 72 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26 70  risismerge(p, &p
23690 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53  Struct);.  fts5S
236a0 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
236b0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73   pStruct);.  fts
236c0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
236d0 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f  e(pStruct);.}../
236e0 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64  *.** Flush any d
236f0 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
23700 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
23710 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64   tables to the d
23720 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
23730 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
23740 78 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65 78  xFlush(Fts5Index
23750 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73   *p){.  /* Unles
23760 73 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20 66  s it is empty, f
23770 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61  lush the hash ta
23780 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ble to disk */. 
23790 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   if( p->nPending
237a0 44 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65  Data ){.    asse
237b0 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a  rt( p->pHash );.
237c0 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
237d0 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73  ata = 0;.    fts
237e0 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29  5FlushOneHash(p)
237f0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
23800 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66  Fts5Structure *f
23810 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
23820 53 74 72 75 63 74 28 0a 20 20 46 74 73 35 49 6e  Struct(.  Fts5In
23830 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
23840 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
23850 74 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  t.){.  Fts5Struc
23860 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  ture *pNew = 0;.
23870 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
23880 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
23890 72 65 29 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20  re);.  int nSeg 
238a0 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  = pStruct->nSegm
238b0 65 6e 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ent;.  int i;.. 
238c0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69   /* Figure out i
238d0 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
238e0 20 72 65 71 75 69 72 65 73 20 6f 70 74 69 6d 69   requires optimi
238f0 7a 61 74 69 6f 6e 2e 20 41 20 73 74 72 75 63 74  zation. A struct
23900 75 72 65 20 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f  ure does.  ** no
23910 74 20 72 65 71 75 69 72 65 20 6f 70 74 69 6d 69  t require optimi
23920 7a 61 74 69 6f 6e 20 69 66 20 65 69 74 68 65 72  zation if either
23930 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 2b 20 69  :.  **.  **  + i
23940 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 66 65  t consists of fe
23950 77 65 72 20 74 68 61 6e 20 74 77 6f 20 73 65 67  wer than two seg
23960 6d 65 6e 74 73 2c 20 6f 72 20 0a 20 20 2a 2a 20  ments, or .  ** 
23970 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20   + all segments 
23980 61 72 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  are on the same 
23990 6c 65 76 65 6c 2c 20 6f 72 0a 20 20 2a 2a 20 20  level, or.  **  
239a0 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 65  + all segments e
239b0 78 63 65 70 74 20 6f 6e 65 20 61 72 65 20 63 75  xcept one are cu
239c0 72 72 65 6e 74 6c 79 20 69 6e 70 75 74 73 20 74  rrently inputs t
239d0 6f 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61 74  o a merge operat
239e0 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ion..  **.  ** I
239f0 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 73 65  n the first case
23a00 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  , return NULL. I
23a10 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 69 6e  n the second, in
23a20 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 2d  crement the ref-
23a30 63 6f 75 6e 74 0a 20 20 2a 2a 20 6f 6e 20 2a 70  count.  ** on *p
23a40 53 74 72 75 63 74 20 61 6e 64 20 72 65 74 75 72  Struct and retur
23a50 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
23a60 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a 20  pointer to it.. 
23a70 20 2a 2f 0a 20 20 69 66 28 20 6e 53 65 67 3c 32   */.  if( nSeg<2
23a80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
23a90 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63  or(i=0; i<pStruc
23aa0 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b  t->nLevel; i++){
23ab0 0a 20 20 20 20 69 6e 74 20 6e 54 68 69 73 20 3d  .    int nThis =
23ac0 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
23ad0 5b 69 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 69 66  [i].nSeg;.    if
23ae0 28 20 6e 54 68 69 73 3d 3d 6e 53 65 67 20 7c 7c  ( nThis==nSeg ||
23af0 20 28 6e 54 68 69 73 3d 3d 6e 53 65 67 2d 31 20   (nThis==nSeg-1 
23b00 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
23b10 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 6e 54  el[i].nMerge==nT
23b20 68 69 73 29 20 29 7b 0a 20 20 20 20 20 20 66 74  his) ){.      ft
23b30 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70  s5StructureRef(p
23b40 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 72  Struct);.      r
23b50 65 74 75 72 6e 20 70 53 74 72 75 63 74 3b 0a 20  eturn pStruct;. 
23b60 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
23b70 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
23b80 5b 69 5d 2e 6e 4d 65 72 67 65 3c 3d 6e 54 68 69  [i].nMerge<=nThi
23b90 73 20 29 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79 74  s );.  }..  nByt
23ba0 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e  e += (pStruct->n
23bb0 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f  Level+1) * sizeo
23bc0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
23bd0 65 76 65 6c 29 3b 0a 20 20 70 4e 65 77 20 3d 20  evel);.  pNew = 
23be0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
23bf0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
23c00 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42  cZero(&p->rc, nB
23c10 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 4e 65  yte);..  if( pNe
23c20 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  w ){.    Fts5Str
23c30 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
23c40 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6e  l;.    nByte = n
23c50 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  Seg * sizeof(Fts
23c60 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
23c70 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  t);.    pNew->nL
23c80 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e  evel = pStruct->
23c90 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70 4e  nLevel+1;.    pN
23ca0 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
23cb0 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f    pNew->nWriteCo
23cc0 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d  unter = pStruct-
23cd0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
23ce0 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77      pLvl = &pNew
23cf0 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74  ->aLevel[pStruct
23d00 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70  ->nLevel];.    p
23d10 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73  Lvl->aSeg = (Fts
23d20 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
23d30 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
23d40 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
23d50 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
23d60 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20   pLvl->aSeg ){. 
23d70 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69       int iLvl, i
23d80 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Seg;.      int i
23d90 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  SegOut = 0;.    
23da0 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
23db0 6f 75 67 68 20 61 6c 6c 20 73 65 67 6d 65 6e 74  ough all segment
23dc0 73 2c 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  s, from oldest t
23dd0 6f 20 6e 65 77 65 73 74 2e 20 41 64 64 20 74 68  o newest. Add th
23de0 65 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  em to.      ** t
23df0 68 65 20 6e 65 77 20 46 74 73 35 4c 65 76 65 6c  he new Fts5Level
23e00 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
23e10 70 4c 76 6c 2d 3e 61 53 65 67 5b 30 5d 20 69 73  pLvl->aSeg[0] is
23e20 20 74 68 65 20 6f 6c 64 65 73 74 0a 20 20 20 20   the oldest.    
23e30 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20    ** segment in 
23e40 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
23e50 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  re.  */.      fo
23e60 72 28 69 4c 76 6c 3d 70 53 74 72 75 63 74 2d 3e  r(iLvl=pStruct->
23e70 6e 4c 65 76 65 6c 2d 31 3b 20 69 4c 76 6c 3e 3d  nLevel-1; iLvl>=
23e80 30 3b 20 69 4c 76 6c 2d 2d 29 7b 0a 20 20 20 20  0; iLvl--){.    
23e90 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
23ea0 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
23eb0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
23ec0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
23ed0 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69      pLvl->aSeg[i
23ee0 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63  SegOut] = pStruc
23ef0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
23f00 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
23f10 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b        iSegOut++;
23f20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23f30 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
23f40 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e  Segment = pLvl->
23f50 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20  nSeg = nSeg;.   
23f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
23f70 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
23f80 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30  ;.      pNew = 0
23f90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
23fa0 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 69  eturn pNew;.}..i
23fb0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
23fc0 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73 35  dexOptimize(Fts5
23fd0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
23fe0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
23ff0 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63  uct;.  Fts5Struc
24000 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  ture *pNew = 0;.
24010 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
24020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
24030 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
24040 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  p);.  pStruct = 
24050 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
24060 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  d(p);.  fts5Stru
24070 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28  ctureInvalidate(
24080 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 72 75  p);..  if( pStru
24090 63 74 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  ct ){.    pNew =
240a0 20 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69   fts5IndexOptimi
240b0 7a 65 53 74 72 75 63 74 28 70 2c 20 70 53 74 72  zeStruct(p, pStr
240c0 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  uct);.  }.  fts5
240d0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
240e0 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 61 73  (pStruct);..  as
240f0 73 65 72 74 28 20 70 4e 65 77 3d 3d 30 20 7c 7c  sert( pNew==0 ||
24100 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 3e   pNew->nSegment>
24110 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  0 );.  if( pNew 
24120 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
24130 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
24140 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c   pNew->aLevel[iL
24150 76 6c 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 4c 76  vl].nSeg==0; iLv
24160 6c 2b 2b 29 7b 7d 0a 20 20 20 20 77 68 69 6c 65  l++){}.    while
24170 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
24180 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c 65 76  OK && pNew->aLev
24190 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20  el[iLvl].nSeg>0 
241a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65  ){.      int nRe
241b0 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52  m = FTS5_OPT_WOR
241c0 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20 66 74  K_UNIT;.      ft
241d0 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
241e0 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c 76 6c  l(p, &pNew, iLvl
241f0 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 7d 0a  , &nRem);.    }.
24200 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
24210 72 65 57 72 69 74 65 28 70 2c 20 70 4e 65 77 29  reWrite(p, pNew)
24220 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
24230 75 72 65 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ureRelease(pNew)
24240 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
24250 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
24260 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  p); .}../*.** Th
24270 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  is is called to 
24280 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 70  implement the sp
24290 65 63 69 61 6c 20 22 56 41 4c 55 45 53 28 27 6d  ecial "VALUES('m
242a0 65 72 67 65 27 2c 20 24 6e 4d 65 72 67 65 29 22  erge', $nMerge)"
242b0 0a 2a 2a 20 49 4e 53 45 52 54 20 63 6f 6d 6d 61  .** INSERT comma
242c0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
242d0 65 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65  e3Fts5IndexMerge
242e0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
242f0 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74  nt nMerge){.  Ft
24300 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
24310 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
24320 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69  tureRead(p);.  i
24330 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
24340 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 2d 3e    int nMin = p->
24350 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65 72 6d 65  pConfig->nUserme
24360 72 67 65 3b 0a 20 20 20 20 66 74 73 35 53 74 72  rge;.    fts5Str
24370 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
24380 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 4d 65  (p);.    if( nMe
24390 72 67 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 46  rge<0 ){.      F
243a0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e  ts5Structure *pN
243b0 65 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f 70  ew = fts5IndexOp
243c0 74 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c 20  timizeStruct(p, 
243d0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
243e0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
243f0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
24400 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 70       pStruct = p
24410 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4d 69 6e 20  New;.      nMin 
24420 3d 20 32 3b 0a 20 20 20 20 20 20 6e 4d 65 72 67  = 2;.      nMerg
24430 65 20 3d 20 6e 4d 65 72 67 65 2a 2d 31 3b 0a 20  e = nMerge*-1;. 
24440 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74     }.    if( pSt
24450 72 75 63 74 20 26 26 20 70 53 74 72 75 63 74 2d  ruct && pStruct-
24460 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20  >nLevel ){.     
24470 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 4d 65   if( fts5IndexMe
24480 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c  rge(p, &pStruct,
24490 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29 20 29   nMerge, nMin) )
244a0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  {.        fts5St
244b0 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
244c0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
244d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  }.    }.    fts5
244e0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
244f0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20  (pStruct);.  }. 
24500 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
24510 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73  xReturn(p);.}..s
24520 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41  tatic void fts5A
24530 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74  ppendRowid(.  Ft
24540 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36  s5Index *p,.  i6
24550 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35  4 iDelta,.  Fts5
24560 49 74 65 72 20 2a 70 55 6e 75 73 65 64 2c 0a 20  Iter *pUnused,. 
24570 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
24580 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  f.){.  UNUSED_PA
24590 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  RAM(pUnused);.  
245a0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
245b0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70  Varint(&p->rc, p
245c0 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 7d 0a  Buf, iDelta);.}.
245d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
245e0 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 28 0a  5AppendPoslist(.
245f0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
24600 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20    i64 iDelta,.  
24610 46 74 73 35 49 74 65 72 20 2a 70 4d 75 6c 74 69  Fts5Iter *pMulti
24620 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
24630 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 6e 44  pBuf.){.  int nD
24640 61 74 61 20 3d 20 70 4d 75 6c 74 69 2d 3e 62 61  ata = pMulti->ba
24650 73 65 2e 6e 44 61 74 61 3b 0a 20 20 61 73 73 65  se.nData;.  asse
24660 72 74 28 20 6e 44 61 74 61 3e 30 20 29 3b 0a 20  rt( nData>0 );. 
24670 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
24680 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74 73 35  TE_OK && 0==fts5
24690 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
246a0 63 2c 20 70 42 75 66 2c 20 6e 44 61 74 61 2b 39  c, pBuf, nData+9
246b0 2b 39 29 20 29 7b 0a 20 20 20 20 66 74 73 35 42  +9) ){.    fts5B
246c0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
246d0 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65 6c  arint(pBuf, iDel
246e0 74 61 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ta);.    fts5Buf
246f0 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
24700 69 6e 74 28 70 42 75 66 2c 20 6e 44 61 74 61 2a  int(pBuf, nData*
24710 32 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  2);.    fts5Buff
24720 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
24730 28 70 42 75 66 2c 20 70 4d 75 6c 74 69 2d 3e 62  (pBuf, pMulti->b
24740 61 73 65 2e 70 44 61 74 61 2c 20 6e 44 61 74 61  ase.pData, nData
24750 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69  );.  }.}...stati
24760 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
24770 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35 44  stIterNext(Fts5D
24780 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
24790 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70 49  r){.  u8 *p = pI
247a0 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b 20  ter->aPoslist + 
247b0 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20 70  pIter->nSize + p
247c0 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a  Iter->nPoslist;.
247d0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
247e0 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20 20  ->aPoslist );.  
247f0 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61 45  if( p>=pIter->aE
24800 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  of ){.    pIter-
24810 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20  >aPoslist = 0;. 
24820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
24830 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20 2b  iDelta;..    p +
24840 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
24850 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  p, (u64*)&iDelta
24860 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
24870 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
24880 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f 73  .    /* Read pos
24890 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20  ition list size 
248a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d 20  */.    if( p[0] 
248b0 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20  & 0x80 ){.      
248c0 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
248d0 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 66  pIter->nSize = f
248e0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts5GetVarint32(p
248f0 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 70  , nPos);.      p
24900 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d  Iter->nPoslist =
24910 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20 20   (nPos>>1);.    
24920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
24930 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28  er->nPoslist = (
24940 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e 20  (int)(p[0])) >> 
24950 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  1;.      pIter->
24960 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 7d  nSize = 1;.    }
24970 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f  ..    pIter->aPo
24980 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a 7d  slist = p;.  }.}
24990 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
249a0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
249b0 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t(.  Fts5Buffer 
249c0 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44 6f  *pBuf, .  Fts5Do
249d0 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72  clistIter *pIter
249e0 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  .){.  memset(pIt
249f0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
24a00 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
24a10 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75 66  >aPoslist = pBuf
24a20 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61 45  ->p;.  pIter->aE
24a30 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70 42  of = &pBuf->p[pB
24a40 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44 6f  uf->n];.  fts5Do
24a50 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49  clistIterNext(pI
24a60 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f  ter);.}..#if 0./
24a70 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f  *.** Append a do
24a80 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20  clist to buffer 
24a90 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pBuf..**.** This
24aa0 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
24ab0 73 20 74 68 61 74 20 73 70 61 63 65 20 77 69 74  s that space wit
24ac0 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 68  hin the buffer h
24ad0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
24ae0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f  ** allocated..*/
24af0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
24b00 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
24b10 64 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  d(.  Fts5Buffer 
24b20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
24b30 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
24b40 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
24b50 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  i64 *piLastRowid
24b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24b70 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69  /* IN/OUT: Previ
24b80 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74 74 65  ous rowid writte
24b90 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  n (if any) */.  
24ba0 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20 20  i64 iRowid      
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bc0 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65  /* Rowid to appe
24bd0 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  nd */.){.  asser
24be0 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c 7c  t( pBuf->n!=0 ||
24bf0 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3d   (*piLastRowid)=
24c00 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66 66  =0 );.  fts5Buff
24c10 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
24c20 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64 20  nt(pBuf, iRowid 
24c30 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3b  - *piLastRowid);
24c40 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20  .  *piLastRowid 
24c50 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64  = iRowid;.}.#end
24c60 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  if..#define fts5
24c70 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
24c80 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77 69  (pBuf, iLastRowi
24c90 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20 20  d, iRowid) {    
24ca0 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28     \.  assert( (
24cb0 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20 28  pBuf)->n!=0 || (
24cc0 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29  iLastRowid)==0 )
24cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24ce0 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66 66      \.  fts5Buff
24cf0 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
24d00 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f 77  nt((pBuf), (iRow
24d10 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77 69  id) - (iLastRowi
24d20 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74 52  d)); \.  (iLastR
24d30 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64 29  owid) = (iRowid)
24d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d60 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
24d70 20 53 77 61 70 20 74 68 65 20 63 6f 6e 74 65 6e   Swap the conten
24d80 74 73 20 6f 66 20 62 75 66 66 65 72 20 2a 70 31  ts of buffer *p1
24d90 20 77 69 74 68 20 74 68 61 74 20 6f 66 20 2a 70   with that of *p
24da0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
24db0 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70  d fts5BufferSwap
24dc0 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c  (Fts5Buffer *p1,
24dd0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 29   Fts5Buffer *p2)
24de0 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  {.  Fts5Buffer t
24df0 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31 20  mp = *p1;.  *p1 
24e00 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20 74  = *p2;.  *p2 = t
24e10 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  mp;.}..static vo
24e20 69 64 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64  id fts5NextRowid
24e30 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75  (Fts5Buffer *pBu
24e40 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66 2c 20 69  f, int *piOff, i
24e50 36 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20 20  64 *piRowid){.  
24e60 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66 66 3b 0a  int i = *piOff;.
24e70 20 20 69 66 28 20 69 3e 3d 70 42 75 66 2d 3e 6e    if( i>=pBuf->n
24e80 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d   ){.    *piOff =
24e90 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
24ea0 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    u64 iVal;.    
24eb0 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20 73 71 6c  *piOff = i + sql
24ec0 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
24ed0 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d 2c 20 26  t(&pBuf->p[i], &
24ee0 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 52 6f  iVal);.    *piRo
24ef0 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 7d  wid += iVal;.  }
24f00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
24f10 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
24f20 20 6f 66 20 66 74 73 35 4d 65 72 67 65 50 72 65   of fts5MergePre
24f30 66 69 78 4c 69 73 74 73 28 29 20 66 6f 72 20 64  fixLists() for d
24f40 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e  etail=none mode.
24f50 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65  .** In this case
24f60 20 74 68 65 20 62 75 66 66 65 72 73 20 63 6f 6e   the buffers con
24f70 73 69 73 74 20 6f 66 20 61 20 64 65 6c 74 61 2d  sist of a delta-
24f80 65 6e 63 6f 64 65 64 20 6c 69 73 74 20 6f 66 20  encoded list of 
24f90 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  rowids only..*/.
24fa0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24fb0 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73 28  MergeRowidLists(
24fc0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
24ff0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
25000 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20  ts5Buffer *p1,  
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25020 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20  * First list to 
25030 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42  merge */.  Fts5B
25040 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20  uffer *p2       
25050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
25060 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72  cond list to mer
25070 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ge */.){.  int i
25080 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 32 20  1 = 0;.  int i2 
25090 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  = 0;.  i64 iRowi
250a0 64 31 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52  d1 = 0;.  i64 iR
250b0 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20 69 36 34  owid2 = 0;.  i64
250c0 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 46 74   iOut = 0;..  Ft
250d0 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20  s5Buffer out;.  
250e0 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20  memset(&out, 0, 
250f0 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20  sizeof(out));.  
25100 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
25110 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f  rSize(&p->rc, &o
25120 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e  ut, p1->n + p2->
25130 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20  n);.  if( p->rc 
25140 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73  ) return;..  fts
25150 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26  5NextRowid(p1, &
25160 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20  i1, &iRowid1);. 
25170 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70   fts5NextRowid(p
25180 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64 32  2, &i2, &iRowid2
25190 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 31 3e 3d  );.  while( i1>=
251a0 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b 0a 20 20  0 || i2>=0 ){.  
251b0 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20 28    if( i1>=0 && (
251c0 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69 64 31 3c  i2<0 || iRowid1<
251d0 69 52 6f 77 69 64 32 29 20 29 7b 0a 20 20 20 20  iRowid2) ){.    
251e0 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d 3d    assert( iOut==
251f0 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e 69 4f 75  0 || iRowid1>iOu
25200 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  t );.      fts5B
25210 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
25220 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77  arint(&out, iRow
25230 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20  id1 - iOut);.   
25240 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69 64     iOut = iRowid
25250 31 3b 0a 20 20 20 20 20 20 66 74 73 35 4e 65 78  1;.      fts5Nex
25260 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20  tRowid(p1, &i1, 
25270 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 7d  &iRowid1);.    }
25280 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
25290 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69  rt( iOut==0 || i
252a0 52 6f 77 69 64 32 3e 69 4f 75 74 20 29 3b 0a 20  Rowid2>iOut );. 
252b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
252c0 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
252d0 26 6f 75 74 2c 20 69 52 6f 77 69 64 32 20 2d 20  &out, iRowid2 - 
252e0 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f 75  iOut);.      iOu
252f0 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20 20 20  t = iRowid2;.   
25300 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20     if( i1>=0 && 
25310 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77 69 64 32  iRowid1==iRowid2
25320 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
25330 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69  NextRowid(p1, &i
25340 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20  1, &iRowid1);.  
25350 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
25360 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69  NextRowid(p2, &i
25370 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20  2, &iRowid2);.  
25380 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42    }.  }..  fts5B
25390 75 66 66 65 72 53 77 61 70 28 26 6f 75 74 2c 20  ufferSwap(&out, 
253a0 70 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  p1);.  fts5Buffe
253b0 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d 0a 0a  rFree(&out);.}..
253c0 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70 31  /*.** Buffers p1
253d0 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e 20   and p2 contain 
253e0 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20 66  doclists. This f
253f0 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 74  unction merges t
25400 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66  he content.** of
25410 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73 74   the two doclist
25420 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20 73  s together and s
25430 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74 6f  ets buffer p1 to
25440 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f   the result befo
25450 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
25460 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
25470 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
25480 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
25490 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e   in p->rc. If an
254a0 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c   error has.** al
254b0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
254c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
254d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
254e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
254f0 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a 20  gePrefixLists(. 
25500 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
25530 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
25540 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20  5Buffer *p1,    
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25560 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65  First list to me
25570 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  rge */.  Fts5Buf
25580 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20  fer *p2         
25590 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
255a0 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65  nd list to merge
255b0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d   */.){.  if( p2-
255c0 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c  >n ){.    i64 iL
255d0 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
255e0 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65    Fts5DoclistIte
255f0 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f  r i1;.    Fts5Do
25600 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20  clistIter i2;.  
25610 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74    Fts5Buffer out
25620 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20   = {0, 0, 0};.  
25630 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70    Fts5Buffer tmp
25640 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20   = {0, 0, 0};.. 
25650 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74     if( sqlite3Ft
25660 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
25670 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e  >rc, &out, p1->n
25680 20 2b 20 70 32 2d 3e 6e 29 20 29 20 72 65 74 75   + p2->n) ) retu
25690 72 6e 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c  rn;.    fts5Docl
256a0 69 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20  istIterInit(p1, 
256b0 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f  &i1);.    fts5Do
256c0 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32  clistIterInit(p2
256d0 2c 20 26 69 32 29 3b 0a 0a 20 20 20 20 77 68 69  , &i2);..    whi
256e0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
256f0 66 28 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e  f( i1.iRowid<i2.
25700 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
25710 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20    /* Copy entry 
25720 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20  from i1 */.     
25730 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
25740 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
25750 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f  astRowid, i1.iRo
25760 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
25770 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
25780 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e  ndBlob(&out, i1.
25790 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
257a0 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b  slist+i1.nSize);
257b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
257c0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
257d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
257e0 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20  1.aPoslist==0 ) 
257f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25800 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32       else if( i2
25810 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77  .iRowid!=i1.iRow
25820 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  id ){.        /*
25830 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
25840 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i2 */.        f
25850 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
25860 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
25870 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29  owid, i2.iRowid)
25880 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
25890 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
258a0 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73  ob(&out, i2.aPos
258b0 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  list, i2.nPoslis
258c0 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20  t+i2.nSize);.   
258d0 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
258e0 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
258f0 20 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50         if( i2.aP
25900 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61  oslist==0 ) brea
25910 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
25920 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f   else{.        /
25930 2a 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20  * Merge the two 
25940 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20  position lists. 
25950 2a 2f 20 0a 20 20 20 20 20 20 20 20 69 36 34 20  */ .        i64 
25960 69 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20  iPos1 = 0;.     
25970 20 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30     i64 iPos2 = 0
25980 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
25990 66 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ff1 = 0;.       
259a0 20 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a   int iOff2 = 0;.
259b0 20 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d          u8 *a1 =
259c0 20 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31   &i1.aPoslist[i1
259d0 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  .nSize];.       
259e0 20 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50   u8 *a2 = &i2.aP
259f0 6f 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d  oslist[i2.nSize]
25a00 3b 0a 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ;..        i64 i
25a10 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
25a20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69    Fts5PoslistWri
25a30 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20  ter writer;.    
25a40 20 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74      memset(&writ
25a50 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 72  er, 0, sizeof(wr
25a60 69 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 20  iter));..       
25a70 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
25a80 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73  Docid(&out, iLas
25a90 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69  tRowid, i2.iRowi
25aa0 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
25ab0 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29  BufferZero(&tmp)
25ac0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25ad0 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
25ae0 26 70 2d 3e 72 63 2c 20 26 74 6d 70 2c 20 69 31  &p->rc, &tmp, i1
25af0 2e 6e 50 6f 73 6c 69 73 74 20 2b 20 69 32 2e 6e  .nPoslist + i2.n
25b00 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Poslist);.      
25b10 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
25b20 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  eak;..        sq
25b30 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
25b40 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50  Next64(a1, i1.nP
25b50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20  oslist, &iOff1, 
25b60 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20  &iPos1);.       
25b70 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
25b80 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
25b90 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
25ba0 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20  2, &iPos2);.    
25bb0 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73      assert( iPos
25bc0 31 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30  1>=0 && iPos2>=0
25bd0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
25be0 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a   iPos1<iPos2 ){.
25bf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25c00 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
25c10 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
25c20 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20  rev, iPos1);.   
25c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
25c40 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
25c50 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  a1, i1.nPoslist,
25c60 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29   &iOff1, &iPos1)
25c70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25c80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25c90 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66  e3Fts5PoslistSaf
25ca0 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69  eAppend(&tmp, &i
25cb0 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20  Prev, iPos2);.  
25cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
25cd0 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
25ce0 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  (a2, i2.nPoslist
25cf0 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32  , &iOff2, &iPos2
25d00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
25d10 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e        if( iPos1>
25d20 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30 20 29  =0 && iPos2>=0 )
25d30 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
25d40 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20  e( 1 ){.        
25d50 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50      if( iPos1<iP
25d60 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os2 ){.         
25d70 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d       if( iPos1!=
25d80 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
25d90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25da0 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
25db0 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72  ppend(&tmp, &iPr
25dc0 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20  ev, iPos1);.    
25dd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25de0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25df0 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
25e00 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69  64(a1, i1.nPosli
25e10 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f  st, &iOff1, &iPo
25e20 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s1);.           
25e30 20 20 20 69 66 28 20 69 50 6f 73 31 3c 30 20 29     if( iPos1<0 )
25e40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
25e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25e60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25e70 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29 3b   iPos2!=iPrev );
25e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
25e90 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
25ea0 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
25eb0 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29  , &iPrev, iPos2)
25ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25ed0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
25ee0 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e  stNext64(a2, i2.
25ef0 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32  nPoslist, &iOff2
25f00 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  , &iPos2);.     
25f10 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
25f20 73 32 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s2<0 ) break;.  
25f30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25f50 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  }..        if( i
25f60 50 6f 73 31 3e 3d 30 20 29 7b 0a 20 20 20 20 20  Pos1>=0 ){.     
25f70 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d       if( iPos1!=
25f80 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
25f90 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
25fa0 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
25fb0 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
25fc0 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
25fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74    }.          ft
25fe0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
25ff0 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20 26 61 31  ndBlob(&tmp, &a1
26000 5b 69 4f 66 66 31 5d 2c 20 69 31 2e 6e 50 6f 73  [iOff1], i1.nPos
26010 6c 69 73 74 2d 69 4f 66 66 31 29 3b 0a 20 20 20  list-iOff1);.   
26020 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50        assert( iP
26040 6f 73 32 3e 3d 30 20 26 26 20 69 50 6f 73 32 21  os2>=0 && iPos2!
26050 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20  =iPrev );.      
26060 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26070 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
26080 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
26090 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos2);.         
260a0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
260b0 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20  ppendBlob(&tmp, 
260c0 26 61 32 5b 69 4f 66 66 32 5d 2c 20 69 32 2e 6e  &a2[iOff2], i2.n
260d0 50 6f 73 6c 69 73 74 2d 69 4f 66 66 32 29 3b 0a  Poslist-iOff2);.
260e0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
260f0 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49     /* WRITEPOSLI
26100 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20  STSIZE */.      
26110 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
26120 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75  AppendVarint(&ou
26130 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20  t, tmp.n * 2);. 
26140 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
26150 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
26160 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70  &out, tmp.p, tmp
26170 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .n);.        fts
26180 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
26190 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66  (&i1);.        f
261a0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
261b0 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20  xt(&i2);.       
261c0 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74   if( i1.aPoslist
261d0 3d 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69  ==0 || i2.aPosli
261e0 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  st==0 ) break;. 
261f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
26200 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73    if( i1.aPoslis
26210 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  t ){.      fts5M
26220 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
26230 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
26240 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i1.iRowid);.  
26250 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
26260 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75  feAppendBlob(&ou
26270 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20  t, i1.aPoslist, 
26280 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e 61 50 6f  i1.aEof - i1.aPo
26290 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  slist);.    }.  
262a0 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e 61 50    else if( i2.aP
262b0 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oslist ){.      
262c0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
262d0 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
262e0 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
262f0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
26300 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
26310 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c  b(&out, i2.aPosl
26320 69 73 74 2c 20 69 32 2e 61 45 6f 66 20 2d 20 69  ist, i2.aEof - i
26330 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  2.aPoslist);.   
26340 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
26350 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31  erSet(&p->rc, p1
26360 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b  , out.n, out.p);
26370 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
26380 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66  ree(&tmp);.    f
26390 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f  ts5BufferFree(&o
263a0 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ut);.  }.}..stat
263b0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75  ic void fts5Setu
263c0 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46  pPrefixIter(.  F
263d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
263f0 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20  * Index to read 
26400 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44  from */.  int bD
26410 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  esc,            
26420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
26430 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20  e for "ORDER BY 
26440 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20  rowid DESC" */. 
26450 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65   const u8 *pToke
26460 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
26470 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
26480 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20  ining prefix to 
26490 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  match */.  int n
264a0 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
264b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
264c0 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f  ze of buffer pTo
264d0 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ken in bytes */.
264e0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
264f0 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
26500 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
26510 74 63 68 65 73 20 74 6f 20 74 68 65 73 65 20 63  tches to these c
26520 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35  olumns */.  Fts5
26530 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
26540 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
26550 65 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29  ew iterator */.)
26560 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
26570 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74  e *pStruct;.  Ft
26580 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a  s5Buffer *aBuf;.
26590 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66    const int nBuf
265a0 20 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28   = 32;..  void (
265b0 2a 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64  *xMerge)(Fts5Ind
265c0 65 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  ex*, Fts5Buffer*
265d0 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a  , Fts5Buffer*);.
265e0 20 20 76 6f 69 64 20 28 2a 78 41 70 70 65 6e 64    void (*xAppend
265f0 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36  )(Fts5Index*, i6
26600 34 2c 20 46 74 73 35 49 74 65 72 2a 2c 20 46 74  4, Fts5Iter*, Ft
26610 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66  s5Buffer*);.  if
26620 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
26630 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
26640 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78  IL_NONE ){.    x
26650 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67  Merge = fts5Merg
26660 65 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20  eRowidLists;.   
26670 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41   xAppend = fts5A
26680 70 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65  ppendRowid;.  }e
26690 6c 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20  lse{.    xMerge 
266a0 3d 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69  = fts5MergePrefi
266b0 78 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70  xLists;.    xApp
266c0 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64  end = fts5Append
266d0 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Poslist;.  }..  
266e0 61 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66  aBuf = (Fts5Buff
266f0 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
26700 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
26710 42 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20  Buffer)*nBuf);. 
26720 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
26730 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
26740 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20  ..  if( aBuf && 
26750 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63  pStruct ){.    c
26760 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
26770 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
26780 5f 53 43 41 4e 20 0a 20 20 20 20 20 20 20 20 20  _SCAN .         
26790 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53             | FTS
267a0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49  5INDEX_QUERY_SKI
267b0 50 45 4d 50 54 59 20 0a 20 20 20 20 20 20 20 20  PEMPTY .        
267c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54              | FT
267d0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
267e0 4f 55 54 50 55 54 3b 0a 20 20 20 20 69 6e 74 20  OUTPUT;.    int 
267f0 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74  i;.    i64 iLast
26800 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46  Rowid = 0;.    F
26810 74 73 35 49 74 65 72 20 2a 70 31 20 3d 20 30 3b  ts5Iter *p1 = 0;
26820 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
26830 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20   used to gather 
26840 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20  data from index 
26850 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  */.    Fts5Data 
26860 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35  *pData;.    Fts5
26870 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a  Buffer doclist;.
26880 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
26890 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65   = 1;..    memse
268a0 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73  t(&doclist, 0, s
268b0 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b  izeof(doclist));
268c0 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
268d0 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
268e0 2c 20 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74  , flags, pColset
268f0 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
26900 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20  , -1, 0, &p1);. 
26910 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75     fts5IterSetOu
26920 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70  tputCb(&p->rc, p
26930 31 29 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20  1);.    for( /* 
26940 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20  no-op */ ;.     
26950 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
26960 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20  Eof(p, p1)==0;. 
26970 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
26980 49 74 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c  IterNext2(p, p1,
26990 20 26 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20   &bNewTerm).    
269a0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
269b0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 31  Iter *pSeg = &p1
269c0 2d 3e 61 53 65 67 5b 20 70 31 2d 3e 61 46 69 72  ->aSeg[ p1->aFir
269d0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
269e0 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20        int nTerm 
269f0 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a  = pSeg->term.n;.
26a00 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
26a10 70 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65  pTerm = pSeg->te
26a20 72 6d 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e  rm.p;.      p1->
26a30 78 53 65 74 4f 75 74 70 75 74 73 28 70 31 2c 20  xSetOutputs(p1, 
26a40 70 53 65 67 29 3b 0a 0a 20 20 20 20 20 20 61 73  pSeg);..      as
26a50 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28  sert_nc( memcmp(
26a60 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d  pToken, pTerm, M
26a70 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d  IN(nToken, nTerm
26a80 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))<=0 );.      i
26a90 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20  f( bNewTerm ){. 
26aa0 20 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d         if( nTerm
26ab0 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d  <nToken || memcm
26ac0 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c  p(pToken, pTerm,
26ad0 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b   nToken) ) break
26ae0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
26af0 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44   if( p1->base.nD
26b00 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ata==0 ) continu
26b10 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31  e;..      if( p1
26b20 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69  ->base.iRowid<=i
26b30 4c 61 73 74 52 6f 77 69 64 20 26 26 20 64 6f 63  LastRowid && doc
26b40 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  list.n>0 ){.    
26b50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e      for(i=0; p->
26b60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26b70 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29   doclist.n; i++)
26b80 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
26b90 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20  rt( i<nBuf );.  
26ba0 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66          if( aBuf
26bb0 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  [i].n==0 ){.    
26bc0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
26bd0 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c  erSwap(&doclist,
26be0 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
26bf0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
26c00 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29  erZero(&doclist)
26c10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
26c20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  e{.            x
26c30 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73  Merge(p, &doclis
26c40 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
26c50 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
26c60 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69  fferZero(&aBuf[i
26c70 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
26c80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26c90 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30    iLastRowid = 0
26ca0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
26cb0 20 78 41 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e   xAppend(p, p1->
26cc0 62 61 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73  base.iRowid-iLas
26cd0 74 52 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f 63  tRowid, p1, &doc
26ce0 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 4c 61  list);.      iLa
26cf0 73 74 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61  stRowid = p1->ba
26d00 73 65 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d  se.iRowid;.    }
26d10 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
26d20 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nBuf; i++){.   
26d30 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
26d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26d50 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f     xMerge(p, &do
26d60 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
26d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26d80 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
26d90 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aBuf[i]);.    }.
26da0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
26db0 72 46 72 65 65 28 70 31 29 3b 0a 0a 20 20 20 20  rFree(p1);..    
26dc0 70 44 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d  pData = fts5IdxM
26dd0 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
26de0 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c  Fts5Data) + docl
26df0 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20  ist.n);.    if( 
26e00 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70  pData ){.      p
26e10 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26  Data->p = (u8*)&
26e20 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20  pData[1];.      
26e30 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74  pData->nn = pDat
26e40 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c  a->szLeaf = docl
26e50 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d  ist.n;.      mem
26e60 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f  cpy(pData->p, do
26e70 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74  clist.p, doclist
26e80 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  .n);.      fts5M
26e90 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20  ultiIterNew2(p, 
26ea0 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70  pData, bDesc, pp
26eb0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Iter);.    }.   
26ec0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
26ed0 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a  &doclist);.  }..
26ee0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
26ef0 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
26f00 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
26f10 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  aBuf);.}.../*.**
26f20 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   Indicate that a
26f30 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ll subsequent ca
26f40 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lls to sqlite3Ft
26f50 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70  s5IndexWrite() p
26f60 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65  ertain.** to the
26f70 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72   document with r
26f80 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a  owid iRowid..*/.
26f90 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
26fa0 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46  ndexBeginWrite(F
26fb0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
26fc0 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52   bDelete, i64 iR
26fd0 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28  owid){.  assert(
26fe0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
26ff0 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  K );..  /* Alloc
27000 61 74 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ate the hash tab
27010 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  le if it has not
27020 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
27030 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28  located */.  if(
27040 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a   p->pHash==0 ){.
27050 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
27060 74 65 33 46 74 73 35 48 61 73 68 4e 65 77 28 70  te3Fts5HashNew(p
27070 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70  ->pConfig, &p->p
27080 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69  Hash, &p->nPendi
27090 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20  ngData);.  }..  
270a0 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61 73  /* Flush the has
270b0 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20  h table to disk 
270c0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
270d0 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69   if( iRowid<p->i
270e0 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20 7c  WriteRowid .   |
270f0 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57  | (iRowid==p->iW
27100 72 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d 3e  riteRowid && p->
27110 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c  bDelete==0).   |
27120 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  | (p->nPendingDa
27130 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ta > p->pConfig-
27140 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20 20 29  >nHashSize) .  )
27150 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 46  {.    fts5IndexF
27160 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  lush(p);.  }..  
27170 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d  p->iWriteRowid =
27180 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44   iRowid;.  p->bD
27190 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b  elete = bDelete;
271a0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
271b0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
271c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61  ./*.** Commit da
271d0 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  ta to disk..*/.i
271e0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
271f0 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65  dexSync(Fts5Inde
27200 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  x *p, int bCommi
27210 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  t){.  assert( p-
27220 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
27230 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ;.  fts5IndexFlu
27240 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f  sh(p);.  if( bCo
27250 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65  mmit ) fts5Close
27260 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74  Reader(p);.  ret
27270 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
27280 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
27290 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74   Discard any dat
272a0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
272b0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
272c0 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72  ables. Do not wr
272d0 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65  ite it.** to the
272e0 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
272f0 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20  ionally, assume 
27300 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
27310 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a  s of the %_data.
27320 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76  ** table may hav
27330 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73  e changed on dis
27340 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d  k. So any in-mem
27350 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f  ory caches of %_
27360 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73  data .** records
27370 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64   must be invalid
27380 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
27390 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c  ite3Fts5IndexRol
273a0 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20  lback(Fts5Index 
273b0 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65  *p){.  fts5Close
273c0 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73  Reader(p);.  fts
273d0 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
273e0 61 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  a(p);.  fts5Stru
273f0 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28  ctureInvalidate(
27400 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74 28  p);.  /* assert(
27410 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
27420 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74 75 72 6e  K ); */.  return
27430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27440 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
27450 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74  table is complet
27460 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74  ely empty when t
27470 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27480 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20  called. This.** 
27490 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
274a0 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20 69  es it with the i
274b0 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72 65  nitial structure
274c0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
274d0 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20  h index,.** and 
274e0 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73  the initial vers
274f0 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72  ion of the "aver
27500 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61 20  ages" record (a 
27510 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e  zero-byte blob).
27520 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
27530 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46  ts5IndexReinit(F
27540 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
27550 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73 3b  Fts5Structure s;
27560 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
27570 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20  Invalidate(p);. 
27580 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
27590 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
275a0 75 72 65 29 29 3b 0a 20 20 66 74 73 35 44 61 74  ure));.  fts5Dat
275b0 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41  aWrite(p, FTS5_A
275c0 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 28  VERAGES_ROWID, (
275d0 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29  const u8*)"", 0)
275e0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
275f0 65 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 20  eWrite(p, &s);. 
27600 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
27610 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
27620 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
27630 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
27640 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65  . If the bCreate
27650 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
27660 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64  e, create.** and
27670 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
27680 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74  underlying %_dat
27690 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
276a0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
276b0 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
276c0 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
276d0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
276e0 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77  TE_OK..** Otherw
276f0 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ise, set *pp to 
27700 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20  NULL and return 
27710 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
27720 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
27730 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
27740 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  n(.  Fts5Config 
27750 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74  *pConfig, .  int
27760 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73   bCreate, .  Fts
27770 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63  5Index **pp,.  c
27780 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
27790 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
277a0 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  _OK;.  Fts5Index
277b0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
277c0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
277d0 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d  ject */..  *pp =
277e0 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a   p = (Fts5Index*
277f0 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
27800 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
27810 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a  of(Fts5Index));.
27820 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27830 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43  _OK ){.    p->pC
27840 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b  onfig = pConfig;
27850 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  .    p->nWorkUni
27860 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e  t = FTS5_WORK_UN
27870 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61  IT;.    p->zData
27880 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Tbl = sqlite3Fts
27890 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25  5Mprintf(&rc, "%
278a0 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67  s_data", pConfig
278b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
278c0 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26  ( p->zDataTbl &&
278d0 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20   bCreate ){.    
278e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
278f0 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20  s5CreateTable(. 
27900 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
27910 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e  , "data", "id IN
27920 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
27930 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20  Y, block BLOB", 
27940 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29  0, pzErr.      )
27950 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
27960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27970 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27980 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
27990 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c  (pConfig, "idx",
279a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73   .            "s
279b0 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f  egid, term, pgno
279c0 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65  , PRIMARY KEY(se
279d0 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20  gid, term)", .  
279e0 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45            1, pzE
279f0 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  rr.        );.  
27a00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
27a10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27a20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
27a30 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
27a40 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  init(p);.      }
27a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
27a60 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
27a70 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
27a80 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
27a90 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
27aa0 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
27ab0 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30  (p);.    *pp = 0
27ac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27ad0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
27ae0 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65  e a handle opene
27af0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
27b00 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46  call to sqlite3F
27b10 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a  ts5IndexOpen()..
27b20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
27b30 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73  s5IndexClose(Fts
27b40 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
27b50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27b60 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
27b70 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
27b80 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74  der==0 );.    ft
27b90 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
27ba0 69 64 61 74 65 28 70 29 3b 0a 20 20 20 20 73 71  idate(p);.    sq
27bb0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
27bc0 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  ->pWriter);.    
27bd0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
27be0 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
27bf0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
27c00 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65  ize(p->pIdxWrite
27c10 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
27c20 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
27c30 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71  Deleter);.    sq
27c40 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
27c50 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20  ->pIdxSelect);. 
27c60 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
27c70 69 7a 65 28 70 2d 3e 70 44 61 74 61 56 65 72 73  ize(p->pDataVers
27c80 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ion);.    sqlite
27c90 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70 2d  3Fts5HashFree(p-
27ca0 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c  >pHash);.    sql
27cb0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61  ite3_free(p->zDa
27cc0 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69  taTbl);.    sqli
27cd0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
27ce0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27cf0 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
27d00 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  p points to a bu
27d10 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
27d20 75 74 66 2d 38 20 74 65 78 74 20 74 68 61 74 20  utf-8 text that 
27d30 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a  is n bytes in .*
27d40 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74  * size. Return t
27d50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
27d60 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72 20  es in the nChar 
27d70 63 68 61 72 61 63 74 65 72 20 70 72 65 66 69 78  character prefix
27d80 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66 65   of the.** buffe
27d90 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72 65  r, or 0 if there
27da0 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e   are less than n
27db0 43 68 61 72 20 63 68 61 72 61 63 74 65 72 73 20  Char characters 
27dc0 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 69 6e 74  in total..*/.int
27dd0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27de0 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
27df0 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
27e00 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42 79 74 65  *p, .  int nByte
27e10 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61 72 0a 29  , .  int nChar.)
27e20 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
27e30 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
27e40 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
27e50 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79  {.    if( n>=nBy
27e60 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  te ) return 0;  
27e70 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e      /* Input con
27e80 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
27e90 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a   nChar chars */.
27ea0 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
27eb0 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30  d char)p[n++]>=0
27ec0 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69  xc0 ){.      whi
27ed0 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30  le( (p[n] & 0xc0
27ee0 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20  )==0x80 ) n++;. 
27ef0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
27f00 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49  n n;.}../*.** pI
27f10 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63  n is a UTF-8 enc
27f20 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e  oded string, nIn
27f30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
27f40 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
27f50 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20  r of.** unicode 
27f60 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
27f70 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
27f80 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
27f90 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63  xCharlen(const c
27fa0 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49  har *pIn, int nI
27fb0 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20  n){.  int nChar 
27fc0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
27fd0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
27fe0 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a  while( i<nIn ){.
27ff0 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
28000 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e  d char)pIn[i++]>
28010 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77  =0xc0 ){.      w
28020 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28  hile( i<nIn && (
28030 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d  pIn[i] & 0xc0)==
28040 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20  0x80 ) i++;.    
28050 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20  }.    nChar++;. 
28060 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61   }.  return nCha
28070 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  r;.}../*.** Inse
28080 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74  rt or remove dat
28090 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  a to or from the
280a0 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d   index. Each tim
280b0 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20  e a document is 
280c0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20  .** added to or 
280d0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
280e0 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e   index, this fun
280f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
28100 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74  one or more.** t
28110 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  imes..**.** For 
28120 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75  an insert, it mu
28130 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  st be called onc
28140 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e  e for each token
28150 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75   in the new docu
28160 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ment..** If the 
28170 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64  operation is a d
28180 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62  elete, it must b
28190 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61  e called (at lea
281a0 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  st) once for eac
281b0 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65  h.** unique toke
281c0 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  n in the documen
281d0 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76  t with an iCol v
281e0 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a  alue less than z
281f0 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a  ero. The iPos.**
28200 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e   argument is ign
28210 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74  ored for a delet
28220 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
28230 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
28240 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
28250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28260 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
28270 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
28280 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282a0 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70  Column token app
282b0 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20  ears in (-ve -> 
282c0 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74  delete) */.  int
282d0 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282f0 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
28300 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20  n within column 
28310 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
28320 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
28330 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
28340 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
28350 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
28360 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
28390 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
283a0 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  gh indexes */.  
283b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
283c0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
283d0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
283e0 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
283f0 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
28400 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nfig;..  assert(
28410 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
28420 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  K );.  assert( (
28430 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c  iCol<0)==p->bDel
28440 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  ete );..  /* Add
28450 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68   the entry to th
28460 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64  e main terms ind
28470 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ex. */.  rc = sq
28480 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
28490 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61  te(.      p->pHa
284a0 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  sh, p->iWriteRow
284b0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
284c0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
284d0 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
284e0 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  .  );..  for(i=0
284f0 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  ; i<pConfig->nPr
28500 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49  efix && rc==SQLI
28510 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
28520 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68 61 72   const int nChar
28530 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65   = pConfig->aPre
28540 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  fix[i];.    int 
28550 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46  nByte = sqlite3F
28560 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54  ts5IndexCharlenT
28570 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c  oBytelen(pToken,
28580 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72 29 3b   nToken, nChar);
28590 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
285a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
285b0 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
285c0 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20  e(p->pHash, .   
285d0 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65         p->iWrite
285e0 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
285f0 73 2c 20 28 63 68 61 72 29 28 46 54 53 35 5f 4d  s, (char)(FTS5_M
28600 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31 29 2c  AIN_PREFIX+i+1),
28610 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20   pToken,.       
28620 20 20 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29     nByte.      )
28630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
28640 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28650 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74  ** Open a new it
28660 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74  erator to iterat
28670 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77  e though all row
28680 69 64 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  id that match th
28690 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  e .** specified 
286a0 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
286b0 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  refix..*/.int sq
286c0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
286d0 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ery(.  Fts5Index
286e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
286f0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e         /* FTS in
28700 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  dex to query */.
28710 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
28720 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
28730 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70  , /* Token (or p
28740 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20  refix) to query 
28750 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  for */.  int fla
28760 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
28770 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
28780 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55   of FTS5INDEX_QU
28790 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20  ERY_X flags */. 
287a0 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
287b0 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
287c0 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20   /* Match these 
287d0 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a  columns only */.
287e0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
287f0 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20  **ppIter        
28800 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74    /* OUT: New it
28810 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  erator object */
28820 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  .){.  Fts5Config
28830 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
28840 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 74  Config;.  Fts5It
28850 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  er *pRet = 0;.  
28860 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d  Fts5Buffer buf =
28870 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f   {0, 0, 0};..  /
28880 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 53  * If the QUERY_S
28890 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c  CAN flag is set,
288a0 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
288b0 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20   must be clear. 
288c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
288d0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
288e0 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c  QUERY_SCAN)==0 |
288f0 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44  | flags==FTS5IND
28900 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 29 3b  EX_QUERY_SCAN );
28910 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ..  if( sqlite3F
28920 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
28930 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b  ->rc, &buf, nTok
28940 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  en+1)==0 ){.    
28950 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20  int iIdx = 0;   
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28970 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72 63 68   Index to search
28980 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   */.    memcpy(&
28990 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e  buf.p[1], pToken
289a0 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20  , nToken);..    
289b0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
289c0 69 63 68 20 69 6e 64 65 78 20 74 6f 20 73 65 61  ich index to sea
289d0 72 63 68 20 61 6e 64 20 73 65 74 20 69 49 64 78  rch and set iIdx
289e0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
289f0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   this.    ** is 
28a00 61 20 70 72 65 66 69 78 20 71 75 65 72 79 20 66  a prefix query f
28a10 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
28a20 73 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64 65  s no prefix inde
28a30 78 2c 20 73 65 74 20 69 49 64 78 20 74 6f 0a 20  x, set iIdx to. 
28a40 20 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68     ** greater th
28a50 61 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  an pConfig->nPre
28a60 66 69 78 20 74 6f 20 69 6e 64 69 63 61 74 65 20  fix to indicate 
28a70 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 77  that the query w
28a80 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73 61  ill be.    ** sa
28a90 74 69 73 66 69 65 64 20 62 79 20 73 63 61 6e 6e  tisfied by scann
28aa0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  ing multiple ter
28ab0 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69  ms in the main i
28ac0 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
28ad0 20 2a 2a 20 49 66 20 74 68 65 20 51 55 45 52 59   ** If the QUERY
28ae0 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67  _TEST_NOIDX flag
28af0 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20   was specified, 
28b00 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62  then this must b
28b10 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69  e a.    ** prefi
28b20 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64  x-query. Instead
28b30 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65 66   of using a pref
28b40 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65  ix-index (if one
28b50 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a   exists), .    *
28b60 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 70  * evaluate the p
28b70 72 65 66 69 78 20 71 75 65 72 79 20 75 73 69 6e  refix query usin
28b80 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69  g the main FTS i
28b90 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20 75 73  ndex. This is us
28ba0 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e  ed.    ** for in
28bb0 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  ternal sanity ch
28bc0 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e  ecking by the in
28bd0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e  tegrity-check in
28be0 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d   debug .    ** m
28bf0 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69  ode only.  */.#i
28c00 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
28c10 47 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69  G.    if( pConfi
28c20 67 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78 3d  g->bPrefixIndex=
28c30 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46  =0 || (flags & F
28c40 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54  TS5INDEX_QUERY_T
28c50 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20  EST_NOIDX) ){.  
28c60 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
28c70 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
28c80 45 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20  ERY_PREFIX );.  
28c90 20 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f      iIdx = 1+pCo
28ca0 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20  nfig->nPrefix;. 
28cb0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
28cc0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
28cd0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
28ce0 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20  PREFIX ){.      
28cf0 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35  int nChar = fts5
28d00 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f  IndexCharlen(pTo
28d10 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
28d20 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20      for(iIdx=1; 
28d30 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
28d40 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b  Prefix; iIdx++){
28d50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
28d60 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49  nfig->aPrefix[iI
28d70 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62  dx-1]==nChar ) b
28d80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
28d90 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64    }..    if( iId
28da0 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x<=pConfig->nPre
28db0 66 69 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  fix ){.      /* 
28dc0 53 74 72 61 69 67 68 74 20 69 6e 64 65 78 20 6c  Straight index l
28dd0 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 46  ookup */.      F
28de0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
28df0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
28e00 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
28e10 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 28      buf.p[0] = (
28e20 75 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52  u8)(FTS5_MAIN_PR
28e30 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20  EFIX + iIdx);.  
28e40 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20      if( pStruct 
28e50 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ){.        fts5M
28e60 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
28e70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 20 7c 20  Struct, flags | 
28e80 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
28e90 53 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20 20 20  SKIPEMPTY, .    
28ea0 20 20 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2c          pColset,
28eb0 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
28ec0 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a 20  , -1, 0, &pRet. 
28ed0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28ee0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
28ef0 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
28f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28f10 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63 61  se{.      /* Sca
28f20 6e 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73  n multiple terms
28f30 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64   in the main ind
28f40 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
28f50 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26  bDesc = (flags &
28f60 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
28f70 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20  _DESC)!=0;.     
28f80 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35   buf.p[0] = FTS5
28f90 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20  _MAIN_PREFIX;.  
28fa0 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65      fts5SetupPre
28fb0 66 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63  fixIter(p, bDesc
28fc0 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b  , buf.p, nToken+
28fd0 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65  1, pColset, &pRe
28fe0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
28ff0 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
29000 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f 6c  OK || pRet->pCol
29010 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
29020 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
29030 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 52 65 74  tCb(&p->rc, pRet
29040 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
29050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29060 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67  .        Fts5Seg
29070 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 52  Iter *pSeg = &pR
29080 65 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e 61  et->aSeg[pRet->a
29090 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
290a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
290b0 65 67 2d 3e 70 4c 65 61 66 20 29 20 70 52 65 74  eg->pLeaf ) pRet
290c0 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 52  ->xSetOutputs(pR
290d0 65 74 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  et, pSeg);.     
290e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
290f0 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
29100 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
29110 43 6c 6f 73 65 28 26 70 52 65 74 2d 3e 62 61 73  Close(&pRet->bas
29120 65 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  e);.      pRet =
29130 20 30 3b 0a 20 20 20 20 20 20 66 74 73 35 43 6c   0;.      fts5Cl
29140 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
29150 20 20 7d 0a 0a 20 20 20 20 2a 70 70 49 74 65 72    }..    *ppIter
29160 20 3d 20 26 70 52 65 74 2d 3e 62 61 73 65 3b 0a   = &pRet->base;.
29170 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
29180 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
29190 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74  .  }.  return ft
291a0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
291b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
291c0 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
291d0 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
291e0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
291f0 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f  nt is at EOF..*/
29200 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
29210 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
29220 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20   rowid. .*/.int 
29230 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
29240 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65  ext(Fts5IndexIte
29250 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a  r *pIndexIter){.
29260 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
29270 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70  r = (Fts5Iter*)p
29280 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 61 73 73  IndexIter;.  ass
29290 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
292a0 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
292b0 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69  K );.  fts5Multi
292c0 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e  IterNext(pIter->
292d0 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30  pIndex, pIter, 0
292e0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  , 0);.  return f
292f0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
29300 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
29310 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
29320 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
29330 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73  g term/rowid. Us
29340 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f  ed by the fts5vo
29350 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69  cab module..*/.i
29360 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
29370 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49  erNextScan(Fts5I
29380 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78  ndexIter *pIndex
29390 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74 65  Iter){.  Fts5Ite
293a0 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35  r *pIter = (Fts5
293b0 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72  Iter*)pIndexIter
293c0 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  ;.  Fts5Index *p
293d0 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
293e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
293f0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
29400 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
29410 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
29420 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
29430 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
29440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29450 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
29460 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
29470 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
29480 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
29490 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
294a0 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e  f && pSeg->term.
294b0 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f  p[0]!=FTS5_MAIN_
294c0 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20  PREFIX ){.      
294d0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
294e0 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  pSeg->pLeaf);.  
294f0 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20      pSeg->pLeaf 
29500 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72  = 0;.      pIter
29510 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b  ->base.bEof = 1;
29520 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
29530 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
29540 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
29550 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ex);.}../*.** Mo
29560 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  ve to the next m
29570 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68  atching rowid th
29580 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20  at occurs at or 
29590 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68  after iMatch. Th
295a0 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20  e.** definition 
295b0 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72 22  of "at or after"
295c0 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
295d0 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f  her this iterato
295e0 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e  r iterates.** in
295f0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65   ascending or de
29600 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f  scending rowid o
29610 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rder..*/.int sql
29620 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
29630 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74  From(Fts5IndexIt
29640 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c 20  er *pIndexIter, 
29650 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 46  i64 iMatch){.  F
29660 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ts5Iter *pIter =
29670 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64   (Fts5Iter*)pInd
29680 65 78 49 74 65 72 3b 0a 20 20 66 74 73 35 4d 75  exIter;.  fts5Mu
29690 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ltiIterNextFrom(
296a0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
296b0 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20  Iter, iMatch);. 
296c0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
296d0 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
296e0 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
296f0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
29700 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e  ent term..*/.con
29710 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
29720 46 74 73 35 49 74 65 72 54 65 72 6d 28 46 74 73  Fts5IterTerm(Fts
29730 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64  5IndexIter *pInd
29740 65 78 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  exIter, int *pn)
29750 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  {.  int n;.  con
29760 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
29770 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75  nst char*)fts5Mu
29780 6c 74 69 49 74 65 72 54 65 72 6d 28 28 46 74 73  ltiIterTerm((Fts
29790 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
297a0 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20  r, &n);.  *pn = 
297b0 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a  n-1;.  return &z
297c0 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  [1];.}../*.** Cl
297d0 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ose an iterator 
297e0 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72  opened by an ear
297f0 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  lier call to sql
29800 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
29810 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ry()..*/.void sq
29820 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
29830 73 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  se(Fts5IndexIter
29840 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20   *pIndexIter){. 
29850 20 69 66 28 20 70 49 6e 64 65 78 49 74 65 72 20   if( pIndexIter 
29860 29 7b 0a 20 20 20 20 46 74 73 35 49 74 65 72 20  ){.    Fts5Iter 
29870 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74  *pIter = (Fts5It
29880 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a  er*)pIndexIter;.
29890 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70      Fts5Index *p
298a0 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e 70  Index = pIter->p
298b0 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35 4d  Index;.    fts5M
298c0 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74  ultiIterFree(pIt
298d0 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f  er);.    fts5Clo
298e0 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78 29  seReader(pIndex)
298f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
29900 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74  ead and decode t
29910 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65  he "averages" re
29920 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64 61  cord from the da
29930 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50  tabase. .**.** P
29940 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65 20  arameter anSize 
29950 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
29960 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e   array of size n
29970 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20  Col, where nCol 
29980 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  is.** the number
29990 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64   of user defined
299a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
299b0 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  FTS table..*/.in
299c0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
299d0 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74  exGetAverages(Ft
299e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
299f0 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53  *pnRow, i64 *anS
29a00 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c  ize){.  int nCol
29a10 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   = p->pConfig->n
29a20 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61 20  Col;.  Fts5Data 
29a30 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f  *pData;..  *pnRo
29a40 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  w = 0;.  memset(
29a50 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f  anSize, 0, sizeo
29a60 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a  f(i64) * nCol);.
29a70 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
29a80 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 41  taRead(p, FTS5_A
29a90 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a  VERAGES_ROWID);.
29aa0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
29ab0 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d  ITE_OK && pData-
29ac0 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >nn ){.    int i
29ad0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43   = 0;.    int iC
29ae0 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73  ol;.    i += fts
29af0 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
29b00 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70  a->p[i], (u64*)p
29b10 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28 69  nRow);.    for(i
29b20 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e  Col=0; i<pData->
29b30 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b  nn && iCol<nCol;
29b40 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
29b50 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
29b60 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c  nt(&pData->p[i],
29b70 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69   (u64*)&anSize[i
29b80 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Col]);.    }.  }
29b90 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
29ba0 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65  ase(pData);.  re
29bb0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
29bc0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
29bd0 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75  * Replace the cu
29be0 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22  rrent "averages"
29bf0 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65   record with the
29c00 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
29c10 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70   buffer .** supp
29c20 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  lied as the seco
29c30 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
29c40 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
29c50 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28  ndexSetAverages(
29c60 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f  Fts5Index *p, co
29c70 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69  nst u8 *pData, i
29c80 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73  nt nData){.  ass
29c90 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
29ca0 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44  TE_OK );.  fts5D
29cb0 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
29cc0 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c  _AVERAGES_ROWID,
29cd0 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a   pData, nData);.
29ce0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
29cf0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
29d00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
29d10 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
29d20 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64   blocks this mod
29d30 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f  ule has read fro
29d40 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20  m the %_data.** 
29d50 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77  table since it w
29d60 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69  as created..*/.i
29d70 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
29d80 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64  dexReads(Fts5Ind
29d90 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ex *p){.  return
29da0 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a   p->nRead;.}../*
29db0 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62  .** Set the 32-b
29dc0 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  it cookie value 
29dd0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
29de0 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63  art of all struc
29df0 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73  ture .** records
29e00 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
29e10 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
29e20 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
29e30 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
29e40 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
29e50 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
29e60 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
29e70 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
29e80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29e90 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b  Fts5IndexSetCook
29ea0 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ie(Fts5Index *p,
29eb0 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e   int iNew){.  in
29ec0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ee0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
29ef0 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69  e */.  Fts5Confi
29f00 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
29f10 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43  pConfig;    /* C
29f20 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
29f30 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f  ect */.  u8 aCoo
29f40 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20  kie[4];         
29f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f60 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e   Binary represen
29f70 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a  tation of iNew *
29f80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
29f90 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20   *pBlob = 0;..  
29fa0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
29fb0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
29fc0 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61  lite3Fts5Put32(a
29fd0 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a  Cookie, iNew);..
29fe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
29ff0 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
2a000 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  ->db, pConfig->z
2a010 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c  Db, p->zDataTbl,
2a020 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c   .      "block",
2a030 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
2a040 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62  ROWID, 1, &pBlob
2a050 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
2a060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a070 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
2a080 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b  ite(pBlob, aCook
2a090 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72  ie, 4, 0);.    r
2a0a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
2a0b0 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20  _close(pBlob);. 
2a0c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2a0d0 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
2a0e0 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66  ts5IndexLoadConf
2a0f0 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ig(Fts5Index *p)
2a100 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
2a110 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53  e *pStruct;.  pS
2a120 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
2a130 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
2a140 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
2a150 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
2a160 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
2a170 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a  xReturn(p);.}...
2a180 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2a190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2a1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a210 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
2a220 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
2a230 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2a240 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  of the integrity
2a250 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74  -check .** funct
2a260 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a  ionality..*/../*
2a270 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d  .** Return a sim
2a280 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  ple checksum val
2a290 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ue based on the 
2a2a0 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36  arguments..*/.u6
2a2b0 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  4 sqlite3Fts5Ind
2a2c0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20  exEntryCksum(.  
2a2d0 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69  i64 iRowid, .  i
2a2e0 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20  nt iCol, .  int 
2a2f0 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64  iPos, .  int iId
2a300 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
2a310 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54  *pTerm,.  int nT
2a320 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erm.){.  int i;.
2a330 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77    u64 ret = iRow
2a340 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  id;.  ret += (re
2a350 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20  t<<3) + iCol;.  
2a360 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
2a370 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49  + iPos;.  if( iI
2a380 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28  dx>=0 ) ret += (
2a390 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f  ret<<3) + (FTS5_
2a3a0 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49  MAIN_PREFIX + iI
2a3b0 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  dx);.  for(i=0; 
2a3c0 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65  i<nTerm; i++) re
2a3d0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
2a3e0 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75  pTerm[i];.  retu
2a3f0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65  rn ret;.}..#ifde
2a400 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2a410 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2a420 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20  on is purely an 
2a430 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
2a440 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
2a450 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
2a460 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
2a470 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
2a480 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
2a490 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
2a4a0 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73  nstead, it tests
2a4b0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
2a4c0 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64  et of pgno/rowid
2a4d0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
2a4e0 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65  e .** visited re
2a4f0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2a500 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  her the doclist-
2a510 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64  index identified
2a520 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a   by parameters.*
2a530 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69  * iSegid/iLeaf i
2a540 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f  s iterated in fo
2a550 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73  rwards or revers
2a560 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  e order..*/.stat
2a570 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
2a580 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20 20  DlidxReverse(.  
2a590 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
2a5a0 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5c0 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74   /* Segment id t
2a5d0 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o load from */. 
2a5e0 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20   int iLeaf      
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a600 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74   /* Load doclist
2a610 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20  -index for this 
2a620 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  leaf */.){.  Fts
2a630 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
2a640 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b  dx = 0;.  u64 ck
2a650 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34  sum1 = 13;.  u64
2a660 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20   cksum2 = 13;.. 
2a670 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
2a680 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
2a690 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61   0, iSegid, iLea
2a6a0 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  f);.      fts5Dl
2a6b0 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
2a6c0 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
2a6d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
2a6e0 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29  t(p, pDlidx).  )
2a6f0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
2a700 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
2a710 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20  Rowid(pDlidx);. 
2a720 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74     int pgno = ft
2a730 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
2a740 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73  pDlidx);.    ass
2a750 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20  ert( pgno>iLeaf 
2a760 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d  );.    cksum1 +=
2a770 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29   iRowid + ((i64)
2a780 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20  pgno<<32);.  }. 
2a790 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
2a7a0 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
2a7b0 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  lidx = 0;..  for
2a7c0 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
2a7d0 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20  xIterInit(p, 1, 
2a7e0 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a  iSegid, iLeaf);.
2a7f0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2a800 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
2a810 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
2a820 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c  DlidxIterPrev(p,
2a830 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20   pDlidx).  ){.  
2a840 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66    i64 iRowid = f
2a850 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
2a860 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69  d(pDlidx);.    i
2a870 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c  nt pgno = fts5Dl
2a880 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
2a890 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dx);.    assert(
2a8a0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
2a8b0 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66  no(pDlidx)>iLeaf
2a8c0 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b   );.    cksum2 +
2a8d0 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
2a8e0 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
2a8f0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
2a900 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
2a910 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66  Dlidx = 0;..  if
2a920 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2a930 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b  OK && cksum1!=ck
2a940 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46  sum2 ) p->rc = F
2a950 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a  TS5_CORRUPT;.}..
2a960 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51  static int fts5Q
2a970 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73  ueryCksum(.  Fts
2a980 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a9a0 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63  Fts5 index objec
2a9b0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
2a9c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a9d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a9e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20     /* Index key 
2a9f0 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
2aa00 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64    /* Size of ind
2aa30 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20  ex key in bytes 
2aa40 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa60 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
2aa70 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  r Fts5IndexQuery
2aa80 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75   */.  u64 *pCksu
2aa90 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
2aaa0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2aab0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
2aac0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 74  */.){.  int eDet
2aad0 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
2aae0 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34  ->eDetail;.  u64
2aaf0 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d   cksum = *pCksum
2ab00 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ;.  Fts5IndexIte
2ab10 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20  r *pIter = 0;.  
2ab20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
2ab30 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 70  Fts5IndexQuery(p
2ab40 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30  , z, n, flags, 0
2ab50 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20 20 77 68  , &pIter);..  wh
2ab60 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2ab70 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  OK && 0==sqlite3
2ab80 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74 65  Fts5IterEof(pIte
2ab90 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20 72 6f  r) ){.    i64 ro
2aba0 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52 6f  wid = pIter->iRo
2abb0 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 65 44  wid;..    if( eD
2abc0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
2abd0 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
2abe0 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65   cksum ^= sqlite
2abf0 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2ac00 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20 30  ksum(rowid, 0, 0
2ac10 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20  , iIdx, z, n);. 
2ac20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ac30 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2ac40 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20  r sReader;.     
2ac50 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35   for(sqlite3Fts5
2ac60 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
2ac70 74 28 70 49 74 65 72 2d 3e 70 44 61 74 61 2c 20  t(pIter->pData, 
2ac80 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26 73  pIter->nData, &s
2ac90 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20  Reader);.       
2aca0 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d     sReader.bEof=
2acb0 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  =0;.          sq
2acc0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
2acd0 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61  ReaderNext(&sRea
2ace0 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  der).      ){.  
2acf0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
2ad00 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
2ad10 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a  (sReader.iPos);.
2ad20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
2ad30 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
2ad40 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29  ET(sReader.iPos)
2ad50 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
2ad60 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
2ad70 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f  dexEntryCksum(ro
2ad80 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c  wid, iCol, iOff,
2ad90 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20   iIdx, z, n);.  
2ada0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2adb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2adc0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2add0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
2ade0 65 78 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20  ext(pIter);.    
2adf0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46  }.  }.  sqlite3F
2ae00 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49 74  ts5IterClose(pIt
2ae10 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20  er);..  *pCksum 
2ae20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72  = cksum;.  retur
2ae30 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2ae40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2ae50 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20   also purely an 
2ae60 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
2ae70 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
2ae80 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
2ae90 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
2aea0 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
2aeb0 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
2aec0 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74  any way..*/.stat
2aed0 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
2aee0 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
2aef0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66  x *p, .  Fts5Buf
2af00 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20  fer *pPrev,     
2af10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
2af20 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63  ious term */.  c
2af30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
2af40 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  t n,           /
2af50 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74  * Possibly new t
2af60 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  erm to test */. 
2af70 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20   u64 expected,. 
2af80 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a   u64 *pCksum.){.
2af90 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
2afa0 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e  ;.  if( pPrev->n
2afb0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  ==0 ){.    fts5B
2afc0 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
2afd0 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
2afe0 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  8*)z);.  }else. 
2aff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b000 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21  OK && (pPrev->n!
2b010 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72  =n || memcmp(pPr
2b020 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b  ev->p, z, n)) ){
2b030 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20  .    u64 cksum3 
2b040 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63  = *pCksum;.    c
2b050 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
2b060 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2b070 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f  &pPrev->p[1];  /
2b080 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66  * term sans pref
2b090 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ix-byte */.    i
2b0a0 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76  nt nTerm = pPrev
2b0b0 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20  ->n-1;          
2b0c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65    /* Size of zTe
2b0d0 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
2b0e0 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70     int iIdx = (p
2b0f0 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53  Prev->p[0] - FTS
2b100 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a  5_MAIN_PREFIX);.
2b110 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
2b120 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46  (iIdx==0 ? 0 : F
2b130 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
2b140 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20  REFIX);.    u64 
2b150 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34  ck1 = 0;.    u64
2b160 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f   ck2 = 0;..    /
2b170 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2b180 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
2b190 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45  d for ASC and DE
2b1a0 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20  SC queries are. 
2b1b0 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
2b1c0 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69  If not, call thi
2b1d0 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  s corruption.  *
2b1e0 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51  /.    rc = fts5Q
2b1f0 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
2b200 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
2b210 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20   flags, &ck1);. 
2b220 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
2b240 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
2b250 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
2b260 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
2b270 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
2b280 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
2b290 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
2b2a0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2b2b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
2b2c0 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
2b2d0 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f  _CORRUPT;..    /
2b2e0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70  * If this is a p
2b2f0 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65  refix query, che
2b300 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ck that the resu
2b310 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20  lts returned if 
2b320 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  the.    ** the i
2b330 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64  ndex is disabled
2b340 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49   are the same. I
2b350 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44  n both ASC and D
2b360 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20  ESC order. .    
2b370 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63  **.    ** This c
2b380 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65  heck may only be
2b390 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68   performed if th
2b3a0 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20  e hash table is 
2b3b0 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20  empty. This.    
2b3c0 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68  ** is because th
2b3d0 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c  e hash table onl
2b3e0 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e  y supports a sin
2b3f0 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20 61  gle scan query a
2b400 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c  t.    ** a time,
2b410 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69   and the multi-i
2b420 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68  ter loop from wh
2b430 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ich this functio
2b440 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20  n is called.    
2b450 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70 65  ** is already pe
2b460 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20  rforming such a 
2b470 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
2b480 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
2b490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2b4a0 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53   iIdx>0 && rc==S
2b4b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b4c0 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
2b4d0 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
2b4e0 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20  Y_TEST_NOIDX;.  
2b4f0 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
2b500 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
2b510 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2b520 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2b530 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
2b540 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b550 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
2b560 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
2b570 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
2b580 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20       if( iIdx>0 
2b590 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2b5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2b5b0 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
2b5c0 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
2b5d0 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51  OIDX|FTS5INDEX_Q
2b5e0 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20  UERY_DESC;.     
2b5f0 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20     ck2 = 0;.    
2b600 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
2b610 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
2b620 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
2b630 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20  , &ck2);.       
2b640 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b650 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
2b660 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
2b670 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
2b680 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d  }..    cksum3 ^=
2b690 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75   ck1;.    fts5Bu
2b6a0 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72  fferSet(&rc, pPr
2b6b0 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38  ev, n, (const u8
2b6c0 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  *)z);..    if( r
2b6d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b6e0 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64  cksum3!=expected
2b6f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46   ){.      rc = F
2b700 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2b710 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d   }.    *pCksum =
2b720 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70   cksum3;.  }.  p
2b730 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23  ->rc = rc;.}. .#
2b740 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
2b750 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
2b760 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69  se(x,y,z).# defi
2b770 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  ne fts5TestTerm(
2b780 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
2b790 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
2b7a0 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31   that:.**.**   1
2b7b0 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20  ) All leaves of 
2b7c0 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46 69  pSeg between iFi
2b7d0 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69  rst and iLast (i
2b7e0 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20  nclusive) exist 
2b7f0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74  and.**      cont
2b800 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a  ain zero terms..
2b810 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76  **   2) All leav
2b820 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65  es of pSeg betwe
2b830 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20  en iNoRowid and 
2b840 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65  iLast (inclusive
2b850 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20  ) exist and.**  
2b860 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f      contain zero
2b870 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74   rowids..*/.stat
2b880 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
2b890 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45  xIntegrityCheckE
2b8a0 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65  mpty(.  Fts5Inde
2b8b0 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75  x *p,.  Fts5Stru
2b8c0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
2b8d0 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg,     /* Segme
2b8e0 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
2b8f0 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
2b900 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
2b910 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64  ,.  int iNoRowid
2b920 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b  ,.  int iLast.){
2b930 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
2b940 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2b950 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
2b960 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
2b970 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
2b980 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20  .  ** (a) exist 
2b990 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
2b9a0 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66  no terms. */.  f
2b9b0 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e  or(i=iFirst; p->
2b9c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b9d0 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b   i<=iLast; i++){
2b9e0 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
2b9f0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
2ba00 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
2ba10 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
2ba20 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20  iSegid, i));.   
2ba30 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
2ba40 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61      if( !fts5Lea
2ba50 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61  fIsTermless(pLea
2ba60 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  f) ) p->rc = FTS
2ba70 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2ba80 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64   if( i>=iNoRowid
2ba90 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46   && 0!=fts5LeafF
2baa0 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
2bab0 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
2bac0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2bad0 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
2bae0 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
2baf0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
2bb00 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
2bb10 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64  eckPgidx(Fts5Ind
2bb20 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20  ex *p, Fts5Data 
2bb30 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69  *pLeaf){.  int i
2bb40 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69  TermOff = 0;.  i
2bb50 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75  nt ii;..  Fts5Bu
2bb60 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30  ffer buf1 = {0,0
2bb70 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65  ,0};.  Fts5Buffe
2bb80 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d  r buf2 = {0,0,0}
2bb90 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d  ;..  ii = pLeaf-
2bba0 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65  >szLeaf;.  while
2bbb0 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26  ( ii<pLeaf->nn &
2bbc0 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
2bbd0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  OK ){.    int re
2bbe0 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  s;.    int iOff;
2bbf0 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a  .    int nIncr;.
2bc00 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47  .    ii += fts5G
2bc10 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2bc20 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29  f->p[ii], nIncr)
2bc30 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b  ;.    iTermOff +
2bc40 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66  = nIncr;.    iOf
2bc50 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20  f = iTermOff;.. 
2bc60 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
2bc70 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2bc80 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2bc90 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
2bca0 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
2bcb0 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20  ==nIncr ){.     
2bcc0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20   int nByte;.    
2bcd0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2bce0 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
2bcf0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  ->p[iOff], nByte
2bd00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f  );.      if( (iO
2bd10 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d  ff+nByte)>pLeaf-
2bd20 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
2bd30 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2bd40 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2bd50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
2bd60 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
2bd70 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65  rc, &buf1, nByte
2bd80 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  , &pLeaf->p[iOff
2bd90 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2bda0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2bdb0 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20   nKeep, nByte;. 
2bdc0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2bdd0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2bde0 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b  eaf->p[iOff], nK
2bdf0 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  eep);.      iOff
2be00 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2be10 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
2be20 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
2be30 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66     if( nKeep>buf
2be40 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79  1.n || (iOff+nBy
2be50 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  te)>pLeaf->szLea
2be60 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
2be70 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2be80 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
2be90 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d          buf1.n =
2bea0 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20   nKeep;.        
2beb0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
2bec0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
2bed0 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61  f1, nByte, &pLea
2bee0 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  f->p[iOff]);.   
2bef0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
2bf00 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2bf10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
2bf20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  = fts5BufferComp
2bf30 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66 32  are(&buf1, &buf2
2bf40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2bf50 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  es<=0 ) p->rc = 
2bf60 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2bf70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2bf80 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
2bf90 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66  ->rc, &buf2, buf
2bfa0 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20  1.n, buf1.p);.  
2bfb0 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  }..  fts5BufferF
2bfc0 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74  ree(&buf1);.  ft
2bfd0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
2bfe0 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  f2);.}..static v
2bff0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
2c000 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
2c010 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nt(.  Fts5Index 
2c020 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2c030 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
2c040 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
2c050 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
2c060 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20  egment *pSeg    
2c070 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
2c080 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63  check internal c
2c090 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b  onsistency */.){
2c0a0 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2c0b0 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
2c0c0 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  fig;.  sqlite3_s
2c0d0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
2c0e0 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74    int rc2;.  int
2c0f0 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20   iIdxPrevLeaf = 
2c100 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d  pSeg->pgnoFirst-
2c110 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50  1;.  int iDlidxP
2c120 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e  revLeaf = pSeg->
2c130 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28  pgnoLast;..  if(
2c140 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2c150 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
2c160 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
2c170 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c  eStmt(p, &pStmt,
2c180 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2c190 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  (.      "SELECT 
2c1a0 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67  segid, term, (pg
2c1b0 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29  no>>1), (pgno&1)
2c1c0 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78   FROM %Q.'%q_idx
2c1d0 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64  ' WHERE segid=%d
2c1e0 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  ",.      pConfig
2c1f0 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
2c200 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65  zName, pSeg->iSe
2c210 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  gid.  ));..  /* 
2c220 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
2c230 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
2c240 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c  rchy.  */.  whil
2c250 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
2c260 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
2c270 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
2c280 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36  pStmt) ){.    i6
2c290 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 iRow;         
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c2b0 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65  owid for this le
2c2c0 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61  af */.    Fts5Da
2c2d0 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
2c2e0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
2c2f0 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
2c300 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65  ..    int nIdxTe
2c310 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rm = sqlite3_col
2c320 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
2c330 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   1);.    const c
2c340 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20  har *zIdxTerm = 
2c350 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
2c360 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2c370 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
2c380 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73  int iIdxLeaf = s
2c390 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2c3a0 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  t(pStmt, 2);.   
2c3b0 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d   int bIdxDlidx =
2c3c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2c3d0 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a  int(pStmt, 3);..
2c3e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
2c3f0 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
2c400 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2c410 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
2c420 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
2c430 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
2c440 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
2c450 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
2c460 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
2c470 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c     if( iIdxLeaf<
2c480 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
2c490 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c4a0 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d  iRow = FTS5_SEGM
2c4b0 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
2c4c0 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
2c4d0 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
2c4e0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
2c4f0 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Row);.    if( pL
2c500 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
2c510 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
2c520 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74  at the leaf cont
2c530 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
2c540 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74  e term, and that
2c550 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20   it is equal.   
2c560 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72   ** to or larger
2c570 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d   than the split-
2c580 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e  key in zIdxTerm.
2c590 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61    Also check tha
2c5a0 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a  t if there.    *
2c5b0 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69  * is also a rowi
2c5c0 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e  d pointer within
2c5d0 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68   the leaf page h
2c5e0 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73  eader, it points
2c5f0 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63   to a.    ** loc
2c600 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65  ation before the
2c610 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69   term.  */.    i
2c620 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c  f( pLeaf->nn<=pL
2c630 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2c640 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2c650 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2c660 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
2c670 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
2c680 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2c690 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20  t of first term 
2c6a0 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20  on leaf */.     
2c6b0 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20   int iRowidOff; 
2c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c6d0 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
2c6e0 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f  rowid on leaf */
2c6f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
2c700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c710 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
2c720 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79  rm on leaf in by
2c730 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tes */.      int
2c740 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
2c750 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
2c760 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61  arison of term a
2c770 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a  nd split-key */.
2c780 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74  .      iOff = ft
2c790 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
2c7a0 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
2c7b0 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
2c7c0 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
2c7d0 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
2c7e0 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d   if( iRowidOff>=
2c7f0 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  iOff ){.        
2c800 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2c810 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
2c820 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
2c830 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2c840 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
2c850 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  f], nTerm);.    
2c860 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70      res = memcmp
2c870 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
2c880 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28  , zIdxTerm, MIN(
2c890 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29  nTerm, nIdxTerm)
2c8a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2c8b0 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54  es==0 ) res = nT
2c8c0 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a  erm - nIdxTerm;.
2c8d0 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c          if( res<
2c8e0 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
2c8f0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2c900 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e 74  }..      fts5Int
2c910 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78  egrityCheckPgidx
2c920 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20  (p, pLeaf);.    
2c930 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
2c940 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
2c950 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
2c960 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  eak;..    /* Now
2c970 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
2c980 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76  iter.nEmpty leav
2c990 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  es following the
2c9a0 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20   current leaf.  
2c9b0 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61    ** (a) exist a
2c9c0 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e  nd (b) contain n
2c9d0 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20  o terms. */.    
2c9e0 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
2c9f0 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20  tyCheckEmpty(.  
2ca00 20 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20 69        p, pSeg, i
2ca10 49 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69  IdxPrevLeaf+1, i
2ca20 44 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31 2c  DlidxPrevLeaf+1,
2ca30 20 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20 20   iIdxLeaf-1.    
2ca40 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
2ca50 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
2ca60 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
2ca70 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63  doclist-index, c
2ca80 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f  heck that it loo
2ca90 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ks right. */.   
2caa0 20 69 66 28 20 62 49 64 78 44 6c 69 64 78 20 29   if( bIdxDlidx )
2cab0 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  {.      Fts5Dlid
2cac0 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
2cad0 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61  0;  /* For itera
2cae0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63  ting through doc
2caf0 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
2cb00 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61      int iPrevLea
2cb10 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20  f = iIdxLeaf;.  
2cb20 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
2cb30 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20   pSeg->iSegid;. 
2cb40 20 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 30       int iPg = 0
2cb50 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79  ;.      i64 iKey
2cb60 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c  ;..      for(pDl
2cb70 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
2cb80 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67  rInit(p, 0, iSeg
2cb90 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20  id, iIdxLeaf);. 
2cba0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
2cbb0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
2cbc0 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
2cbd0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
2cbe0 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a  Next(p, pDlidx).
2cbf0 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20        ){..      
2cc00 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72    /* Check any r
2cc10 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20  owid-less pages 
2cc20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
2cc30 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  e the current le
2cc40 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  af. */.        f
2cc50 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66  or(iPg=iPrevLeaf
2cc60 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69 64  +1; iPg<fts5Dlid
2cc70 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
2cc80 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20  ); iPg++){.     
2cc90 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35       iKey = FTS5
2cca0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
2ccb0 53 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20 20  Segid, iPg);.   
2ccc0 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
2ccd0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
2cce0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2ccf0 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
2cd00 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
2cd10 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
2cd20 66 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20 70  ff(pLeaf)!=0 ) p
2cd30 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2cd40 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UPT;.           
2cd50 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
2cd60 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
2cd70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2cd80 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66         iPrevLeaf
2cd90 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
2cda0 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
2cdb0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2cdc0 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61  that the leaf pa
2cdd0 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ge indicated by 
2cde0 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
2cdf0 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20  lly does.       
2ce00 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   ** contain the 
2ce10 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20  rowid suggested 
2ce20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a  by the same. */.
2ce30 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
2ce40 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2ce50 44 28 69 53 65 67 69 64 2c 20 69 50 72 65 76 4c  D(iSegid, iPrevL
2ce60 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  eaf);.        pL
2ce70 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
2ce80 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
2ce90 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
2cea0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
2ceb0 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
2cec0 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20    int iRowidOff 
2ced0 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
2cee0 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a  owidOff(pLeaf);.
2cef0 20 20 20 20 20 20 20 20 20 20 41 53 53 45 52 54            ASSERT
2cf00 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66  _SZLEAF_OK(pLeaf
2cf10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2cf20 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61   iRowidOff>=pLea
2cf30 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
2cf40 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
2cf50 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2cf60 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2cf70 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
2cf80 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  GetVarint(&pLeaf
2cf90 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20  ->p[iRowidOff], 
2cfa0 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cfc0 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69 64  iRowid!=fts5Dlid
2cfd0 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
2cfe0 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  x) ) p->rc = FTS
2cff0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2d000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d010 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
2d020 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
2d030 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
2d040 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66    iDlidxPrevLeaf
2d050 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66 74   = iPg;.      ft
2d060 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
2d070 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
2d080 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
2d090 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69  rse(p, iSegid, i
2d0a0 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d 65  IdxLeaf);.    }e
2d0b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69 64  lse{.      iDlid
2d0c0 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67  xPrevLeaf = pSeg
2d0d0 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  ->pgnoLast;.    
2d0e0 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
2d0f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f 63   there is no doc
2d100 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
2d110 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72 65    }..    iIdxPre
2d120 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66  vLeaf = iIdxLeaf
2d130 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73  ;.  }..  rc2 = s
2d140 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2d150 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d  pStmt);.  if( p-
2d160 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
2d170 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20   p->rc = rc2;.. 
2d180 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69 4c   /* Page iter.iL
2d190 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65 20  eaf must now be 
2d1a0 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c 65  the rightmost le
2d1b0 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20 73  af-page in the s
2d1c0 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30 0a  egment */.#if 0.
2d1d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2d1e0 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69  ITE_OK && iter.i
2d1f0 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f  Leaf!=pSeg->pgno
2d200 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72  Last ){.    p->r
2d210 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2d220 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
2d230 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72  ./*.** Run inter
2d240 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e  nal checks to en
2d250 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54  sure that the FT
2d260 53 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69  S index (a) is i
2d270 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f  nternally .** co
2d280 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29  nsistent and (b)
2d290 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65   contains entrie
2d2a0 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
2d2b0 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b  XOR of the check
2d2c0 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75  sums.** as calcu
2d2d0 6c 61 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  lated by sqlite3
2d2e0 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  Fts5IndexEntryCk
2d2f0 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a  sum() is cksum..
2d300 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
2d310 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
2d320 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e  ny of the intern
2d330 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20  al checks fail, 
2d340 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65  or if the.** che
2d350 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  cksum does not m
2d360 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c  atch. Return SQL
2d370 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68  ITE_OK if all ch
2d380 65 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75  ecks pass withou
2d390 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73  t.** error, or s
2d3a0 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65  ome other SQLite
2d3b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2d3c0 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e  nother error (e.
2d3d0 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72  g. OOM).** occur
2d3e0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2d3f0 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72  3Fts5IndexIntegr
2d400 69 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64  ityCheck(Fts5Ind
2d410 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d  ex *p, u64 cksum
2d420 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  ){.  int eDetail
2d430 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65   = p->pConfig->e
2d440 44 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b  Detail;.  u64 ck
2d450 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20  sum2 = 0;       
2d460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
2d470 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63  cksum based on c
2d480 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78  ontents of index
2d490 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  es */.  Fts5Buff
2d4a0 65 72 20 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c  er poslist = {0,
2d4b0 30 2c 30 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65  0,0};   /* Buffe
2d4c0 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61  r used to hold a
2d4d0 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74   poslist */.  Ft
2d4e0 73 35 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20  s5Iter *pIter;  
2d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d500 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
2d510 20 74 68 72 6f 75 67 68 20 65 6e 74 69 72 65 20   through entire 
2d520 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53  index */.  Fts5S
2d530 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2d540 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t;         /* In
2d550 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
2d560 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2d570 44 45 42 55 47 0a 20 20 2f 2a 20 55 73 65 64 20  DEBUG.  /* Used 
2d580 62 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e 61  by extra interna
2d590 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e  l tests only run
2d5a0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
2d5b0 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 75  t defined */.  u
2d5c0 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20  64 cksum3 = 0;  
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d5e0 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
2d5f0 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   on contents of 
2d600 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73  indexes */.  Fts
2d610 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b  5Buffer term = {
2d620 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20  0,0,0};      /* 
2d630 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68  Buffer used to h
2d640 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  old most recent 
2d650 74 65 72 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  term */.#endif. 
2d660 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
2d670 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   = FTS5INDEX_QUE
2d680 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 0a  RY_NOOUTPUT;.  .
2d690 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46 54    /* Load the FT
2d6a0 53 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  S index structur
2d6b0 65 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d  e */.  pStruct =
2d6c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2d6d0 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ad(p);..  /* Che
2d6e0 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74 65  ck that the inte
2d6f0 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61  rnal nodes of ea
2d700 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63 68  ch segment match
2d710 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20   the leaves */. 
2d720 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
2d730 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
2d740 65 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  eg;.    for(iLvl
2d750 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
2d760 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
2d770 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ){.      for(iSe
2d780 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63  g=0; iSeg<pStruc
2d790 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
2d7a0 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
2d7b0 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63         Fts5Struc
2d7c0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
2d7d0 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
2d7e0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b  evel[iLvl].aSeg[
2d7f0 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 66  iSeg];.        f
2d800 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
2d810 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c  yCheckSegment(p,
2d820 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   pSeg);.      }.
2d830 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2d840 54 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d 65  The cksum argume
2d850 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
2d860 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
2d870 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61  checksum calcula
2d880 74 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f  ted.  ** based o
2d890 6e 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20 65  n all expected e
2d8a0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 54  ntries in the FT
2d8b0 53 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64 69  S index (includi
2d8c0 6e 67 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a  ng prefix index.
2d8d0 20 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20 54    ** entries). T
2d8e0 68 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73  his block checks
2d8f0 20 74 68 61 74 20 61 20 63 68 65 63 6b 73 75 6d   that a checksum
2d900 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65   calculated base
2d910 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63  d on the.  ** ac
2d920 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tual contents of
2d930 20 46 54 53 20 69 6e 64 65 78 20 69 73 20 69 64   FTS index is id
2d940 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20  entical..  **.  
2d950 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20  ** Two versions 
2d960 6f 66 20 74 68 65 20 73 61 6d 65 20 63 68 65 63  of the same chec
2d970 6b 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c 61  ksum are calcula
2d980 74 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 28  ted. The first (
2d990 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61  stack.  ** varia
2d9a0 62 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73 65  ble cksum2) base
2d9b0 64 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78 74  d on entries ext
2d9c0 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
2d9d0 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a  full-text index.
2d9e0 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67    ** while doing
2d9f0 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f   a linear scan o
2da00 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  f each individua
2da10 6c 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e  l index in turn.
2da20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65   .  **.  ** As e
2da30 61 63 68 20 74 65 72 6d 20 76 69 73 69 74 65 64  ach term visited
2da40 20 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20 73   by the linear s
2da50 63 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74 65  cans, a separate
2da60 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20   query for the. 
2da70 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69 73   ** same term is
2da80 20 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75   performed. cksu
2da90 6d 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  m3 is calculated
2daa0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 6e   based on the en
2dab0 74 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72 61  tries.  ** extra
2dac0 63 74 65 64 20 62 79 20 74 68 65 73 65 20 71 75  cted by these qu
2dad0 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  eries..  */.  fo
2dae0 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
2daf0 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66  ew(p, pStruct, f
2db00 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  lags, 0, 0, 0, -
2db10 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20  1, 0, &pIter);. 
2db20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
2db30 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
2db40 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
2db50 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
2db60 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
2db70 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  .    int n;     
2db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db90 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
2dba0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2dbb0 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20 20   i64 iPos = 0;  
2dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dbd0 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66 72  Position read fr
2dbe0 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20  om poslist */.  
2dbf0 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20    int iOff = 0; 
2dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dc10 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 70   Offset within p
2dc20 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 36  oslist */.    i6
2dc30 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d  4 iRowid = fts5M
2dc40 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
2dc50 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ter);.    char *
2dc60 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d  z = (char*)fts5M
2dc70 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74  ultiIterTerm(pIt
2dc80 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a  er, &n);..    /*
2dc90 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 65   If this is a ne
2dca0 77 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f  w term, query fo
2dcb0 72 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73  r it. Update cks
2dcc0 75 6d 33 20 77 69 74 68 20 74 68 65 20 72 65 73  um3 with the res
2dcd0 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73  ults. */.    fts
2dce0 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65  5TestTerm(p, &te
2dcf0 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32  rm, z, n, cksum2
2dd00 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 20  , &cksum3);..   
2dd10 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54   if( eDetail==FT
2dd20 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
2dd30 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  {.      if( 0==f
2dd40 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d  ts5MultiIterIsEm
2dd50 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29 7b  pty(p, pIter) ){
2dd60 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20  .        cksum2 
2dd70 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
2dd80 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52  dexEntryCksum(iR
2dd90 6f 77 69 64 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  owid, 0, 0, -1, 
2dda0 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
2ddb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ddc0 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20  poslist.n = 0;. 
2ddd0 20 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72       fts5Segiter
2dde0 50 6f 73 6c 69 73 74 28 70 2c 20 26 70 49 74 65  Poslist(p, &pIte
2ddf0 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61  r->aSeg[pIter->a
2de00 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
2de10 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a  , 0, &poslist);.
2de20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 3d 3d        while( 0==
2de30 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
2de40 73 74 4e 65 78 74 36 34 28 70 6f 73 6c 69 73 74  stNext64(poslist
2de50 2e 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26  .p, poslist.n, &
2de60 69 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a  iOff, &iPos) ){.
2de70 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
2de80 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55   = FTS5_POS2COLU
2de90 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  MN(iPos);.      
2dea0 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20 3d 20    int iTokOff = 
2deb0 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28  FTS5_POS2OFFSET(
2dec0 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63  iPos);.        c
2ded0 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33  ksum2 ^= sqlite3
2dee0 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  Fts5IndexEntryCk
2def0 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c  sum(iRowid, iCol
2df00 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a  , iTokOff, -1, z
2df10 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
2df20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54 65    }.  }.  fts5Te
2df30 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c  stTerm(p, &term,
2df40 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20 26   0, 0, cksum2, &
2df50 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73 35  cksum3);..  fts5
2df60 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
2df70 74 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  ter);.  if( p->r
2df80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2df90 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20  cksum!=cksum2 ) 
2dfa0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2dfb0 52 55 50 54 3b 0a 0a 20 20 66 74 73 35 53 74 72  RUPT;..  fts5Str
2dfc0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
2dfd0 74 72 75 63 74 29 3b 0a 23 69 66 64 65 66 20 53  truct);.#ifdef S
2dfe0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 74  QLITE_DEBUG.  ft
2dff0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
2e000 72 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66 74  rm);.#endif.  ft
2e010 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 6f  s5BufferFree(&po
2e020 73 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  slist);.  return
2e030 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
2e040 28 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  (p);.}../*******
2e050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e090 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2e0a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2e0e0 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e   Below this poin
2e0f0 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  t is the impleme
2e100 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
2e110 74 73 35 5f 64 65 63 6f 64 65 28 29 20 73 63 61  ts5_decode() sca
2e120 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  lar.** function 
2e130 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  only..*/../*.** 
2e140 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74  Decode a segment
2e150 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d  -data rowid from
2e160 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
2e170 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2e180 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73   is.** the oppos
2e190 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53  ite of macro FTS
2e1a0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
2e1b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2e1c0 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69  d fts5DecodeRowi
2e1d0 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  d(.  i64 iRowid,
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1f0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72       /* Rowid fr
2e200 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  om %_data table 
2e210 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69  */.  int *piSegi
2e220 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2e230 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67       /* OUT: Seg
2e240 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74  ment id */.  int
2e250 20 2a 70 62 44 6c 69 64 78 2c 20 20 20 20 20 20   *pbDlidx,      
2e260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e270 4f 55 54 3a 20 44 6c 69 64 78 20 66 6c 61 67 20  OUT: Dlidx flag 
2e280 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67  */.  int *piHeig
2e290 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2e2a0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69       /* OUT: Hei
2e2b0 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ght */.  int *pi
2e2c0 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  Pgno            
2e2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2e2e0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
2e2f0 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28  ){.  *piPgno = (
2e300 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
2e310 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
2e320 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29  ATA_PAGE_B) - 1)
2e330 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
2e340 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
2e350 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d  ;..  *piHeight =
2e360 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
2e370 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
2e380 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20  _DATA_HEIGHT_B) 
2e390 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  - 1));.  iRowid 
2e3a0 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45  >>= FTS5_DATA_HE
2e3b0 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c  IGHT_B;..  *pbDl
2e3c0 69 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  idx = (int)(iRow
2e3d0 69 64 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  id & 0x0001);.  
2e3e0 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
2e3f0 44 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a  DATA_DLI_B;..  *
2e400 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28  piSegid = (int)(
2e410 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
2e420 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
2e430 44 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73  D_B) - 1));.}..s
2e440 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2e450 65 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70  ebugRowid(int *p
2e460 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
2e470 70 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b  pBuf, i64 iKey){
2e480 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 69  .  int iSegid, i
2e490 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62  Height, iPgno, b
2e4a0 44 6c 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20  Dlidx;       /* 
2e4b0 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73  Rowid compenents
2e4c0 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65   */.  fts5Decode
2e4d0 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 53 65  Rowid(iKey, &iSe
2e4e0 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69  gid, &bDlidx, &i
2e4f0 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b  Height, &iPgno);
2e500 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d  ..  if( iSegid==
2e510 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65  0 ){.    if( iKe
2e520 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  y==FTS5_AVERAGES
2e530 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
2e540 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2e550 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2e560 63 2c 20 70 42 75 66 2c 20 22 7b 61 76 65 72 61  c, pBuf, "{avera
2e570 67 65 73 7d 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ges} ");.    }el
2e580 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2e590 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2e5a0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2e5b0 66 2c 20 22 7b 73 74 72 75 63 74 75 72 65 7d 22  f, "{structure}"
2e5c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65  );.    }.  }.  e
2e5d0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
2e5e0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2e5f0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2e600 2c 20 22 7b 25 73 73 65 67 69 64 3d 25 64 20 68  , "{%ssegid=%d h
2e610 3d 25 64 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20  =%d pgno=%d}",. 
2e620 20 20 20 20 20 20 20 62 44 6c 69 64 78 20 3f 20         bDlidx ? 
2e630 22 64 6c 69 64 78 20 22 20 3a 20 22 22 2c 20 69  "dlidx " : "", i
2e640 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
2e650 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d  iPgno.    );.  }
2e660 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
2e670 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
2e680 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  re(.  int *pRc, 
2e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6a0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2e6b0 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
2e6c0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2e6d0 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  f,.  Fts5Structu
2e6e0 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69  re *p.){.  int i
2e6f0 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20  Lvl, iSeg;      
2e700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2e710 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
2e720 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a  vels, segments *
2e730 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  /..  for(iLvl=0;
2e740 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b   iLvl<p->nLevel;
2e750 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74   iLvl++){.    Ft
2e760 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2e770 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65   *pLvl = &p->aLe
2e780 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73  vel[iLvl];.    s
2e790 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2e7a0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2e7b0 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20  , pBuf, .       
2e7c0 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67   " {lvl=%d nMerg
2e7d0 65 3d 25 64 20 6e 53 65 67 3d 25 64 22 2c 20 69  e=%d nSeg=%d", i
2e7e0 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  Lvl, pLvl->nMerg
2e7f0 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20  e, pLvl->nSeg.  
2e800 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65    );.    for(iSe
2e810 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e  g=0; iSeg<pLvl->
2e820 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
2e830 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
2e840 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
2e850 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
2e860 65 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg];.      sqlit
2e870 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2e880 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2e890 75 66 2c 20 22 20 7b 69 64 3d 25 64 20 6c 65 61  uf, " {id=%d lea
2e8a0 76 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a 20  ves=%d..%d}", . 
2e8b0 20 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 69           pSeg->i
2e8c0 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 70 67 6e  Segid, pSeg->pgn
2e8d0 6f 46 69 72 73 74 2c 20 70 53 65 67 2d 3e 70 67  oFirst, pSeg->pg
2e8e0 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20 29 3b 0a  noLast.      );.
2e8f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2e900 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2e910 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2e920 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  f, "}");.  }.}..
2e930 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61  /*.** This is pa
2e940 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64  rt of the fts5_d
2e950 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e  ecode() debuggin
2e960 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  g aid..**.** Arg
2e970 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c  uments pBlob/nBl
2e980 6f 62 20 63 6f 6e 74 61 69 6e 20 61 20 73 65 72  ob contain a ser
2e990 69 61 6c 69 7a 65 64 20 46 74 73 35 53 74 72 75  ialized Fts5Stru
2e9a0 63 74 75 72 65 20 6f 62 6a 65 63 74 2e 20 54 68  cture object. Th
2e9b0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
2e9c0 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72  ppends a human-r
2e9d0 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e  eadable represen
2e9e0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61  tation of the sa
2e9f0 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  me object.** to 
2ea00 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65  the buffer passe
2ea10 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2ea20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74  argument. .*/.st
2ea30 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2ea40 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 0a 20  codeStructure(. 
2ea50 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
2ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea70 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f   /* IN/OUT: erro
2ea80 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
2ea90 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20  Buffer *pBuf,.  
2eaa0 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c  const u8 *pBlob,
2eab0 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20   int nBlob.){.  
2eac0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eae0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2eaf0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
2eb00 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20  e *p = 0;       
2eb10 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 64 20 73      /* Decoded s
2eb20 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
2eb30 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 53  */..  rc = fts5S
2eb40 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70  tructureDecode(p
2eb50 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20  Blob, nBlob, 0, 
2eb60 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  &p);.  if( rc!=S
2eb70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eb80 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRc = rc;.    r
2eb90 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74  eturn;.  }..  ft
2eba0 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65  s5DebugStructure
2ebb0 28 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a  (pRc, pBuf, p);.
2ebc0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
2ebd0 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  elease(p);.}../*
2ebe0 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74  .** This is part
2ebf0 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
2ec00 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20  ode() debugging 
2ec10 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  aid..**.** Argum
2ec20 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62  ents pBlob/nBlob
2ec30 20 63 6f 6e 74 61 69 6e 20 61 6e 20 22 61 76 65   contain an "ave
2ec40 72 61 67 65 73 22 20 72 65 63 6f 72 64 2e 20 54  rages" record. T
2ec50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
2ec60 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e   appends a human
2ec70 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73  -readable repres
2ec80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 65 63 6f  entation of reco
2ec90 72 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  rd to the buffer
2eca0 20 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74   passed .** as t
2ecb0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2ecc0 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nt. .*/.static v
2ecd0 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 41 76  oid fts5DecodeAv
2ece0 65 72 61 67 65 73 28 0a 20 20 69 6e 74 20 2a 70  erages(.  int *p
2ecf0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
2ed00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2ed10 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
2ed20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2ed30 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75  *pBuf,.  const u
2ed40 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  8 *pBlob, int nB
2ed50 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d  lob.){.  int i =
2ed60 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
2ed70 20 2a 7a 53 70 61 63 65 20 3d 20 22 22 3b 0a 0a   *zSpace = "";..
2ed80 20 20 77 68 69 6c 65 28 20 69 3c 6e 42 6c 6f 62    while( i<nBlob
2ed90 20 29 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c   ){.    u64 iVal
2eda0 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  ;.    i += sqlit
2edb0 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2edc0 26 70 42 6c 6f 62 5b 69 5d 2c 20 26 69 56 61 6c  &pBlob[i], &iVal
2edd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2ede0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2edf0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2ee00 22 25 73 25 64 22 2c 20 7a 53 70 61 63 65 2c 20  "%s%d", zSpace, 
2ee10 28 69 6e 74 29 69 56 61 6c 29 3b 0a 20 20 20 20  (int)iVal);.    
2ee20 7a 53 70 61 63 65 20 3d 20 22 20 22 3b 0a 20 20  zSpace = " ";.  
2ee30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  }.}../*.** Buffe
2ee40 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d  r (a/n) is assum
2ee50 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20  ed to contain a 
2ee60 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a  list of serializ
2ee70 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64  ed varints. Read
2ee80 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20  .** each varint 
2ee90 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20 73  and append its s
2eea0 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
2eeb0 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70  tion to buffer p
2eec0 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61  Buf. Return.** a
2eed0 66 74 65 72 20 65 69 74 68 65 72 20 74 68 65 20  fter either the 
2eee0 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20  input buffer is 
2eef0 65 78 68 61 75 73 74 65 64 20 6f 72 20 61 20 30  exhausted or a 0
2ef00 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a   value is read..
2ef10 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
2ef20 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
2ef30 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
2ef40 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
2ef50 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
2ef60 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
2ef70 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70  dePoslist(int *p
2ef80 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
2ef90 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
2efa0 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  a, int n){.  int
2efb0 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69   iOff = 0;.  whi
2efc0 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  le( iOff<n ){.  
2efd0 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
2efe0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
2eff0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
2f000 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  , iVal);.    sql
2f010 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2f020 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2f030 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61  pBuf, " %d", iVa
2f040 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  l);.  }.  return
2f050 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
2f060 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66  The start of buf
2f070 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69  fer (a/n) contai
2f080 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ns the start of 
2f090 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64  a doclist. The d
2f0a0 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72  oclist.** may or
2f0b0 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20   may not finish 
2f0c0 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65  within the buffe
2f0d0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
2f0e0 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a   appends a text.
2f0f0 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ** representatio
2f100 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66  n of the part of
2f110 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61   the doclist tha
2f120 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20  t is present to 
2f130 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20  buffer.** pBuf. 
2f140 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
2f150 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
2f160 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
2f170 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
2f180 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
2f190 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
2f1a0 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a  odeDoclist(int *
2f1b0 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
2f1c0 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
2f1d0 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36  *a, int n){.  i6
2f1e0 34 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20  4 iDocid = 0;.  
2f1f0 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
2f200 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
2f210 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 46 74  iOff = sqlite3Ft
2f220 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28  s5GetVarint(a, (
2f230 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20  u64*)&iDocid);. 
2f240 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2f250 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2f260 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64  (pRc, pBuf, " id
2f270 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b  =%lld", iDocid);
2f280 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f  .  }.  while( iO
2f290 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
2f2a0 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44  nPos;.    int bD
2f2b0 65 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  el;.    iOff += 
2f2c0 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
2f2d0 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50  ze(&a[iOff], &nP
2f2e0 6f 73 2c 20 26 62 44 65 6c 29 3b 0a 20 20 20 20  os, &bDel);.    
2f2f0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2f300 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2f310 63 2c 20 70 42 75 66 2c 20 22 20 6e 50 6f 73 3d  c, pBuf, " nPos=
2f320 25 64 25 73 22 2c 20 6e 50 6f 73 2c 20 62 44 65  %d%s", nPos, bDe
2f330 6c 3f 22 2a 22 3a 22 22 29 3b 0a 20 20 20 20 69  l?"*":"");.    i
2f340 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
2f350 65 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42  ePoslist(pRc, pB
2f360 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49  uf, &a[iOff], MI
2f370 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29  N(n-iOff, nPos))
2f380 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e  ;.    if( iOff<n
2f390 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44   ){.      i64 iD
2f3a0 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66  elta;.      iOff
2f3b0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
2f3c0 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
2f3d0 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
2f3e0 29 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20  );.      iDocid 
2f3f0 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
2f400 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2f410 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2f420 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25  Rc, pBuf, " id=%
2f430 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20  lld", iDocid);. 
2f440 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2f450 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iOff;.}../*.*
2f460 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2f470 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
2f480 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62  ts5_decode() deb
2f490 75 67 67 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  ugging function.
2f4a0 20 49 74 20 69 73 20 0a 2a 2a 20 6f 6e 6c 79 20   It is .** only 
2f4b0 65 76 65 72 20 75 73 65 64 20 77 69 74 68 20 64  ever used with d
2f4c0 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65  etail=none table
2f4d0 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20  s..**.** Buffer 
2f4e0 28 70 44 61 74 61 2f 6e 44 61 74 61 29 20 63 6f  (pData/nData) co
2f4f0 6e 74 61 69 6e 73 20 61 20 64 6f 63 6c 69 73 74  ntains a doclist
2f500 20 69 6e 20 74 68 65 20 66 6f 72 6d 61 74 20 75   in the format u
2f510 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 6e 6f  sed by detail=no
2f520 6e 65 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68  ne.** tables. Th
2f530 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
2f540 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  nds a human-read
2f550 61 62 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  able version of 
2f560 74 68 61 74 20 6c 69 73 74 20 74 6f 0a 2a 2a 20  that list to.** 
2f570 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
2f580 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6f 74  ** If *pRc is ot
2f590 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
2f5a0 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  OK when this fun
2f5b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2f5c0 20 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f   it is a.** no-o
2f5d0 70 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 72 20  p. If an OOM or 
2f5e0 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
2f5f0 72 73 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  rs within this f
2f600 75 6e 63 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73  unction, *pRc is
2f610 0a 2a 2a 20 73 65 74 20 74 6f 20 61 6e 20 53 51  .** set to an SQ
2f620 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
2f630 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2f640 2e 20 54 68 65 20 66 69 6e 61 6c 20 73 74 61 74  . The final stat
2f650 65 20 6f 66 20 62 75 66 66 65 72 0a 2a 2a 20 70  e of buffer.** p
2f660 42 75 66 20 69 73 20 75 6e 64 65 66 69 6e 65 64  Buf is undefined
2f670 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
2f680 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2f690 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73  s5DecodeRowidLis
2f6a0 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  t(.  int *pRc,  
2f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6c0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2f6d0 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
2f6e0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2f6f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f700 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 61 70 70  /* Buffer to app
2f710 65 6e 64 20 74 65 78 74 20 74 6f 20 2a 2f 0a 20  end text to */. 
2f720 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
2f730 2c 20 69 6e 74 20 6e 44 61 74 61 20 20 20 20 20  , int nData     
2f740 20 2f 2a 20 44 61 74 61 20 74 6f 20 64 65 63 6f   /* Data to deco
2f750 64 65 20 6c 69 73 74 2d 6f 66 2d 72 6f 77 69 64  de list-of-rowid
2f760 73 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 69  s from */.){.  i
2f770 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 36 34 20  nt i = 0;.  i64 
2f780 69 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20 77  iRowid = 0;..  w
2f790 68 69 6c 65 28 20 69 3c 6e 44 61 74 61 20 29 7b  hile( i<nData ){
2f7a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2f7b0 2a 7a 41 70 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zApp = "";.    
2f7c0 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20  u64 iVal;.    i 
2f7d0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
2f7e0 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69  tVarint(&pData[i
2f7f0 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 69  ], &iVal);.    i
2f800 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 0a  Rowid += iVal;..
2f810 20 20 20 20 69 66 28 20 69 3c 6e 44 61 74 61 20      if( i<nData 
2f820 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78 30  && pData[i]==0x0
2f830 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  0 ){.      i++;.
2f840 20 20 20 20 20 20 69 66 28 20 69 3c 6e 44 61 74        if( i<nDat
2f850 61 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30  a && pData[i]==0
2f860 78 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  x00 ){.        i
2f870 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a 41 70 70  ++;.        zApp
2f880 20 3d 20 22 2b 22 3b 0a 20 20 20 20 20 20 7d 65   = "+";.      }e
2f890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 41 70  lse{.        zAp
2f8a0 70 20 3d 20 22 2a 22 3b 0a 20 20 20 20 20 20 7d  p = "*";.      }
2f8b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
2f8c0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2f8d0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2f8e0 42 75 66 2c 20 22 20 25 6c 6c 64 25 73 22 2c 20  Buf, " %lld%s", 
2f8f0 69 52 6f 77 69 64 2c 20 7a 41 70 70 29 3b 0a 20  iRowid, zApp);. 
2f900 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
2f910 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2f920 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  f user-defined s
2f930 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
2f940 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f  ts5_decode()..*/
2f950 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2f960 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28  5DecodeFunction(
2f970 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2f980 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
2f990 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
2f9a0 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
2f9b0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
2f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2f9e0 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
2f9f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2fa00 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
2fa10 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
2fa20 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2fa30 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
2fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa50 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72 65   /* Rowid for re
2fa60 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64  cord being decod
2fa70 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  ed */.  int iSeg
2fa80 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f  id,iHeight,iPgno
2fa90 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64  ,bDlidx;/* Rowid
2faa0 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20   components */. 
2fab0 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62   const u8 *aBlob
2fac0 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20  ; int n;        
2fad0 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64 65   /* Record to de
2fae0 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20  code */.  u8 *a 
2faf0 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65  = 0;.  Fts5Buffe
2fb00 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  r s;            
2fb10 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20         /* Build 
2fb20 75 70 20 74 65 78 74 20 74 6f 20 72 65 74 75 72  up text to retur
2fb30 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
2fb40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2fb60 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2fb70 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a  int nSpace = 0;.
2fb80 20 20 69 6e 74 20 65 44 65 74 61 69 6c 4e 6f 6e    int eDetailNon
2fb90 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 75 73 65  e = (sqlite3_use
2fba0 72 5f 64 61 74 61 28 70 43 74 78 29 21 3d 30 29  r_data(pCtx)!=0)
2fbb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  ;..  assert( nAr
2fbc0 67 3d 3d 32 20 29 3b 0a 20 20 55 4e 55 53 45 44  g==2 );.  UNUSED
2fbd0 5f 50 41 52 41 4d 28 6e 41 72 67 29 3b 0a 20 20  _PARAM(nArg);.  
2fbe0 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69  memset(&s, 0, si
2fbf0 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
2fc00 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71  );.  iRowid = sq
2fc10 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
2fc20 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20  4(apVal[0]);..  
2fc30 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
2fc40 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
2fc50 75 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29 20 69  ument (a blob) i
2fc60 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65 20 61  n aBlob[]. The a
2fc70 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79  Blob[].  ** copy
2fc80 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   is followed by 
2fc90 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
2fca0 41 44 44 49 4e 47 20 30 78 30 30 20 62 79 74 65  ADDING 0x00 byte
2fcb0 73 2c 20 77 68 69 63 68 20 70 72 65 76 65 6e 74  s, which prevent
2fcc0 73 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 6f 76  s.  ** buffer ov
2fcd0 65 72 72 65 61 64 73 20 65 76 65 6e 20 69 66 20  erreads even if 
2fce0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  the record is co
2fcf0 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d  rrupt.  */.  n =
2fd00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
2fd10 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  ytes(apVal[1]);.
2fd20 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    aBlob = sqlite
2fd30 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56  3_value_blob(apV
2fd40 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61 63 65  al[1]);.  nSpace
2fd50 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41   = n + FTS5_DATA
2fd60 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20  _ZERO_PADDING;. 
2fd70 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65   a = (u8*)sqlite
2fd80 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
2fd90 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20  &rc, nSpace);.  
2fda0 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20  if( a==0 ) goto 
2fdb0 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65  decode_out;.  me
2fdc0 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e  mcpy(a, aBlob, n
2fdd0 29 3b 0a 0a 0a 20 20 66 74 73 35 44 65 63 6f 64  );...  fts5Decod
2fde0 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26  eRowid(iRowid, &
2fdf0 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c  iSegid, &bDlidx,
2fe00 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e   &iHeight, &iPgn
2fe10 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67  o);..  fts5Debug
2fe20 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69  Rowid(&rc, &s, i
2fe30 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44  Rowid);.  if( bD
2fe40 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35  lidx ){.    Fts5
2fe50 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20  Data dlidx;.    
2fe60 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c  Fts5DlidxLvl lvl
2fe70 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d  ;..    dlidx.p =
2fe80 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e   a;.    dlidx.nn
2fe90 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65   = n;..    memse
2fea0 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(&lvl, 0, sizeo
2feb0 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
2fec0 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20  ;.    lvl.pData 
2fed0 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76  = &dlidx;.    lv
2fee0 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50  l.iLeafPgno = iP
2fef0 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74  gno;..    for(ft
2ff00 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
2ff10 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d  lvl); lvl.bEof==
2ff20 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  0; fts5DlidxLvlN
2ff30 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20  ext(&lvl)){.    
2ff40 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2ff50 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2ff60 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20  &rc, &s, .      
2ff70 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c      " %d(%lld)",
2ff80 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20   lvl.iLeafPgno, 
2ff90 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20  lvl.iRowid.     
2ffa0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
2ffb0 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20  e if( iSegid==0 
2ffc0 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  ){.    if( iRowi
2ffd0 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  d==FTS5_AVERAGES
2ffe0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
2fff0 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67  fts5DecodeAverag
30000 65 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e  es(&rc, &s, a, n
30010 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
30020 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53 74      fts5DecodeSt
30030 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c  ructure(&rc, &s,
30040 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   a, n);.    }.  
30050 7d 65 6c 73 65 20 69 66 28 20 65 44 65 74 61 69  }else if( eDetai
30060 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46 74 73  lNone ){.    Fts
30070 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
30080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
30090 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20  rrent term read 
300a0 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20  from page */.   
300b0 20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20 20 20   int szLeaf;.   
300c0 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 20 3d   int iPgidxOff =
300d0 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65   szLeaf = fts5Ge
300e0 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20  tU16(&a[2]);.   
300f0 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20   int iTermOff;. 
30100 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
30110 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ;.    int iOff;.
30120 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72  .    memset(&ter
30130 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
30140 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
30150 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 65 6e  /* Decode any en
30160 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72  tries that occur
30170 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
30180 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 69  t term. */.    i
30190 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20  f( szLeaf<n ){. 
301a0 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b       iPgidxOff +
301b0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
301c0 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c  2(&a[iPgidxOff],
301d0 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20   iTermOff);.    
301e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 54 65  }else{.      iTe
301f0 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a  rmOff = szLeaf;.
30200 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65      }.    fts5De
30210 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72  codeRowidList(&r
30220 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 54  c, &s, &a[4], iT
30230 65 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20  ermOff-4);..    
30240 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
30250 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66  .    while( iOff
30260 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  <szLeaf ){.     
30270 20 69 6e 74 20 6e 41 70 70 65 6e 64 3b 0a 0a 20   int nAppend;.. 
30280 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
30290 20 74 65 72 6d 20 64 61 74 61 20 66 6f 72 20 74   term data for t
302a0 68 65 20 6e 65 78 74 20 74 65 72 6d 2a 2f 0a 20  he next term*/. 
302b0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
302c0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
302d0 69 4f 66 66 5d 2c 20 6e 41 70 70 65 6e 64 29 3b  iOff], nAppend);
302e0 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20  .      term.n = 
302f0 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 66 74 73  nKeep;.      fts
30300 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
30310 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 41  b(&rc, &term, nA
30320 70 70 65 6e 64 2c 20 26 61 5b 69 4f 66 66 5d 29  ppend, &a[iOff])
30330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
30340 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
30350 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
30360 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d   &rc, &s, " term
30370 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20  =%.*s", term.n, 
30380 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72  (const char*)ter
30390 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  m.p.      );.   
303a0 20 20 20 69 4f 66 66 20 2b 3d 20 6e 41 70 70 65     iOff += nAppe
303b0 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69  nd;..      /* Fi
303c0 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74  gure out where t
303d0 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  he doclist for t
303e0 68 69 73 20 74 65 72 6d 20 65 6e 64 73 20 2a 2f  his term ends */
303f0 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64  .      if( iPgid
30400 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  xOff<n ){.      
30410 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 20 20 20    int nIncr;.   
30420 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b       iPgidxOff +
30430 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
30440 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c  2(&a[iPgidxOff],
30450 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20   nIncr);.       
30460 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e   iTermOff += nIn
30470 63 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  cr;.      }else{
30480 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66  .        iTermOf
30490 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  f = szLeaf;.    
304a0 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 44    }..      fts5D
304b0 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26  ecodeRowidList(&
304c0 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
304d0 2c 20 69 54 65 72 6d 4f 66 66 2d 69 4f 66 66 29  , iTermOff-iOff)
304e0 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  ;.      iOff = i
304f0 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20 69  TermOff;.      i
30500 66 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29  f( iOff<szLeaf )
30510 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
30520 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
30530 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
30540 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
30550 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  }..    fts5Buffe
30560 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
30570 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42  }else{.    Fts5B
30580 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
30590 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
305a0 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72  ent term read fr
305b0 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  om page */.    i
305c0 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20  nt szLeaf;      
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
305e0 4f 66 66 73 65 74 20 6f 66 20 70 67 69 64 78 20  Offset of pgidx 
305f0 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  in a[] */.    in
30600 74 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20 20  t iPgidxOff;.   
30610 20 69 6e 74 20 69 50 67 69 64 78 50 72 65 76 20   int iPgidxPrev 
30620 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
30630 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * Previous value
30640 20 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64 78   read from pgidx
30650 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65 72   */.    int iTer
30660 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mOff = 0;.    in
30670 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b  t iRowidOff = 0;
30680 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
30690 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b     int nDoclist;
306a0 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65  ..    memset(&te
306b0 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  rm, 0, sizeof(Ft
306c0 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
306d0 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20   if( n<4 ){.    
306e0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
306f0 66 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20  ferSet(&rc, &s, 
30700 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63  7, (const u8*)"c
30710 6f 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20  orrupt");.      
30720 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b  goto decode_out;
30730 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30740 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
30750 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b  s5GetU16(&a[0]);
30760 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66  .      iPgidxOff
30770 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35   = szLeaf = fts5
30780 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20  GetU16(&a[2]);. 
30790 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f       if( iPgidxO
307a0 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
307b0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
307c0 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69  &a[iPgidxOff], i
307d0 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20  TermOff);.      
307e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
307f0 44 65 63 6f 64 65 20 74 68 65 20 70 6f 73 69 74  Decode the posit
30800 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20 61 74  ion list tail at
30810 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
30820 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66  e page */.    if
30830 28 20 69 52 6f 77 69 64 4f 66 66 21 3d 30 20 29  ( iRowidOff!=0 )
30840 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  {.      iOff = i
30850 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65  RowidOff;.    }e
30860 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
30870 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66  !=0 ){.      iOf
30880 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  f = iTermOff;.  
30890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
308a0 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  Off = szLeaf;.  
308b0 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f    }.    fts5Deco
308c0 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26  dePoslist(&rc, &
308d0 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34  s, &a[4], iOff-4
308e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64  );..    /* Decod
308f0 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69  e any more docli
30900 73 74 20 64 61 74 61 20 74 68 61 74 20 61 70 70  st data that app
30910 65 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ears on the page
30920 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
30930 2a 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a  ** first term. *
30940 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d  /.    nDoclist =
30950 20 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54 65   (iTermOff ? iTe
30960 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29 20  rmOff : szLeaf) 
30970 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35  - iOff;.    fts5
30980 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72  DecodeDoclist(&r
30990 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
309a0 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20   nDoclist);..   
309b0 20 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66   while( iPgidxOf
309c0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  f<n ){.      int
309d0 20 62 46 69 72 73 74 20 3d 20 28 69 50 67 69 64   bFirst = (iPgid
309e0 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20  xOff==szLeaf);  
309f0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66     /* True for f
30a00 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67  irst term on pag
30a10 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
30a20 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
30a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a40 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74   /* Bytes of dat
30a50 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  a */.      int i
30a60 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  End;.      .    
30a70 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66    iPgidxOff += f
30a80 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
30a90 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42  a[iPgidxOff], nB
30aa0 79 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67 69  yte);.      iPgi
30ab0 64 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b  dxPrev += nByte;
30ac0 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 50  .      iOff = iP
30ad0 67 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20 20  gidxPrev;..     
30ae0 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
30af0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
30b00 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
30b10 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65  PgidxOff], nByte
30b20 29 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20  );.        iEnd 
30b30 3d 20 69 50 67 69 64 78 50 72 65 76 20 2b 20 6e  = iPgidxPrev + n
30b40 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Byte;.      }els
30b50 65 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20  e{.        iEnd 
30b60 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20  = szLeaf;.      
30b70 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 62 46 69  }..      if( bFi
30b80 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
30b90 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
30ba0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
30bb0 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
30bc0 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79      term.n = nBy
30bd0 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
30be0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
30bf0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
30c00 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
30c10 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
30c20 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72  ndBlob(&rc, &ter
30c30 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66  m, nByte, &a[iOf
30c40 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  f]);.      iOff 
30c50 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20  += nByte;..     
30c60 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
30c70 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a  erAppendPrintf(.
30c80 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
30c90 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
30ca0 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
30cb0 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
30cc0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66     );.      iOff
30cd0 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f   += fts5DecodeDo
30ce0 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
30cf0 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f  a[iOff], iEnd-iO
30d00 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ff);.    }..    
30d10 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
30d20 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64  term);.  }.  . d
30d30 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c  ecode_out:.  sql
30d40 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
30d50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30d60 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
30d70 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
30d80 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
30d90 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45  s.p, s.n, SQLITE
30da0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
30db0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
30dc0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
30dd0 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20  ode(pCtx, rc);. 
30de0 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
30df0 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree(&s);.}../*.*
30e00 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
30e10 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
30e20 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
30e30 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28  tion fts5_rowid(
30e40 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
30e50 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74  d fts5RowidFunct
30e60 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
30e70 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
30e80 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
30e90 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
30ea0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
30eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ec0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30ed0 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32  f args (always 2
30ee0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) */.  sqlite3_v
30ef0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
30f00 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
30f10 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
30f20 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
30f30 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72  *zArg;.  if( nAr
30f40 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  g==0 ){.    sqli
30f50 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
30f60 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62  (pCtx, "should b
30f70 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75  e: fts5_rowid(su
30f80 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d  bject, ....)", -
30f90 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
30fa0 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63   zArg = (const c
30fb0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
30fc0 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
30fd0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  );.    if( 0==sq
30fe0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
30ff0 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29  rg, "segment") )
31000 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
31010 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65  id;.      int se
31020 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20  gid, pgno;.     
31030 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a   if( nArg!=3 ){.
31040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31050 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
31060 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  x, .            
31070 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35  "should be: fts5
31080 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27  _rowid('segment'
31090 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29 22  , segid, pgno))"
310a0 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a  , -1.        );.
310b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
310c0 20 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c       segid = sql
310d0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
310e0 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20  pVal[1]);.      
310f0 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33    pgno = sqlite3
31100 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
31110 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52  [2]);.        iR
31120 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
31130 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
31140 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
31150 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
31160 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69  nt64(pCtx, iRowi
31170 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
31180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
31190 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
311a0 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
311b0 20 22 66 69 72 73 74 20 61 72 67 20 74 6f 20 66   "first arg to f
311c0 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74  ts5_rowid() must
311d0 20 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20 2c   be 'segment'" ,
311e0 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   -1.      );.   
311f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
31200 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
31210 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74  s part of regist
31220 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d  ering the FTS5 m
31230 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62  odule with datab
31240 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
31250 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65  n db. It registe
31260 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d  rs several user-
31270 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
31280 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a  unctions useful.
31290 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a  ** with FTS5..**
312a0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
312b0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
312c0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
312d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f  error occurs, so
312e0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69  me other.** SQLi
312f0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
31300 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
31310 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
31320 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73  3Fts5IndexInit(s
31330 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
31340 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
31350 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
31360 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35  .      db, "fts5
31370 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c  _decode", 2, SQL
31380 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
31390 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c  5DecodeFunction,
313a0 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 20 20 69 66   0, 0.  );..  if
313b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
313c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
313d0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
313e0 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ion(.        db,
313f0 20 22 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e 6f   "fts5_decode_no
31400 6e 65 22 2c 20 32 2c 20 0a 20 20 20 20 20 20 20  ne", 2, .       
31410 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
31420 6f 69 64 2a 29 64 62 2c 20 66 74 73 35 44 65 63  oid*)db, fts5Dec
31430 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
31440 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  0.    );.  }..  
31450 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31460 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
31470 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
31480 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64  ction(.        d
31490 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c  b, "fts5_rowid",
314a0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
314b0 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75  , 0, fts5RowidFu
314c0 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20  nction, 0, 0.   
314d0 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
314e0 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c   rc;.}...int sql
314f0 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 73  ite3Fts5IndexRes
31500 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  et(Fts5Index *p)
31510 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
31520 53 74 72 75 63 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Struct==0 || p->
31530 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 21 3d  iStructVersion!=
31540 30 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 49  0 );.  if( fts5I
31550 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e 28  ndexDataVersion(
31560 70 29 21 3d 70 2d 3e 69 53 74 72 75 63 74 56 65  p)!=p->iStructVe
31570 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 66 74 73  rsion ){.    fts
31580 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
31590 64 61 74 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  date(p);.  }.  r
315a0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
315b0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a              eturn(p);.}.