/ Hex Artifact Content
Login

Artifact 5ba2a5efcd6035fd35363ad8d014e488ab9d87fc:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50  PageWriter Fts5P
24e0: 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  ageWriter;.typed
24f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2500: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2510: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2520: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2530: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2540: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2550: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2560: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2580: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2590: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
25a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
25b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
25c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
25d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
25f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2600: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72 75  reSegment;..stru
2610: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2620: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2660: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2670: 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nn;             
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2690: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
26a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26b0: 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26d0: 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69 74 68  ize of leaf with
26e0: 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  out page-index *
26f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2700: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2710: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2720: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2740: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2750: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2760: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2780: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2790: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27a0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27b0: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
27e0: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
27f0: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2800: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2810: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2820: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2830: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2840: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2850: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2860: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2870: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2880: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2890: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
28c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
28d0: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44  .  int nPendingD
28e0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
28f0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2900: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2910: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2920: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2930: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2940: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2950: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2960: 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65  */.  int bDelete
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2980: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2990: 77 72 69 74 65 20 69 73 20 61 20 64 65 6c 65 74  write is a delet
29a0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72  e */..  /* Error
29b0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74   state. */.  int
29c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f  Current error co
29f0: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74  de */..  /* Stat
2a00: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 66 74  e used by the ft
2a10: 73 35 44 61 74 61 58 58 58 28 29 20 66 75 6e 63  s5DataXXX() func
2a20: 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tions. */.  sqli
2a30: 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65  te3_blob *pReade
2a40: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  r;          /* R
2a50: 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e  O incr-blob open
2a60: 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65   on %_data table
2a70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2a80: 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20  mt *pWriter;    
2a90: 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54        /* "INSERT
2aa0: 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55   ... %_data VALU
2ab0: 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71  ES(?,?)" */.  sq
2ac0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
2ad0: 65 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  eter;         /*
2ae0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f   "DELETE FROM %_
2af0: 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41  data ... id>=? A
2b00: 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73  ND id<=?" */.  s
2b10: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
2b20: 78 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f  xWriter;       /
2b30: 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f  * "INSERT ... %_
2b40: 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  idx VALUES(?,?,?
2b50: 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ,?)" */.  sqlite
2b60: 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65  3_stmt *pIdxDele
2b70: 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45  ter;      /* "DE
2b80: 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20  LETE FROM %_idx 
2b90: 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f  WHERE segid=? */
2ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2bb0: 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69  *pIdxSelect;.  i
2bc0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2be0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2bf0: 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f  f blocks read */
2c00: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  .};..struct Fts5
2c10: 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20  DoclistIter {.  
2c20: 75 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20  u8 *aEof;       
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
2c50: 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
2c60: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f   doclist */..  /
2c70: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
2c80: 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20  es. aPoslist==0 
2c90: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20  at EOF */.  i64 
2ca0: 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50  iRowid;.  u8 *aP
2cb0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50  oslist;.  int nP
2cc0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53  oslist;.  int nS
2cd0: 69 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.};../*.** T
2ce0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cf0: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
2d00: 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69  ecord for each i
2d10: 6e 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65  ndex are represe
2d20: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e  nted.** using an
2d30: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72   Fts5Structure r
2d40: 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e  ecord in memory.
2d50: 20 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74   Which uses inst
2d60: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a  ances of the .**
2d70: 20 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63   other Fts5Struc
2d80: 74 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73  tureXXX types as
2d90: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a   components..*/.
2da0: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2db0: 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20  tureSegment {.  
2dc0: 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20  int iSegid;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f  /* Segment id */
2df0: 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74  .  int pgnoFirst
2e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e10: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66     /* First leaf
2e20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2e30: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
2e40: 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20   pgnoLast;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
2e70: 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
2e80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2e90: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2ea0: 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b   {.  int nMerge;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ed0: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
2ee0: 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e  cr-merge */.  in
2ef0: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f10: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f20: 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
2f30: 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  el */.  Fts5Stru
2f40: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53  ctureSegment *aS
2f50: 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  eg;     /* Array
2f60: 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53   of segments. aS
2f70: 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e  eg[0] is oldest.
2f80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2f90: 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20  s5Structure {.  
2fa0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65  /* Object refere
2fd0: 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75  nce count */.  u
2fe0: 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  64 nWriteCounter
2ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3000: 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77  * Total leaves w
3010: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
3020: 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  0 */.  int nSegm
3030: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
3040: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
3050: 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  segments in this
3060: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
3070: 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20  int nLevel;     
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76  /* Number of lev
30a0: 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65  els in this inde
30b0: 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
30c0: 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c  tureLevel aLevel
30d0: 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  [1];   /* Array 
30e0: 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20  of nLevel level 
30f0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
3100: 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f  *.** An object o
3110: 66 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72  f type Fts5SegWr
3120: 69 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  iter is used to 
3130: 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74  write to segment
3140: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  s..*/.struct Fts
3150: 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20  5PageWriter {.  
3160: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
3190: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
31a0: 20 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78    int iPrevPgidx
31b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31c0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61    /* Previous va
31d0: 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lue written into
31e0: 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35   pgidx */.  Fts5
31f0: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3210: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3220: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20   leaf data */.  
3230: 46 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78  Fts5Buffer pgidx
3240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3250: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
3260: 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20  ning page-index 
3270: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3280: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
3290: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
32a0: 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f  ontaining previo
32b0: 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  us term on page 
32c0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
32d0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20  5DlidxWriter {. 
32e0: 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20   int pgno;      
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3310: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
3320: 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69  .  int bPrevVali
3330: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3340: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50     /* True if iP
3350: 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rev is valid */.
3360: 20 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20    i64 iPrev;    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
3390: 77 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65  wid value writte
33a0: 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46  n to page */.  F
33b0: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20  ts5Buffer buf;  
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
33e0: 69 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f  ing page data */
33f0: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53  .};.struct Fts5S
3400: 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74  egWriter {.  int
3410: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3430: 53 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74  Segid to write t
3440: 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  o */.  Fts5PageW
3450: 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20  riter writer;   
3460: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72         /* PageWr
3470: 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
3480: 20 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b   i64 iPrevRowid;
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
34b0: 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75  id written to cu
34c0: 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20  rrent leaf */.  
34d0: 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e  u8 bFirstRowidIn
34e0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
34f0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3500: 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69  rowid is first i
3510: 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75  n doclist */.  u
3520: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  8 bFirstRowidInP
3530: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
3540: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
3550: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
3560: 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f   page */.  /* TO
3570: 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72  DO1: Can use (wr
3580: 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29  iter.pgidx.n==0)
3590: 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72   instead of bFir
35a0: 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a  stTermInPage */.
35b0: 20 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49    u8 bFirstTermI
35c0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
35d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
35e0: 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66  t term will be f
35f0: 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a  irst in leaf */.
3600: 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74    int nLeafWritt
3610: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
3620: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
3630: 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65  eaf pages writte
3640: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74  n */.  int nEmpt
3650: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
3660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3670: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74   of contiguous t
3680: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a  erm-less nodes *
3690: 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b  /..  int nDlidx;
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
36c0: 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78  d size of aDlidx
36d0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74  [] array */.  Ft
36e0: 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61  s5DlidxWriter *a
36f0: 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a  Dlidx;        /*
3700: 20 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c   Array of Fts5Dl
3710: 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74  idxWriter object
3720: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65  s */..  /* Value
3730: 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  s to insert into
3740: 20 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65   the %_idx table
3750: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
3760: 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20   btterm;        
3770: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65        /* Next te
3780: 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  rm to insert int
3790: 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f  o %_idx table */
37a0: 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20  .  int iBtPage; 
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
37d0: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
37e0: 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a  to btterm */.};.
37f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3800: 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35  Fts5CResult Fts5
3810: 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20  CResult;.struct 
3820: 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20  Fts5CResult {.  
3830: 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20  u16 iFirst;     
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20  /* aSeg[] index 
3860: 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72  of firstest iter
3870: 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65  ator */.  u8 bTe
3880: 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rmEq;           
3890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
38a0: 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61  e if the terms a
38b0: 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a  re equal */.};..
38c0: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
38d0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
38e0: 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  gh a single segm
38f0: 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61  ent, visiting ea
3900: 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a  ch term/rowid.**
3910: 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67   pair in the seg
3920: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67  ment..**.** pSeg
3930: 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65  :.**   The segme
3940: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
3950: 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  rough..**.** iLe
3960: 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72  afPgno:.**   Cur
3970: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
3980: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67  umber within seg
3990: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ment..**.** iLea
39a0: 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79  fOffset:.**   By
39b0: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
39c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
39d0: 66 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69  f that is the fi
39e0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
39f0: 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c  .**   position l
3a00: 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79  ist data (one by
3a10: 74 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f  te passed the po
3a20: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
3a30: 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f   field)..**   ro
3a40: 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65  wid field of the
3a50: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
3a60: 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20  Usually this is 
3a70: 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f  the size field o
3a80: 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74  f the.**   posit
3a90: 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54  ion list data. T
3aa0: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
3ab0: 69 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  if the rowid for
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
3ad0: 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20  ry .**   is the 
3ae0: 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68  last thing on th
3af0: 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a  e leaf page..**.
3b00: 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42  ** pLeaf:.**   B
3b10: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3b20: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
3b30: 67 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20  ge data. Set to 
3b40: 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  NULL at EOF..**.
3b50: 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  ** iTermLeafPgno
3b60: 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  , iTermLeafOffse
3b70: 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67  t:.**   Leaf pag
3b80: 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e  e number contain
3b90: 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72  ing the last ter
3ba0: 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  m read from the 
3bb0: 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20  segment. And.** 
3bc0: 20 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d    the offset imm
3bd0: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
3be0: 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  ng the term data
3bf0: 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a  ..**.** flags:.*
3c00: 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35  *   Mask of FTS5
3c10: 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c  _SEGITER_XXX val
3c20: 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64  ues. Interpreted
3c30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3c40: 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45  **   FTS5_SEGITE
3c50: 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20  R_ONETERM:.**   
3c60: 20 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68    If set, set th
3c70: 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f  e iterator to po
3c80: 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72  int to EOF after
3c90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
3ca0: 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73  list .**     has
3cb0: 20 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e   been exhausted.
3cc0: 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20   Do not proceed 
3cd0: 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  to the next term
3ce0: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e   in the segment.
3cf0: 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45  .**.**   FTS5_SE
3d00: 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a  GITER_REVERSE:.*
3d10: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
3d20: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74  is only ever set
3d30: 20 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52   if FTS5_SEGITER
3d40: 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f  _ONETERM is also
3d50: 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20   set. If.**     
3d60: 69 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61  it is set, itera
3d70: 74 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64  te through rowid
3d80: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   in descending o
3d90: 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20  rder instead of 
3da0: 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75  the.**     defau
3db0: 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  lt ascending ord
3dc0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64  er..**.** iRowid
3dd0: 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66  Offset/nRowidOff
3de0: 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74  set/aRowidOffset
3df0: 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61  :.**     These a
3e00: 72 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46  re used if the F
3e10: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
3e20: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
3e30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65  .**.**     For e
3e40: 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ach rowid on the
3e50: 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64   page correspond
3e60: 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
3e70: 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20  nt term, the.** 
3e80: 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
3e90: 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  g aRowidOffset[]
3ea0: 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f   entry is set to
3eb0: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
3ec0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   of the.**     s
3ed0: 74 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73  tart of the "pos
3ee0: 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22  ition-list-size"
3ef0: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
3f00: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54  e page..**.** iT
3f10: 65 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49  ermIdx:.**     I
3f20: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
3f30: 74 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61  term on iTermLea
3f40: 66 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74  fPgno..*/.struct
3f50: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
3f60: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
3f70: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
3f80: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
3f90: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
3fa0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
3fd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
3fe0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
3ff0: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4000: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4010: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4020: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4030: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4040: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4050: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4060: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65  .  Fts5Data *pNe
4070: 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  xtLeaf;         
4080: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
4090: 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f  (iLeafPgno+1) */
40a0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
40b0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
40c0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
40d0: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
40e0: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e   leaf */..  /* N
40f0: 65 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ext method */.  
4100: 76 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74  void (*xNext)(Ft
4110: 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65  s5Index*, Fts5Se
4120: 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a  gIter*, int*);..
4130: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e    /* The page an
4140: 64 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68  d offset from wh
4150: 69 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ich the current 
4160: 74 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54  term was read. T
4170: 68 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20  he offset .  ** 
4180: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  is the offset of
4190: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
41a0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
41b0: 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69  doclist.  */.  i
41c0: 6e 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  nt iTermLeafPgno
41d0: 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61  ;.  int iTermLea
41e0: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20  fOffset;..  int 
41f0: 69 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20  iPgidxOff;      
4200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4210: 65 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67  ext offset in pg
4220: 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  idx */.  int iEn
4230: 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f  dofDoclist;..  /
4240: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4250: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66  are only used if
4260: 20 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45   the FTS5_SEGITE
4270: 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69  R_REVERSE flag i
4280: 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  s set. */.  int 
4290: 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  iRowidOffset;   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
42b0: 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20  urrent entry in 
42c0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a  aRowidOffset[] *
42d0: 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66  /.  int nRowidOf
42e0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
42f0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
4300: 20 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f   size of aRowidO
4310: 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f  ffset[] array */
4320: 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66  .  int *aRowidOf
4330: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
4340: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
4350: 66 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66  ffset to rowid f
4360: 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35  ields */..  Fts5
4370: 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
4380: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  x;          /* I
4390: 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
43a0: 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20  list-index */.. 
43b0: 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f   /* Variables po
43c0: 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  pulated based on
43d0: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
43e0: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
43f0: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
4400: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4410: 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52  term */.  i64 iR
4420: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
4430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4440: 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20  rent rowid */.  
4450: 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20  int nPos;       
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
4480: 65 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f  es in current po
4490: 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
44a0: 20 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20   u8 bDel;       
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
44d0: 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73  delete flag is s
44e0: 65 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  et */.};../*.** 
44f0: 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  Argument is a po
4500: 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35  inter to an Fts5
4510: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74  Data structure t
4520: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a  hat contains a .
4530: 2a 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f  ** leaf page..*/
4540: 0a 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f  .#define ASSERT_
4550: 53 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73  SZLEAF_OK(x) ass
4560: 65 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e  ert( \.    (x)->
4570: 73 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20  szLeaf==(x)->nn 
4580: 7c 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d  || (x)->szLeaf==
4590: 66 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d  fts5GetU16(&(x)-
45a0: 3e 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66  >p[2]) \.)..#def
45b0: 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  ine FTS5_SEGITER
45c0: 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64  _ONETERM 0x01.#d
45d0: 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54  efine FTS5_SEGIT
45e0: 45 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a  ER_REVERSE 0x02.
45f0: 0a 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ./* .** Argument
4600: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4610: 20 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72   an Fts5Data str
4620: 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
4630: 61 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70  ains a leaf.** p
4640: 61 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20  age. This macro 
4650: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
4660: 65 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f  e if the leaf co
4670: 6e 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c  ntains no terms,
4680: 20 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20   or.** false if 
4690: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  it contains at l
46a0: 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a  east one term..*
46b0: 2f 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65  /.#define fts5Le
46c0: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20  afIsTermless(x) 
46d0: 28 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20  ((x)->szLeaf >= 
46e0: 28 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e  (x)->nn)..#defin
46f0: 65 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66  e fts5LeafTermOf
4700: 66 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74  f(x, i) (fts5Get
4710: 55 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d  U16(&(x)->p[(x)-
4720: 3e 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d  >szLeaf + (i)*2]
4730: 29 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  ))..#define fts5
4740: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
4750: 66 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36  f(x) (fts5GetU16
4760: 28 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a  ((x)->p))../*.**
4770: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
4780: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
4790: 65 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73  e merged results
47a0: 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   of one or more 
47b0: 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73  segments,.** vis
47c0: 69 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f  iting each term/
47d0: 72 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68  rowid pair in th
47e0: 65 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a  e merged data..*
47f0: 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77  *.** nSeg is alw
4800: 61 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74  ays a power of t
4810: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
4820: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
4830: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67  number of.** seg
4840: 6d 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20  ments that this 
4850: 6f 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e  object is mergin
4860: 67 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74  g data from. Bot
4870: 68 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64  h the aSeg[] and
4880: 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72  .** aFirst[] arr
4890: 61 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74  ays are sized at
48a0: 20 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54   nSeg entries. T
48b0: 68 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20  he aSeg[] array 
48c0: 69 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74  is padded.** wit
48d0: 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73  h zeroed objects
48e0: 20 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e   - these are han
48f0: 64 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20  dled as if they 
4900: 77 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f  were iterators o
4910: 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74  pened.** on empt
4920: 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  y segments..**.*
4930: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
4940: 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65   comparing segme
4950: 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20  nts aSeg[N] and 
4960: 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65  aSeg[N+1], where
4970: 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e   N is an.** even
4980: 20 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72   number, is stor
4990: 65 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53  ed in aFirst[(nS
49a0: 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72  eg+N)/2]. The "r
49b0: 65 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a  esult" of the .*
49c0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  * comparison in 
49d0: 74 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20  this context is 
49e0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
49f0: 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63   iterator that c
4a00: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
4a10: 74 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65  ts to the smalle
4a20: 72 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d  r term/rowid com
4a30: 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74  bination. Iterat
4a40: 6f 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a  ors at EOF are.*
4a50: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  * considered to 
4a60: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
4a70: 61 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74  all other iterat
4a80: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73  ors..**.** aFirs
4a90: 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68  t[1] contains th
4aa0: 65 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b  e index in aSeg[
4ab0: 5d 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  ] of the iterato
4ac0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
4ad0: 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  .** the smallest
4ae0: 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46   key overall. aF
4af0: 69 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65  irst[0] is unuse
4b00: 64 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73  d. .**.** poslis
4b10: 74 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20  t:.**   Used by 
4b20: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
4b30: 6f 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68  oslist() when th
4b40: 65 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20  e poslist needs 
4b50: 74 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a  to be buffered..
4b60: 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  **   There is no
4b70: 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20   way to tell if 
4b80: 74 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65  this is populate
4b90: 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72  d or not..*/.str
4ba0: 75 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65  uct Fts5IndexIte
4bb0: 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r {.  Fts5Index 
4bc0: 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
4bd0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
4be0: 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 69 74  hat owns this it
4bf0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35  erator */.  Fts5
4c00: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
4c10: 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ct;         /* D
4c20: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
4c30: 65 20 66 6f 72 20 74 68 69 73 20 69 74 65 72 61  e for this itera
4c40: 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  tor */.  Fts5Buf
4c50: 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20  fer poslist;    
4c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
4c70: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75  er containing cu
4c80: 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f  rrent poslist */
4c90: 0a 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20  ..  int nSeg;   
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
4cc0: 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Seg[] array */. 
4cd0: 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74 65 72   /* True to iter
4d00: 61 74 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f  ate in reverse o
4d10: 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 62 53 6b  rder */.  u8 bSk
4d20: 69 70 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20  ipEmpty;        
4d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4d40: 65 20 74 6f 20 73 6b 69 70 20 64 65 6c 65 74 65  e to skip delete
4d50: 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 75  d entries */.  u
4d60: 38 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20  8 bEof;         
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4d80: 2a 20 54 72 75 65 20 61 74 20 45 4f 46 20 2a 2f  * True at EOF */
4d90: 0a 20 20 75 38 20 62 46 69 6c 74 65 72 65 64 3b  .  u8 bFiltered;
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
4dc0: 6c 75 6d 6e 2d 66 69 6c 74 65 72 20 61 6c 72 65  lumn-filter alre
4dd0: 61 64 79 20 61 70 70 6c 69 65 64 20 2a 2f 0a 0a  ady applied */..
4de0: 20 20 69 36 34 20 69 53 77 69 74 63 68 52 6f 77    i64 iSwitchRow
4df0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
4e00: 20 20 2f 2a 20 46 69 72 73 74 65 73 74 20 72 6f    /* Firstest ro
4e10: 77 69 64 20 6f 66 20 6f 74 68 65 72 20 74 68 61  wid of other tha
4e20: 6e 20 61 46 69 72 73 74 5b 31 5d 20 2a 2f 0a 20  n aFirst[1] */. 
4e30: 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 61 46   Fts5CResult *aF
4e40: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
4e50: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 65 72 67   /* Current merg
4e60: 65 20 73 74 61 74 65 20 28 73 65 65 20 61 62 6f  e state (see abo
4e70: 76 65 29 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ve) */.  Fts5Seg
4e80: 49 74 65 72 20 61 53 65 67 5b 31 5d 3b 20 20 20  Iter aSeg[1];   
4e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
4ea0: 79 20 6f 66 20 73 65 67 6d 65 6e 74 20 69 74 65  y of segment ite
4eb0: 72 61 74 6f 72 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  rators */.};.../
4ec0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
4ed0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4ee0: 67 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  g type is used t
4ef0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
4f00: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  h the contents.*
4f10: 2a 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2d 69  * of a doclist-i
4f20: 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ndex record..**.
4f30: 2a 2a 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 52  ** pData:.**   R
4f40: 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 69 6e 67  ecord containing
4f50: 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
4f60: 65 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62  ex data..**.** b
4f70: 45 6f 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f  Eof:.**   Set to
4f80: 20 74 72 75 65 20 6f 6e 63 65 20 69 74 65 72 61   true once itera
4f90: 74 6f 72 20 68 61 73 20 72 65 61 63 68 65 64 20  tor has reached 
4fa0: 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a  EOF..**.** iOff:
4fb0: 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 68 65  .**   Set to the
4fc0: 20 63 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   current offset 
4fd0: 77 69 74 68 69 6e 20 72 65 63 6f 72 64 20 70 44  within record pD
4fe0: 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ata..*/.struct F
4ff0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 7b 0a 20 20  ts5DlidxLvl {.  
5000: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5020: 20 44 61 74 61 20 66 6f 72 20 63 75 72 72 65 6e   Data for curren
5030: 74 20 70 61 67 65 20 6f 66 20 74 68 69 73 20 6c  t page of this l
5040: 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  evel */.  int iO
5050: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
5060: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
5070: 6e 74 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 70  nt offset into p
5080: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 62 45  Data */.  int bE
5090: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
50a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 45 4f          /* At EO
50b0: 46 20 61 6c 72 65 61 64 79 20 2a 2f 0a 20 20 69  F already */.  i
50c0: 6e 74 20 69 46 69 72 73 74 4f 66 66 3b 20 20 20  nt iFirstOff;   
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
50e0: 55 73 65 64 20 62 79 20 72 65 76 65 72 73 65 20  Used by reverse 
50f0: 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 0a 20 20  iterators */..  
5100: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
5110: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  les */.  int iLe
5120: 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  afPgno;         
5130: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
5140: 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
5150: 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20   leaf page */.  
5160: 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5180: 20 46 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   First rowid on 
5190: 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 2a  leaf iLeafPgno *
51a0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
51b0: 44 6c 69 64 78 49 74 65 72 20 7b 0a 20 20 69 6e  DlidxIter {.  in
51c0: 74 20 6e 4c 76 6c 3b 0a 20 20 69 6e 74 20 69 53  t nLvl;.  int iS
51d0: 65 67 69 64 3b 0a 20 20 46 74 73 35 44 6c 69 64  egid;.  Fts5Dlid
51e0: 78 4c 76 6c 20 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b  xLvl aLvl[1];.};
51f0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
5200: 73 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75  s5PutU16(u8 *aOu
5210: 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20  t, u16 iVal){.  
5220: 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e  aOut[0] = (iVal>
5230: 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d  >8);.  aOut[1] =
5240: 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a   (iVal&0xFF);.}.
5250: 0a 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35  .static u16 fts5
5260: 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20  GetU16(const u8 
5270: 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  *aIn){.  return 
5280: 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20  ((u16)aIn[0] << 
5290: 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 20 0a  8) + aIn[1];.} .
52a0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
52b0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 62 75 66  and return a buf
52c0: 66 65 72 20 61 74 20 6c 65 61 73 74 20 6e 42 79  fer at least nBy
52d0: 74 65 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  te bytes in size
52e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
52f0: 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
5300: 6e 74 65 72 65 64 2c 20 72 65 74 75 72 6e 20 4e  ntered, return N
5310: 55 4c 4c 20 61 6e 64 20 73 65 74 20 74 68 65 20  ULL and set the 
5320: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a  error code in.**
5330: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 68   the Fts5Index h
5340: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
5350: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
5360: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
5370: 69 64 20 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f  id *fts5IdxMallo
5380: 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  c(Fts5Index *p, 
5390: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 72 65  int nByte){.  re
53a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35  turn sqlite3Fts5
53b0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
53c0: 63 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a  c, nByte);.}../*
53d0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
53e0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
53f0: 70 4c 65 66 74 20 62 75 66 66 65 72 20 77 69 74  pLeft buffer wit
5400: 68 20 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69  h the pRight/nRi
5410: 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20  ght blob..**.** 
5420: 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c  Return -ve if pL
5430: 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  eft is smaller t
5440: 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66  han pRight, 0 if
5450: 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20   they are equal 
5460: 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69  or.** +ve if pRi
5470: 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ght is smaller t
5480: 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74  han pLeft. In ot
5490: 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a  her words:.**.**
54a0: 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66       res = *pLef
54b0: 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 23  t - *pRight.*/.#
54c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
54d0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  UG.static int ft
54e0: 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42  s5BufferCompareB
54f0: 6c 6f 62 28 0a 20 20 46 74 73 35 42 75 66 66 65  lob(.  Fts5Buffe
5500: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
5510: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 68         /* Left h
5520: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
5530: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  arison */.  cons
5540: 74 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e  t u8 *pRight, in
5550: 74 20 6e 52 69 67 68 74 20 20 20 20 2f 2a 20 52  t nRight    /* R
5560: 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
5570: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a  f comparison */.
5580: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
5590: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52  MIN(pLeft->n, nR
55a0: 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72 65 73  ight);.  int res
55b0: 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d   = memcmp(pLeft-
55c0: 3e 70 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d 70  >p, pRight, nCmp
55d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73  );.  return (res
55e0: 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20  ==0 ? (pLeft->n 
55f0: 2d 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29  - nRight) : res)
5600: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5610: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  * Compare the co
5620: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74 77  ntents of the tw
5630: 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e 67 20  o buffers using 
5640: 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65  memcmp(). If one
5650: 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20 61 20   buffer.** is a 
5660: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
5670: 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69  her, it is consi
5680: 64 65 72 65 64 20 74 68 65 20 6c 65 73 73 65 72  dered the lesser
5690: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d  ..**.** Return -
56a0: 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73  ve if pLeft is s
56b0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67  maller than pRig
56c0: 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72  ht, 0 if they ar
56d0: 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76  e equal or.** +v
56e0: 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73  e if pRight is s
56f0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66  maller than pLef
5700: 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  t. In other word
5710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73  s:.**.**     res
5720: 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69   = *pLeft - *pRi
5730: 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ght.*/.static in
5740: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
5750: 61 72 65 28 46 74 73 35 42 75 66 66 65 72 20 2a  are(Fts5Buffer *
5760: 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66 66 65  pLeft, Fts5Buffe
5770: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 6e  r *pRight){.  in
5780: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
5790: 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d 3e 6e  ft->n, pRight->n
57a0: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
57b0: 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20  emcmp(pLeft->p, 
57c0: 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d 70 29  pRight->p, nCmp)
57d0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d  ;.  return (res=
57e0: 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d  =0 ? (pLeft->n -
57f0: 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20 72 65   pRight->n) : re
5800: 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  s);.}..#ifdef SQ
5810: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
5820: 63 20 69 6e 74 20 66 74 73 35 42 6c 6f 62 43 6f  c int fts5BlobCo
5830: 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74 20 75  mpare(.  const u
5840: 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74 20 6e 4c  8 *pLeft, int nL
5850: 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  eft, .  const u8
5860: 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52   *pRight, int nR
5870: 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  ight.){.  int nC
5880: 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66 74 2c 20  mp = MIN(nLeft, 
5890: 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72  nRight);.  int r
58a0: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66  es = memcmp(pLef
58b0: 74 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d 70 29  t, pRight, nCmp)
58c0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d  ;.  return (res=
58d0: 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d 20 6e 52  =0 ? (nLeft - nR
58e0: 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a  ight) : res);.}.
58f0: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
5900: 6e 74 20 66 74 73 35 4c 65 61 66 46 69 72 73 74  nt fts5LeafFirst
5910: 54 65 72 6d 4f 66 66 28 46 74 73 35 44 61 74 61  TermOff(Fts5Data
5920: 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20   *pLeaf){.  int 
5930: 72 65 74 3b 0a 20 20 66 74 73 35 47 65 74 56 61  ret;.  fts5GetVa
5940: 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
5950: 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c  [pLeaf->szLeaf],
5960: 20 72 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   ret);.  return 
5970: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ret;.}../*.** Cl
5980: 6f 73 65 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c  ose the read-onl
5990: 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c 20 69  y blob handle, i
59a0: 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f  f it is open..*/
59b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
59c0: 35 43 6c 6f 73 65 52 65 61 64 65 72 28 46 74 73  5CloseReader(Fts
59d0: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66  5Index *p){.  if
59e0: 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a  ( p->pReader ){.
59f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5a00: 20 2a 70 52 65 61 64 65 72 20 3d 20 70 2d 3e 70   *pReader = p->p
5a10: 52 65 61 64 65 72 3b 0a 20 20 20 20 70 2d 3e 70  Reader;.    p->p
5a20: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Reader = 0;.    
5a30: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
5a40: 73 65 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d  se(pReader);.  }
5a50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  .}.../*.** Retri
5a60: 65 76 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  eve a record fro
5a70: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
5a80: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
5a90: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
5aa0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
5ab0: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65 66 74  nd an error left
5ac0: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74 73 35   in the .** Fts5
5ad0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Index object..*/
5ae0: 0a 73 74 61 74 69 63 20 46 74 73 35 44 61 74 61  .static Fts5Data
5af0: 20 2a 66 74 73 35 44 61 74 61 52 65 61 64 28 46   *fts5DataRead(F
5b00: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
5b10: 20 69 52 6f 77 69 64 29 7b 0a 20 20 46 74 73 35   iRowid){.  Fts5
5b20: 44 61 74 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a  Data *pRet = 0;.
5b30: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
5b40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
5b50: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5b60: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ;..    if( p->pR
5b70: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f  eader ){.      /
5b80: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20  * This call may 
5b90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
5ba0: 4f 52 54 20 69 66 20 74 68 65 72 65 20 68 61 73  ORT if there has
5bb0: 20 62 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   been a savepoin
5bc0: 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  t.      ** rollb
5bd0: 61 63 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73  ack since it was
5be0: 20 6c 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74   last used. In t
5bf0: 68 69 73 20 63 61 73 65 20 61 20 6e 65 77 20 62  his case a new b
5c00: 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20  lob handle.     
5c10: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
5c20: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
5c30: 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d  e3_blob *pBlob =
5c40: 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20   p->pReader;.   
5c50: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5c60: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
5c70: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
5c80: 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29  n(pBlob, iRowid)
5c90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5ca0: 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b  p->pReader==0 );
5cb0: 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64 65  .      p->pReade
5cc0: 72 20 3d 20 70 42 6c 6f 62 3b 0a 20 20 20 20 20  r = pBlob;.     
5cd0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5ce0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  OK ){.        ft
5cf0: 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29  s5CloseReader(p)
5d00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41  if( rc==SQLITE_A
5d20: 42 4f 52 54 20 29 20 72 63 20 3d 20 53 51 4c 49  BORT ) rc = SQLI
5d30: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
5d40: 20 20 2f 2a 20 49 66 20 74 68 65 20 62 6c 6f 62    /* If the blob
5d50: 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20 6f   handle is not o
5d60: 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e  pen at this poin
5d70: 74 2c 20 6f 70 65 6e 20 69 74 20 61 6e 64 20 73  t, open it and s
5d80: 65 65 6b 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  eek .    ** to t
5d90: 68 65 20 72 65 71 75 65 73 74 65 64 20 65 6e 74  he requested ent
5da0: 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ry.  */.    if( 
5db0: 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 26 26  p->pReader==0 &&
5dc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5dd0: 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e 66  {.      Fts5Conf
5de0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
5df0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20  >pConfig;.      
5e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
5e10: 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e  b_open(pConfig->
5e20: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  db, .          p
5e30: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
5e40: 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b  zDataTbl, "block
5e50: 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26 70  ", iRowid, 0, &p
5e60: 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20 20  ->pReader.      
5e70: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
5e80: 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
5e90: 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  e sqlite3_blob_o
5ea0: 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
5eb0: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 63  _blob_reopen() c
5ec0: 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61 62 6f 76  alls.    ** abov
5ed0: 65 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  e returned SQLIT
5ee0: 45 5f 45 52 52 4f 52 2c 20 72 65 74 75 72 6e 20  E_ERROR, return 
5ef0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
5f00: 54 41 42 20 69 6e 73 74 65 61 64 2e 0a 20 20 20  TAB instead..   
5f10: 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72 65 61 73   ** All the reas
5f20: 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e 63 74 69  ons those functi
5f30: 6f 6e 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ons might return
5f40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2d 20   SQLITE_ERROR - 
5f50: 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74  missing.    ** t
5f60: 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67 20 72 6f  able, missing ro
5f70: 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74 65 78 74  w, non-blob/text
5f80: 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c 75 6d 6e   in block column
5f90: 20 2d 20 69 6e 64 69 63 61 74 65 20 0a 20 20 20   - indicate .   
5fa0: 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73 74 6f 72   ** backing stor
5fb0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  e corruption.  *
5fc0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
5fd0: 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 72 63 20  LITE_ERROR ) rc 
5fe0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
5ff0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6000: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6010: 75 38 20 2a 61 4f 75 74 20 3d 20 30 3b 20 20 20  u8 *aOut = 0;   
6020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6030: 65 61 64 20 62 6c 6f 62 20 64 61 74 61 20 69 6e  ead blob data in
6040: 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
6050: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  /.      int nByt
6060: 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  e = sqlite3_blob
6070: 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61 64 65  _bytes(p->pReade
6080: 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41  r);.      int nA
6090: 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 46 74  lloc = sizeof(Ft
60a0: 73 35 44 61 74 61 29 20 2b 20 6e 42 79 74 65 20  s5Data) + nByte 
60b0: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
60c0: 49 4e 47 3b 0a 20 20 20 20 20 20 70 52 65 74 20  ING;.      pRet 
60d0: 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71 6c  = (Fts5Data*)sql
60e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c  ite3_malloc(nAll
60f0: 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  oc);.      if( p
6100: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Ret ){.        p
6110: 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79 74 65 3b  Ret->nn = nByte;
6120: 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20  .        aOut = 
6130: 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26  pRet->p = (u8*)&
6140: 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 7d  pRet[1];.      }
6150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
6160: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6170: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6180: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6190: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
61a0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
61b0: 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72 2c 20  ead(p->pReader, 
61c0: 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30 29 3b  aOut, nByte, 0);
61d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
61e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
61f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6200: 74 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b 0a  te3_free(pRet);.
6210: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
6220: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6230: 20 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 31 3a         /* TODO1:
6240: 20 46 69 78 20 74 68 69 73 20 2a 2f 0a 20 20 20   Fix this */.   
6250: 20 20 20 20 20 70 52 65 74 2d 3e 73 7a 4c 65 61       pRet->szLea
6260: 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
6270: 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20  pRet->p[2]);.   
6280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
6290: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 70  ->rc = rc;.    p
62a0: 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a  ->nRead++;.  }..
62b0: 20 20 61 73 73 65 72 74 28 20 28 70 52 65 74 3d    assert( (pRet=
62c0: 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51 4c  =0)==(p->rc!=SQL
62d0: 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65 74  ITE_OK) );.  ret
62e0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
62f0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
6300: 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61 20 72  erence to data r
6310: 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64 20 62  ecord returned b
6320: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
6330: 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61  l to.** fts5Data
6340: 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Read()..*/.stati
6350: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
6360: 65 6c 65 61 73 65 28 46 74 73 35 44 61 74 61 20  elease(Fts5Data 
6370: 2a 70 44 61 74 61 29 7b 0a 20 20 73 71 6c 69 74  *pData){.  sqlit
6380: 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a  e3_free(pData);.
6390: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
63a0: 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74  s5IndexPrepareSt
63b0: 6d 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  mt(.  Fts5Index 
63c0: 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  *p,.  sqlite3_st
63d0: 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63  mt **ppStmt,.  c
63e0: 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69  har *zSql.){.  i
63f0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
6400: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  _OK ){.    if( z
6410: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Sql ){.      p->
6420: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
6430: 70 61 72 65 5f 76 32 28 70 2d 3e 70 43 6f 6e 66  pare_v2(p->pConf
6440: 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ig->db, zSql, -1
6450: 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , ppStmt, 0);.  
6460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
6470: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
6480: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
6490: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
64a0: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ql);.  return p-
64b0: 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  >rc;.}.../*.** I
64c0: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
64d0: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
64e0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
64f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6500: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74  fts5DataWrite(Ft
6510: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
6520: 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38  iRowid, const u8
6530: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
6540: 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ta){.  if( p->rc
6550: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6560: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  turn;..  if( p->
6570: 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20  pWriter==0 ){.  
6580: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
6590: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
65a0: 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65  ig;.    fts5Inde
65b0: 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
65c0: 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 73 71 6c  &p->pWriter, sql
65d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
65e0: 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
65f0: 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 64   INTO '%q'.'%q_d
6600: 61 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20  ata'(id, block) 
6610: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20  VALUES(?,?)", . 
6620: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
6630: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
6640: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
6650: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
6660: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  turn;.  }..  sql
6670: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
6680: 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69  p->pWriter, 1, i
6690: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
66a0: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
66b0: 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61  Writer, 2, pData
66c0: 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , nData, SQLITE_
66d0: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
66e0: 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74  e3_step(p->pWrit
66f0: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
6700: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
6710: 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  pWriter);.}../*.
6720: 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66  ** Execute the f
6730: 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a  ollowing SQL:.**
6740: 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46  .**     DELETE F
6750: 52 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45  ROM %_data WHERE
6760: 20 69 64 20 42 45 54 57 45 45 4e 20 24 69 46 69   id BETWEEN $iFi
6770: 72 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a  rst AND $iLast.*
6780: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6790: 73 35 44 61 74 61 44 65 6c 65 74 65 28 46 74 73  s5DataDelete(Fts
67a0: 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
67b0: 46 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74  First, i64 iLast
67c0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ){.  if( p->rc!=
67d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
67e0: 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44  rn;..  if( p->pD
67f0: 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  eleter==0 ){.   
6800: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73   int rc;.    Fts
6810: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
6820: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
6830: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
6840: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6850: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
6860: 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 64   FROM '%q'.'%q_d
6870: 61 74 61 27 20 57 48 45 52 45 20 69 64 3e 3d 3f  ata' WHERE id>=?
6880: 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 0a 20 20   AND id<=?", .  
6890: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
68a0: 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
68b0: 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
68c0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
68d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
68e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
68f0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
6900: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
6910: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53  (pConfig->db, zS
6920: 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c  ql, -1, &p->pDel
6930: 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  eter, 0);.      
6940: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
6950: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
6960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6970: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
6980: 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
6990: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
69a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
69b0: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
69c0: 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71  1, iFirst);.  sq
69d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
69e0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c  (p->pDeleter, 2,
69f0: 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74   iLast);.  sqlit
6a00: 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65  e3_step(p->pDele
6a10: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
6a20: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
6a30: 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f  >pDeleter);.}../
6a40: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
6a50: 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74  records associat
6a60: 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20  ed with segment 
6a70: 69 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61 74 69  iSegid..*/.stati
6a80: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
6a90: 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73  emoveSegment(Fts
6aa0: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
6ab0: 53 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46  Segid){.  i64 iF
6ac0: 69 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d  irst = FTS5_SEGM
6ad0: 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
6ae0: 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61 73  , 0);.  i64 iLas
6af0: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
6b00: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b 31 2c  _ROWID(iSegid+1,
6b10: 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74   0)-1;.  fts5Dat
6b20: 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73  aDelete(p, iFirs
6b30: 74 2c 20 69 4c 61 73 74 29 3b 0a 20 20 69 66 28  t, iLast);.  if(
6b40: 20 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 3d   p->pIdxDeleter=
6b50: 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  =0 ){.    Fts5Co
6b60: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
6b70: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
6b80: 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
6b90: 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78  Stmt(p, &p->pIdx
6ba0: 44 65 6c 65 74 65 72 2c 20 73 71 6c 69 74 65 33  Deleter, sqlite3
6bb0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6bc0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6bd0: 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57   '%q'.'%q_idx' W
6be0: 48 45 52 45 20 73 65 67 69 64 3d 3f 22 2c 0a 20  HERE segid=?",. 
6bf0: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
6c00: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
6c10: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
6c20: 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
6c30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6c40: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6c50: 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c  (p->pIdxDeleter,
6c60: 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20 20   1, iSegid);.   
6c70: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
6c80: 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20  >pIdxDeleter);. 
6c90: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
6ca0: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78  e3_reset(p->pIdx
6cb0: 44 65 6c 65 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  Deleter);.  }.}.
6cc0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6cd0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
6ce0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
6cf0: 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20 62  bject returned b
6d00: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a  y an earlier .**
6d10: 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72   call to fts5Str
6d20: 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72 20  uctureRead() or 
6d30: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
6d40: 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
6d50: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
6d60: 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35 53  ureRelease(Fts5S
6d70: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
6d80: 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72 75 63  t){.  if( pStruc
6d90: 74 20 26 26 20 30 3e 3d 28 2d 2d 70 53 74 72 75  t && 0>=(--pStru
6da0: 63 74 2d 3e 6e 52 65 66 29 20 29 7b 0a 20 20 20  ct->nRef) ){.   
6db0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
6dc0: 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  rt( pStruct->nRe
6dd0: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  f==0 );.    for(
6de0: 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e  i=0; i<pStruct->
6df0: 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
6e00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6e10: 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
6e20: 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d  [i].aSeg);.    }
6e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6e40: 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  e(pStruct);.  }.
6e50: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
6e60: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
6e70: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
6e80: 53 74 72 75 63 74 29 7b 0a 20 20 70 53 74 72 75  Struct){.  pStru
6e90: 63 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f  ct->nRef++;.}../
6ea0: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
6eb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
6ec0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
6ed0: 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
6ee0: 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a  d in serialized.
6ef0: 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62  ** form within b
6f00: 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74  uffer pData/nDat
6f10: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  a..**.** The Fts
6f20: 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65  5Structure.aLeve
6f30: 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73  l[] and each Fts
6f40: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e  5StructureLevel.
6f50: 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  aSeg[] array.** 
6f60: 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74  are over-allocat
6f70: 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20  ed by one slot. 
6f80: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
6f90: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e  structure conten
6fa0: 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65  ts.** to be more
6fb0: 20 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a   easily edited..
6fc0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
6fd0: 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74  r occurs, *ppOut
6fe0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
6ff0: 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72  and an SQLite er
7000: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75  ror code.** retu
7010: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
7020: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
7030: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
7040: 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a  ew object and.**
7050: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
7060: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
7070: 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65  nt fts5Structure
7080: 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  Decode(.  const 
7090: 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  u8 *pData,      
70a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
70b0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  fer containing s
70c0: 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74  erialized struct
70d0: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  ure */.  int nDa
70e0: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
70f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
7100: 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74 61   of buffer pData
7110: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
7120: 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20  nt *piCookie,   
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7140: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
7150: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
7160: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7170: 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20  **ppOut         
7180: 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69    /* OUT: Deseri
7190: 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f  alized object */
71a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
71b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
71c0: 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76  i = 0;.  int iLv
71d0: 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20  l;.  int nLevel 
71e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d  = 0;.  int nSegm
71f0: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ent = 0;.  int n
7200: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
7210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7220: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
7230: 61 6c 6c 6f 63 61 74 65 20 61 74 20 70 52 65 74  allocate at pRet
7240: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
7250: 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20  ure *pRet = 0;  
7260: 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
7270: 72 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  re object to ret
7280: 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61  urn */..  /* Gra
7290: 62 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  b the cookie val
72a0: 75 65 20 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f  ue */.  if( piCo
72b0: 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65  okie ) *piCookie
72c0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   = sqlite3Fts5Ge
72d0: 74 33 32 28 70 44 61 74 61 29 3b 0a 20 20 69 20  t32(pData);.  i 
72e0: 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  = 4;..  /* Read 
72f0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7300: 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73   of levels and s
7310: 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
7320: 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20   start of the.  
7330: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72 65 63  ** structure rec
7340: 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20  ord.  */.  i += 
7350: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7360: 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65  &pData[i], nLeve
7370: 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35 47  l);.  i += fts5G
7380: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7390: 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  a[i], nSegment);
73a0: 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20  .  nByte = (.   
73b0: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
73c0: 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20  ructure) +      
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
73e0: 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20   Main structure 
73f0: 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
7400: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7410: 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2d 31 29  el) * (nLevel-1)
7420: 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20      /* aLevel[] 
7430: 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20  array */.  );.  
7440: 70 52 65 74 20 3d 20 28 46 74 73 35 53 74 72 75  pRet = (Fts5Stru
7450: 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74  cture*)sqlite3Ft
7460: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
7470: 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28  , nByte);..  if(
7480: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65   pRet ){.    pRe
7490: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
74a0: 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pRet->nLevel = 
74b0: 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52 65 74  nLevel;.    pRet
74c0: 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65  ->nSegment = nSe
74d0: 67 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20  gment;.    i += 
74e0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
74f0: 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20  rint(&pData[i], 
7500: 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75  &pRet->nWriteCou
7510: 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nter);..    for(
7520: 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iLvl=0; rc==SQLI
7530: 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c  TE_OK && iLvl<nL
7540: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
7550: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
7560: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
7570: 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  &pRet->aLevel[iL
7580: 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  vl];.      int n
7590: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74  Total;.      int
75a0: 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20 69 20   iSeg;..      i 
75b0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
75c0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
75d0: 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20  vl->nMerge);.   
75e0: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
75f0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7600: 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20  ], nTotal);.    
7610: 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61 6c    assert( nTotal
7620: 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  >=pLvl->nMerge )
7630: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53  ;.      pLvl->aS
7640: 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  eg = (Fts5Struct
7650: 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69  ureSegment*)sqli
7660: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
7670: 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20  o(&rc, .        
7680: 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f    nTotal * sizeo
7690: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
76a0: 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 29 3b  egment).      );
76b0: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
76c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76d0: 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20       pLvl->nSeg 
76e0: 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = nTotal;.      
76f0: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
7700: 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b  eg<nTotal; iSeg+
7710: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20  +){.          i 
7720: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7730: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7740: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl->aSeg[iSeg].i
7750: 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
7760: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
7770: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
7780: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
7790: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
77a0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
77b0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
77c0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
77d0: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61  Seg[iSeg].pgnoLa
77e0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
77f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7800: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
7810: 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a  eRelease(pRet);.
7820: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
7830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7840: 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20    }..  *ppOut = 
7850: 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  pRet;.  return r
7860: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  c;.}../*.**.*/.s
7870: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
7880: 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
7890: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53  (int *pRc, Fts5S
78a0: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
78b0: 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  uct){.  if( *pRc
78c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
78d0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
78e0: 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
78f0: 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e  truct;.    int n
7900: 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
7910: 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74  >nLevel;.    int
7920: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
7930: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
7940: 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20  ructure) +      
7950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7960: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
7970: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
7980: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7990: 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29  el) * (nLevel+1)
79a0: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
79b0: 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20  ray */.    );.. 
79c0: 20 20 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c     pStruct = sql
79d0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74  ite3_realloc(pSt
79e0: 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ruct, nByte);.  
79f0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
7a00: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
7a10: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e  Struct->aLevel[n
7a20: 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f  Level], 0, sizeo
7a30: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7a40: 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53  evel));.      pS
7a50: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b  truct->nLevel++;
7a60: 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74  .      *ppStruct
7a70: 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20   = pStruct;.    
7a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
7a90: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7aa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7ab0: 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65  *.** Extend leve
7ac0: 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74  l iLvl so that t
7ad0: 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
7ae0: 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61   at least nExtra
7af0: 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74   more.** segment
7b00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7b10: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45  d fts5StructureE
7b20: 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e  xtendLevel(.  in
7b30: 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53  t *pRc, .  Fts5S
7b40: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7b50: 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  t, .  int iLvl, 
7b60: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a  .  int nExtra, .
7b70: 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b    int bInsert.){
7b80: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
7b90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
7ba0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7bb0: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
7bc0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
7bd0: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7be0: 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b  reSegment *aNew;
7bf0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  .    int nByte;.
7c00: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 70 4c  .    nByte = (pL
7c10: 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72  vl->nSeg + nExtr
7c20: 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  a) * sizeof(Fts5
7c30: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7c40: 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  );.    aNew = sq
7c50: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c  lite3_realloc(pL
7c60: 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65 29  vl->aSeg, nByte)
7c70: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 20 29  ;.    if( aNew )
7c80: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 73  {.      if( bIns
7c90: 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ert==0 ){.      
7ca0: 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70    memset(&aNew[p
7cb0: 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73  Lvl->nSeg], 0, s
7cc0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7cd0: 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45  ureSegment) * nE
7ce0: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtra);.      }el
7cf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7d00: 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nMove = pLvl->nS
7d10: 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  eg * sizeof(Fts5
7d20: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7d30: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
7d40: 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d  ve(&aNew[nExtra]
7d50: 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a  , aNew, nMove);.
7d60: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
7d70: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  New, 0, sizeof(F
7d80: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7d90: 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a  ent) * nExtra);.
7da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
7db0: 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b  vl->aSeg = aNew;
7dc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7dd0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
7de0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
7df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20  .}../*.** Read, 
7e00: 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  deserialize and 
7e10: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
7e20: 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
7e30: 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63  ** The Fts5Struc
7e40: 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e  ture.aLevel[] an
7e50: 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63  d each Fts5Struc
7e60: 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d  tureLevel.aSeg[]
7e70: 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76   array.** are ov
7e80: 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20  er-allocated as 
7e90: 64 65 73 63 72 69 62 65 64 20 66 6f 72 20 66 75  described for fu
7ea0: 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63  nction fts5Struc
7eb0: 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a  tureDecode() .**
7ec0: 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   above..**.** If
7ed0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7ee0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
7ef0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
7f00: 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65  code left in the
7f10: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61  .** Fts5Index ha
7f20: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
7f30: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
7f40: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
7f50: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
7f60: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
7f70: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
7f80: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
7f90: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
7fa0: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  d(Fts5Index *p){
7fb0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
7fc0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
7fd0: 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  fig;.  Fts5Struc
7fe0: 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20  ture *pRet = 0; 
7ff0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
8000: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
8010: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8040: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73   cookie */.  Fts
8050: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20  5Data *pData;.. 
8060: 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
8070: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54  aRead(p, FTS5_ST
8080: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a  RUCTURE_ROWID);.
8090: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
80a0: 74 75 72 6e 20 30 3b 0a 20 20 2f 2a 20 54 4f 44  turn 0;.  /* TOD
80b0: 4f 3a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 68  O: Do we need th
80c0: 69 73 20 69 66 20 74 68 65 20 6c 65 61 66 2d 69  is if the leaf-i
80d0: 6e 64 65 78 20 69 73 20 61 70 70 65 6e 64 65 64  ndex is appended
80e0: 3f 20 50 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f  ? Probably... */
80f0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 44 61 74 61  .  memset(&pData
8100: 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20  ->p[pData->nn], 
8110: 30 2c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44  0, FTS5_DATA_PAD
8120: 44 49 4e 47 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  DING);.  p->rc =
8130: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
8140: 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70  code(pData->p, p
8150: 44 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b  Data->nn, &iCook
8160: 69 65 2c 20 26 70 52 65 74 29 3b 0a 20 20 69 66  ie, &pRet);.  if
8170: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8180: 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e 69  OK && pConfig->i
8190: 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 20  Cookie!=iCookie 
81a0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
81b0: 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67  qlite3Fts5Config
81c0: 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 69 43  Load(pConfig, iC
81d0: 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 0a 20 20 66  ookie);.  }..  f
81e0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
81f0: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Data);.  if( p->
8200: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8210: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
8220: 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b  reRelease(pRet);
8230: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
8240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
8250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8260: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
8270: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69  er of segments i
8280: 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  n index structur
8290: 65 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 0a  e pStruct. This.
82a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  ** function is o
82b0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 61 73  nly ever used as
82c0: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
82d0: 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f  ) conditions..*/
82e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
82f0: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
8300: 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
8310: 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73 35 53  ntSegments(Fts5S
8320: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
8330: 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65  t){.  int nSegme
8340: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
8350: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
8360: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
8370: 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75  s */.  if( pStru
8380: 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  ct ){.    int iL
8390: 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
83a0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
83b0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
83c0: 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
83d0: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
83e0: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
83f0: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
8400: 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53    nSegment += pS
8410: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
8420: 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a  vl].nSeg;.    }.
8430: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53    }..  return nS
8440: 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66  egment;.}.#endif
8450: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ..#define fts5Bu
8460: 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
8470: 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20  ob(pBuf, pBlob, 
8480: 6e 42 6c 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20  nBlob) {     \. 
8490: 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
84a0: 3e 6e 53 70 61 63 65 3e 3d 28 28 70 42 75 66 29  >nSpace>=((pBuf)
84b0: 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20  ->n+nBlob) );   
84c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d 65            \.  me
84d0: 6d 63 70 79 28 26 28 70 42 75 66 29 2d 3e 70 5b  mcpy(&(pBuf)->p[
84e0: 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f  (pBuf)->n], pBlo
84f0: 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20  b, nBlob);      
8500: 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66         \.  (pBuf
8510: 29 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20  )->n += nBlob;  
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65      \.}..#define
8550: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
8560: 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
8570: 2c 20 69 56 61 6c 29 20 7b 20 20 20 20 20 20 20  , iVal) {       
8580: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42           \.  (pB
8590: 75 66 29 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  uf)->n += sqlite
85a0: 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
85b0: 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66 29  (pBuf)->p[(pBuf)
85c0: 2d 3e 6e 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20  ->n], (iVal));  
85d0: 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 75  \.  assert( (pBu
85e0: 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75  f)->nSpace>=(pBu
85f0: 66 29 2d 3e 6e 20 29 3b 20 20 20 20 20 20 20 20  f)->n );        
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65    \.}.../*.** Se
8620: 72 69 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72  rialize and stor
8630: 65 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65  e the "structure
8640: 22 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  " record..**.** 
8650: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8660: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
8670: 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 46  or code in the F
8680: 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  ts5Index object.
8690: 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   If an.** error 
86a0: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
86b0: 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
86c0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
86d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
86e0: 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
86f0: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
8700: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8710: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70  Struct){.  if( p
8720: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8730: 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  ){.    Fts5Buffe
8740: 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  r buf;          
8750: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
8760: 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f  o serialize reco
8770: 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69  rd into */.    i
8780: 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87a0: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
87b0: 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
87c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69  /.    int iCooki
87d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
87e0: 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61      /* Cookie va
87f0: 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a  lue to store */.
8800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
8810: 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  ruct->nSegment==
8820: 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
8830: 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75  ntSegments(pStru
8840: 63 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ct) );.    memse
8850: 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
8860: 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
8870: 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
8880: 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69  he current confi
8890: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
88a0: 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d  */.    iCookie =
88b0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f   p->pConfig->iCo
88c0: 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 69 43  okie;.    if( iC
88d0: 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69  ookie<0 ) iCooki
88e0: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
88f0: 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 42 75  0==sqlite3Fts5Bu
8900: 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
8910: 20 26 62 75 66 2c 20 34 2b 39 2b 39 2b 39 29 20   &buf, 4+9+9+9) 
8920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8930: 46 74 73 35 50 75 74 33 32 28 62 75 66 2e 70 2c  Fts5Put32(buf.p,
8940: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20   iCookie);.     
8950: 20 62 75 66 2e 6e 20 3d 20 34 3b 0a 20 20 20 20   buf.n = 4;.    
8960: 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
8970: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75  AppendVarint(&bu
8980: 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  f, pStruct->nLev
8990: 65 6c 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  el);.      fts5B
89a0: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
89b0: 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74 72  arint(&buf, pStr
89c0: 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a  uct->nSegment);.
89d0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
89e0: 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
89f0: 28 26 62 75 66 2c 20 28 69 36 34 29 70 53 74 72  (&buf, (i64)pStr
8a00: 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
8a10: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
8a20: 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
8a30: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
8a40: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
8a50: 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20   int iSeg;      
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a70: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
8a80: 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
8a90: 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  ts */.      Fts5
8aa0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
8ab0: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
8ac0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
8ad0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
8ae0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
8af0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
8b00: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66  nMerge);.      f
8b10: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8b20: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8b30: 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b  uf, pLvl->nSeg);
8b40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8b50: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
8b60: 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20  l->nSeg );..    
8b70: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
8b80: 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
8b90: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
8ba0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8bb0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8bc0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
8bd0: 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20  iSeg].iSegid);. 
8be0: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
8bf0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8c00: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8c10: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
8c20: 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20  oFirst);.       
8c30: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8c40: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8c50: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
8c60: 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29  [iSeg].pgnoLast)
8c70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8c80: 0a 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69  .    fts5DataWri
8c90: 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43  te(p, FTS5_STRUC
8ca0: 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e  TURE_ROWID, buf.
8cb0: 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66  p, buf.n);.    f
8cc0: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
8cd0: 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  uf);.  }.}..#if 
8ce0: 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  0.static void ft
8cf0: 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65  s5DebugStructure
8d00: 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66 65 72  (int*,Fts5Buffer
8d10: 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72 65 2a  *,Fts5Structure*
8d20: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  );.static void f
8d30: 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72  ts5PrintStructur
8d40: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  e(const char *zC
8d50: 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72 75  aption, Fts5Stru
8d60: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8d70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8d80: 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66  TE_OK;.  Fts5Buf
8d90: 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65  fer buf;.  memse
8da0: 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
8db0: 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35 44  f(buf));.  fts5D
8dc0: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 26 72  ebugStructure(&r
8dd0: 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74  c, &buf, pStruct
8de0: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  );.  fprintf(std
8df0: 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c  out, "%s: %s\n",
8e00: 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70   zCaption, buf.p
8e10: 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f  );.  fflush(stdo
8e20: 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  ut);.  fts5Buffe
8e30: 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23  rFree(&buf);.}.#
8e40: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
8e50: 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65  s5PrintStructure
8e60: 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74  (x,y).#endif..st
8e70: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 65 67  atic int fts5Seg
8e80: 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53 74 72  mentSize(Fts5Str
8e90: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8ea0: 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 31  Seg){.  return 1
8eb0: 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   + pSeg->pgnoLas
8ec0: 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  t - pSeg->pgnoFi
8ed0: 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rst;.}../*.** Re
8ee0: 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 69  turn a copy of i
8ef0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
8f00: 53 74 72 75 63 74 2e 20 45 78 63 65 70 74 2c 20  Struct. Except, 
8f10: 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20  promote as many 
8f20: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 73 20  .** segments as 
8f30: 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76 65  possible to leve
8f40: 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61  l iPromote. If a
8f50: 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55  n OOM occurs, NU
8f60: 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  LL is .** return
8f70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
8f80: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
8f90: 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73  PromoteTo(.  Fts
8fa0: 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74  5Index *p,.  int
8fb0: 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74   iPromote,.  int
8fc0: 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74   szPromote,.  Ft
8fd0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
8fe0: 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c  ruct.){.  int il
8ff0: 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75  , is;.  Fts5Stru
9000: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74  ctureLevel *pOut
9010: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9020: 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a  vel[iPromote];..
9030: 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72    if( pOut->nMer
9040: 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ge==0 ){.    for
9050: 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20  (il=iPromote+1; 
9060: 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  il<pStruct->nLev
9070: 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20  el; il++){.     
9080: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9090: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
90a0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d  ruct->aLevel[il]
90b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
90c0: 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74 75 72  ->nMerge ) retur
90d0: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 73 3d  n;.      for(is=
90e0: 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73  pLvl->nSeg-1; is
90f0: 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20  >=0; is--){.    
9100: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66 74 73      int sz = fts
9110: 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c  5SegmentSize(&pL
9120: 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20  vl->aSeg[is]);. 
9130: 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a         if( sz>sz
9140: 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72 6e  Promote ) return
9150: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  ;.        fts5St
9160: 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
9170: 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
9180: 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c  ct, iPromote, 1,
9190: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
91a0: 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
91b0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
91c0: 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76  pOut->aSeg, &pLv
91d0: 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a  l->aSeg[is], siz
91e0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
91f0: 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20  eSegment));.    
9200: 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b      pOut->nSeg++
9210: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
9220: 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nSeg--;.      }.
9230: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9240: 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74  ** A new segment
9250: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77   has just been w
9260: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
9270: 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74  iLvl of index st
9280: 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75  ructure.** pStru
9290: 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ct. This functio
92a0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  n determines if 
92b0: 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f  any segments sho
92c0: 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a  uld be promoted.
92d0: 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20  ** as a result. 
92e0: 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f  Segments are pro
92f0: 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65  moted in two sce
9300: 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
9310: 61 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e  a) If the segmen
9320: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69  t just written i
9330: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  s smaller than o
9340: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
9350: 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68  nts.**      with
9360: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
9370: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c  populated level,
9380: 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20   it is promoted 
9390: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  to the previous.
93a0: 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65  **      populate
93b0: 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20  d level..**.**  
93c0: 20 62 29 20 49 66 20 74 68 65 20 73 65 67 6d 65   b) If the segme
93d0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
93e0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
93f0: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
9400: 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65  t on.**      the
9410: 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20   next populated 
9420: 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74  level, then that
9430: 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e   segment, and an
9440: 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74  y other adjacent
9450: 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74  .**      segment
9460: 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
9470: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
9480: 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65   one just writte
9490: 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20  n, are .**      
94a0: 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a  promoted. .**.**
94b0: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
94c0: 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f  segments are pro
94d0: 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75 63  moted, the struc
94e0: 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75  ture object is u
94f0: 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66  pdated.** to ref
9500: 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  lect this..*/.st
9510: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
9520: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a  ructurePromote(.
9530: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
9560: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  d object */.  in
9570: 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20  t iLvl,         
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9590: 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73   Index level jus
95a0: 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46  t updated */.  F
95b0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
95c0: 74 72 75 63 74 20 20 20 20 20 20 20 20 20 20 2f  truct          /
95d0: 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
95e0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  e */.){.  if( p-
95f0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9600: 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a  {.    int iTst;.
9610: 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65      int iPromote
9620: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73   = -1;.    int s
9630: 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20  zPromote = 0;   
9640: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d           /* Prom
9650: 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69  ote anything thi
9660: 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65  s size or smalle
9670: 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72  r */.    Fts5Str
9680: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
9690: 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e  Seg;   /* Segmen
96a0: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  t just written *
96b0: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b  /.    int szSeg;
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
96e0: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
96f0: 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ten */.    int n
9700: 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 61  Seg = pStruct->a
9710: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
9720: 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3d  ;..    if( nSeg=
9730: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
9740: 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74   pSeg = &pStruct
9750: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
9760: 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg[pStruct->aLe
9770: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31  vel[iLvl].nSeg-1
9780: 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d 20 28  ];.    szSeg = (
9790: 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  1 + pSeg->pgnoLa
97a0: 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  st - pSeg->pgnoF
97b0: 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  irst);..    /* C
97c0: 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69  heck for conditi
97d0: 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f  on (a) */.    fo
97e0: 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69  r(iTst=iLvl-1; i
97f0: 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72 75 63  Tst>=0 && pStruc
9800: 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e  t->aLevel[iTst].
9810: 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29  nSeg==0; iTst--)
9820: 3b 0a 20 20 20 20 69 66 28 20 69 54 73 74 3e 3d  ;.    if( iTst>=
9830: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
9840: 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 4d 61  ;.      int szMa
9850: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73  x = 0;.      Fts
9860: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9870: 2a 70 54 73 74 20 3d 20 26 70 53 74 72 75 63 74  *pTst = &pStruct
9880: 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a  ->aLevel[iTst];.
9890: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
98a0: 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b  st->nMerge==0 );
98b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
98c0: 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b  i<pTst->nSeg; i+
98d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
98e0: 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b  sz = pTst->aSeg[
98f0: 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54  i].pgnoLast - pT
9900: 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f  st->aSeg[i].pgno
9910: 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20 20 20  First + 1;.     
9920: 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20     if( sz>szMax 
9930: 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20  ) szMax = sz;.  
9940: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9950: 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a  szMax>=szSeg ){.
9960: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69          /* Condi
9970: 74 69 6f 6e 20 28 61 29 20 69 73 20 74 72 75 65  tion (a) is true
9980: 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65  . Promote the ne
9990: 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20  west segment on 
99a0: 6c 65 76 65 6c 20 0a 20 20 20 20 20 20 20 20 2a  level .        *
99b0: 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20  * iLvl to level 
99c0: 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  iTst.  */.      
99d0: 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73    iPromote = iTs
99e0: 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 72 6f  t;.        szPro
99f0: 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20  mote = szMax;.  
9a00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9a10: 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e   /* If condition
9a20: 20 28 61 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c   (a) is not met,
9a30: 20 61 73 73 75 6d 65 20 28 62 29 20 69 73 20 74   assume (b) is t
9a40: 72 75 65 2e 20 53 74 72 75 63 74 75 72 65 50 72  rue. StructurePr
9a50: 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a  omoteTo().    **
9a60: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69   is a no-op if i
9a70: 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20  t is not.  */.  
9a80: 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30    if( iPromote<0
9a90: 20 29 7b 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f   ){.      iPromo
9aa0: 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  te = iLvl;.     
9ab0: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53   szPromote = szS
9ac0: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  eg;.    }.    ft
9ad0: 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
9ae0: 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65  teTo(p, iPromote
9af0: 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74  , szPromote, pSt
9b00: 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ruct);.  }.}.../
9b10: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
9b20: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
9b30: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
9b40: 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 65 6e  ument. If the en
9b50: 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63  d of the .** doc
9b60: 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20  list-index page 
9b70: 69 73 20 72 65 61 63 68 65 64 2c 20 72 65 74 75  is reached, retu
9b80: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
9b90: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
9ba0: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74 73 35  lidxLvlNext(Fts5
9bb0: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b  DlidxLvl *pLvl){
9bc0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
9bd0: 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61  ta = pLvl->pData
9be0: 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69  ;..  if( pLvl->i
9bf0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Off==0 ){.    as
9c00: 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66  sert( pLvl->bEof
9c10: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  ==0 );.    pLvl-
9c20: 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20 20 70  >iOff = 1;.    p
9c30: 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  Lvl->iOff += fts
9c40: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
9c50: 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d  ata->p[1], pLvl-
9c60: 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20  >iLeafPgno);.   
9c70: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66   pLvl->iOff += f
9c80: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
9c90: 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66  ata->p[pLvl->iOf
9ca0: 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d  f], (u64*)&pLvl-
9cb0: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c  >iRowid);.    pL
9cc0: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20  vl->iFirstOff = 
9cd0: 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65  pLvl->iOff;.  }e
9ce0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  lse{.    int iOf
9cf0: 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 3d  f;.    for(iOff=
9d00: 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66  pLvl->iOff; iOff
9d10: 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66  <pData->nn; iOff
9d20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
9d30: 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20  Data->p[iOff] ) 
9d40: 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20  break; .    }.. 
9d50: 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44 61 74     if( iOff<pDat
9d60: 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69  a->nn ){.      i
9d70: 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70  64 iVal;.      p
9d80: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b  Lvl->iLeafPgno +
9d90: 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e  = (iOff - pLvl->
9da0: 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20 20 20  iOff) + 1;.     
9db0: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
9dc0: 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
9dd0: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
9de0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  Val);.      pLvl
9df0: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c  ->iRowid += iVal
9e00: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f  ;.      pLvl->iO
9e10: 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d  ff = iOff;.    }
9e20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c  else{.      pLvl
9e30: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  ->bEof = 1;.    
9e40: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9e50: 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f  pLvl->bEof;.}../
9e60: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
9e70: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
9e80: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
9e90: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
9ea0: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
9eb0: 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e 64 65  erNextR(Fts5Inde
9ec0: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
9ed0: 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
9ee0: 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69  iLvl){.  Fts5Dli
9ef0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
9f00: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d  Iter->aLvl[iLvl]
9f10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
9f20: 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b  l<pIter->nLvl );
9f30: 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78  .  if( fts5Dlidx
9f40: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b  LvlNext(pLvl) ){
9f50: 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31  .    if( (iLvl+1
9f60: 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  ) < pIter->nLvl 
9f70: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
9f80: 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70  dxIterNextR(p, p
9f90: 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20  Iter, iLvl+1);. 
9fa0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d       if( pLvl[1]
9fb0: 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  .bEof==0 ){.    
9fc0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
9fd0: 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
9fe0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
9ff0: 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pLvl, 0, sizeof
a000: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
a010: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  .        pLvl->p
a020: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
a030: 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ead(p, .        
a040: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
a050: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
a060: 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31  id, iLvl, pLvl[1
a070: 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ].iLeafPgno).   
a080: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
a090: 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20  if( pLvl->pData 
a0a0: 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ) fts5DlidxLvlNe
a0b0: 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20  xt(pLvl);.      
a0c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
a0d0: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
a0e0: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61  l[0].bEof;.}.sta
a0f0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a100: 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  xIterNext(Fts5In
a110: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
a120: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
a130: 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64   return fts5Dlid
a140: 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49  xIterNextR(p, pI
a150: 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ter, 0);.}../*.*
a160: 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 70  * The iterator p
a170: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
a180: 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  st argument has 
a190: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
a1a0: 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73 20 66  elds set.** as f
a1b0: 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66 75 6e  ollows. This fun
a1c0: 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20 74 68  ction sets up th
a1d0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 74  e rest of the it
a1e0: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
a1f0: 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  t.** points to t
a200: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69  he first rowid i
a210: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  n the doclist-in
a220: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61  dex..**.**   pDa
a230: 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74  ta:.**     point
a240: 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e  er to doclist-in
a250: 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a  dex record, .**.
a260: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
a270: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
a280: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
a290: 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
a2a0: 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69  ber the.** docli
a2b0: 73 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  st is associated
a2c0: 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65 20 66   with (the one f
a2d0: 65 61 74 75 72 69 6e 67 20 74 68 65 20 74 65 72  eaturing the ter
a2e0: 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  m)..*/.static in
a2f0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46  t fts5DlidxIterF
a300: 69 72 73 74 28 46 74 73 35 44 6c 69 64 78 49 74  irst(Fts5DlidxIt
a310: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
a320: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
a330: 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
a340: 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69  ++){.    fts5Dli
a350: 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74 65 72  dxLvlNext(&pIter
a360: 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a  ->aLvl[i]);.  }.
a370: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
a380: 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a  aLvl[0].bEof;.}.
a390: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
a3a0: 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74  5DlidxIterEof(Ft
a3b0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
a3c0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
a3d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  ){.  return p->r
a3e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
a3f0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62  pIter->aLvl[0].b
a400: 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  Eof;.}..static v
a410: 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65  oid fts5DlidxIte
a420: 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65 78 20  rLast(Fts5Index 
a430: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
a440: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
a450: 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   i;..  /* Advanc
a460: 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74 6f 20  e each level to 
a470: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 6f  the last entry o
a480: 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
a490: 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74 65 72  */.  for(i=pIter
a4a0: 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d  ->nLvl-1; p->rc=
a4b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e  =SQLITE_OK && i>
a4c0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74  =0; i--){.    Ft
a4d0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
a4e0: 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   = &pIter->aLvl[
a4f0: 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66  i];.    while( f
a500: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
a510: 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  pLvl)==0 );.    
a520: 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a  pLvl->bEof = 0;.
a530: 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a  .    if( i>0 ){.
a540: 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c        Fts5DlidxL
a550: 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c  vl *pChild = &pL
a560: 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74  vl[-1];.      ft
a570: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 43  s5DataRelease(pC
a580: 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20  hild->pData);.  
a590: 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68 69 6c      memset(pChil
a5a0: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  d, 0, sizeof(Fts
a5b0: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
a5c0: 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61 74 61     pChild->pData
a5d0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
a5e0: 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  p, .          FT
a5f0: 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
a600: 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d  Iter->iSegid, i-
a610: 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67  1, pLvl->iLeafPg
a620: 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  no).      );.   
a630: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a640: 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
a650: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
a660: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f  only argument to
a670: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
a680: 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  try..*/.static i
a690: 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50  nt fts5DlidxLvlP
a6a0: 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  rev(Fts5DlidxLvl
a6b0: 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69   *pLvl){.  int i
a6c0: 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off = pLvl->iOff
a6d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76  ;..  assert( pLv
a6e0: 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  l->bEof==0 );.  
a6f0: 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e  if( iOff<=pLvl->
a700: 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20  iFirstOff ){.   
a710: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b   pLvl->bEof = 1;
a720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
a730: 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74   *a = pLvl->pDat
a740: 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20 69 56  a->p;.    i64 iV
a750: 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  al;.    int iLim
a760: 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a  it;.    int ii;.
a770: 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20      int nZero = 
a780: 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65  0;..    /* Curre
a790: 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73  ntly iOff points
a7a0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
a7b0: 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20  te of a varint. 
a7c0: 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20  This block .    
a7d0: 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f  ** decrements iO
a7e0: 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e  ff until it poin
a7f0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
a800: 62 79 74 65 20 6f 66 20 74 68 65 20 70 72 65 76  byte of the prev
a810: 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72  ious .    ** var
a820: 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65  int. Taking care
a830: 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79   not to read any
a840: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
a850: 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20  s that occur.   
a860: 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62   ** before the b
a870: 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e  uffer in memory.
a880: 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20    */.    iLimit 
a890: 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66  = (iOff>9 ? iOff
a8a0: 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72  -9 : 0);.    for
a8b0: 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c  (iOff--; iOff>iL
a8c0: 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20  imit; iOff--){. 
a8d0: 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66       if( (a[iOff
a8e0: 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29  -1] & 0x80)==0 )
a8f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
a900: 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
a910: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
a920: 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76  )&iVal);.    pLv
a930: 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56 61  l->iRowid -= iVa
a940: 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65  l;.    pLvl->iLe
a950: 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f  afPgno--;..    /
a960: 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72 64 73  * Skip backwards
a970: 20 70 61 73 74 20 61 6e 79 20 30 78 30 30 20 76   past any 0x00 v
a980: 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66  arints. */.    f
a990: 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69  or(ii=iOff-1; ii
a9a0: 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  >=pLvl->iFirstOf
a9b0: 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30  f && a[ii]==0x00
a9c0: 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e  ; ii--){.      n
a9d0: 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Zero++;.    }.  
a9e0: 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e    if( ii>=pLvl->
a9f0: 69 46 69 72 73 74 4f 66 66 20 26 26 20 28 61 5b  iFirstOff && (a[
aa00: 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b 0a 20  ii] & 0x80) ){. 
aa10: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
aa20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 66   immediately bef
aa30: 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30 78 30  ore the last 0x0
aa40: 30 20 62 79 74 65 20 68 61 73 20 74 68 65 20 30  0 byte has the 0
aa50: 78 38 30 20 62 69 74 0a 20 20 20 20 20 20 2a 2a  x80 bit.      **
aa60: 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c 61 73   set. So the las
aa70: 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79 20 61  t 0x00 is only a
aa80: 20 76 61 72 69 6e 74 20 30 20 69 66 20 74 68 65   varint 0 if the
aa90: 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20 30 78  re are 8 more 0x
aaa0: 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  80.      ** byte
aab0: 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20  s before a[ii]. 
aac0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 5a 65  */.      int bZe
aad0: 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ro = 0;         
aae0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
aaf0: 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e 74 73  last 0x00 counts
ab00: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 69   */.      if( (i
ab10: 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72  i-8)>=pLvl->iFir
ab20: 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  stOff ){.       
ab30: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
ab40: 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26  for(j=1; j<=8 &&
ab50: 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30   (a[ii-j] & 0x80
ab60: 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  ); j++);.       
ab70: 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a   bZero = (j>8);.
ab80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ab90: 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65  ( bZero==0 ) nZe
aba0: 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ro--;.    }.    
abb0: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  pLvl->iLeafPgno 
abc0: 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c  -= nZero;.    pL
abd0: 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20  vl->iOff = iOff 
abe0: 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20  - nZero;.  }..  
abf0: 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f  return pLvl->bEo
ac00: 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  f;.}..static int
ac10: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
ac20: 65 76 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70  evR(Fts5Index *p
ac30: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
ac40: 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c  *pIter, int iLvl
ac50: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76  ){.  Fts5DlidxLv
ac60: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
ac70: 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20  ->aLvl[iLvl];.. 
ac80: 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49   assert( iLvl<pI
ac90: 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69  ter->nLvl );.  i
aca0: 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50  f( fts5DlidxLvlP
acb0: 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20  rev(pLvl) ){.   
acc0: 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20   if( (iLvl+1) < 
acd0: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20  pIter->nLvl ){. 
ace0: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
acf0: 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72  erPrevR(p, pIter
ad00: 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20  , iLvl+1);.     
ad10: 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f   if( pLvl[1].bEo
ad20: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
ad30: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
ad40: 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20  pLvl->pData);.  
ad50: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76        memset(pLv
ad60: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  l, 0, sizeof(Fts
ad70: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
ad80: 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
ad90: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
ada0: 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  p, .            
adb0: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
adc0: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
add0: 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c  iLvl, pLvl[1].iL
ade0: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  eafPgno).       
adf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ae00: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20  pLvl->pData ){. 
ae10: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
ae20: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
ae30: 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  (pLvl)==0 );.   
ae40: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f         pLvl->bEo
ae50: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  f = 0;.        }
ae60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ae70: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74   }..  return pIt
ae80: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
ae90: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
aea0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
aeb0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
aec0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
aed0: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  ter){.  return f
aee0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
aef0: 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  R(p, pIter, 0);.
af00: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
af10: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 74  doclist-index it
af20: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c  erator object al
af30: 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35 44  located by fts5D
af40: 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e 0a  lidxIterInit()..
af50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
af60: 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
af70: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
af80: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
af90: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ter ){.    int i
afa0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
afb0: 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b  <pIter->nLvl; i+
afc0: 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
afd0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
afe0: 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b  >aLvl[i].pData);
aff0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b000: 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
b010: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
b020: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66 74 73  s5DlidxIter *fts
b030: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a  5DlidxIterInit(.
b040: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e    /* Fts5 Backen
b070: 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
b080: 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  hin */.  int bRe
b090: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
b0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
b0b0: 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53   for ORDER BY AS
b0c0: 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69  C */.  int iSegi
b0d0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
b0e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
b0f0: 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  t id */.  int iL
b100: 65 61 66 50 67 20 20 20 20 20 20 20 20 20 20 20  eafPg           
b110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
b120: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  f page number to
b130: 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f 72 20   load dlidx for 
b140: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  */.){.  Fts5Dlid
b150: 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30  xIter *pIter = 0
b160: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
b170: 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66   bDone = 0;..  f
b180: 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
b190: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e  QLITE_OK && bDon
b1a0: 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e==0; i++){.    
b1b0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
b1c0: 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  of(Fts5DlidxIter
b1d0: 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28 46  ) + i * sizeof(F
b1e0: 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20  ts5DlidxLvl);.  
b1f0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
b200: 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77  *pNew;..    pNew
b210: 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74 65   = (Fts5DlidxIte
b220: 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
b230: 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74 65 29  oc(pIter, nByte)
b240: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
b250: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
b260: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
b270: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b280: 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
b290: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
b2a0: 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65 61 66  iSegid, i, iLeaf
b2b0: 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73 35 44  Pg);.      Fts5D
b2c0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
b2d0: 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  &pNew->aLvl[i];.
b2e0: 20 20 20 20 20 20 70 49 74 65 72 20 3d 20 70 4e        pIter = pN
b2f0: 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  ew;.      memset
b300: 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pLvl, 0, sizeof
b310: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
b320: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61  .      pLvl->pDa
b330: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
b340: 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  d(p, iRowid);.  
b350: 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44      if( pLvl->pD
b360: 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44  ata && (pLvl->pD
b370: 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30  ata->p[0] & 0x00
b380: 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  01)==0 ){.      
b390: 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20    bDone = 1;.   
b3a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72     }.      pIter
b3b0: 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20  ->nLvl = i+1;.  
b3c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
b3d0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
b3e0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53  ){.    pIter->iS
b3f0: 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
b400: 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29     if( bRev==0 )
b410: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
b420: 78 49 74 65 72 46 69 72 73 74 28 70 49 74 65 72  xIterFirst(pIter
b430: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b440: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
b450: 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72 29 3b  rLast(p, pIter);
b460: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
b470: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
b480: 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6c  OK ){.    fts5Dl
b490: 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65  idxIterFree(pIte
b4a0: 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20  r);.    pIter = 
b4b0: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
b4c0: 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69   pIter;.}..stati
b4d0: 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 49  c i64 fts5DlidxI
b4e0: 74 65 72 52 6f 77 69 64 28 46 74 73 35 44 6c 69  terRowid(Fts5Dli
b4f0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
b500: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
b510: 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a  aLvl[0].iRowid;.
b520: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
b530: 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 46  5DlidxIterPgno(F
b540: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
b550: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ter){.  return p
b560: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c  Iter->aLvl[0].iL
b570: 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  eafPgno;.}../*.*
b580: 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20  * Load the next 
b590: 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74  leaf page into t
b5a0: 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  he segment itera
b5b0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
b5c0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
b5d0: 65 78 74 50 61 67 65 28 0a 20 20 46 74 73 35 49  extPage(.  Fts5I
b5e0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
b5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
b600: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
b610: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
b620: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
b630: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
b640: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f  or to advance to
b650: 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b   next page */.){
b660: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
b670: 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  af;.  Fts5Struct
b680: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
b690: 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a   = pIter->pSeg;.
b6a0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
b6b0: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
b6c0: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  .  pIter->iLeafP
b6d0: 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74  gno++;.  if( pIt
b6e0: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b  er->pNextLeaf ){
b6f0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
b700: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  f = pIter->pNext
b710: 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d  Leaf;.    pIter-
b720: 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a  >pNextLeaf = 0;.
b730: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
b740: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53  r->iLeafPgno<=pS
b750: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
b760: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
b770: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
b780: 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53 35  p, .        FTS5
b790: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
b7a0: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74  Seg->iSegid, pIt
b7b0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  er->iLeafPgno). 
b7c0: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
b7d0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
b7e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 61 66  = 0;.  }.  pLeaf
b7f0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
b800: 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b  ..  if( pLeaf ){
b810: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69  .    pIter->iPgi
b820: 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73  dxOff = pLeaf->s
b830: 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28 20 66  zLeaf;.    if( f
b840: 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
b850: 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  s(pLeaf) ){.    
b860: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
b870: 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e  oclist = pLeaf->
b880: 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nn+1;.    }else{
b890: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50  .      pIter->iP
b8a0: 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
b8b0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
b8c0: 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50 67 69  f->p[pIter->iPgi
b8d0: 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20 20 20  dxOff],.        
b8e0: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
b8f0: 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29 3b 0a  oclist.      );.
b900: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b910: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f  ** Argument p po
b920: 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
b930: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76 61   containing a va
b940: 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74 65 72  rint to be inter
b950: 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a 20 70  preted as a.** p
b960: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a  osition list siz
b970: 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68  e field. Read th
b980: 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72 65 74  e varint and ret
b990: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
b9a0: 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e  f bytes.** read.
b9b0: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
b9c0: 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20  g, set *pnSz to 
b9d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
b9e0: 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74  tes in the posit
b9f0: 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64  ion.** list, and
ba00: 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75 65 20   *pbDel to true 
ba10: 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c  if the delete fl
ba20: 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20 66 61  ag is set, or fa
ba30: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
ba40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ba50: 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
ba60: 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e 74  const u8 *p, int
ba70: 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44   *pnSz, int *pbD
ba80: 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a  el){.  int nSz;.
ba90: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 66    int n = 0;.  f
baa0: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
bab0: 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20  32(p, n, nSz);. 
bac0: 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e   assert_nc( nSz>
bad0: 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20  =0 );.  *pnSz = 
bae0: 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20  nSz/2;.  *pbDel 
baf0: 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31 3b 0a  = nSz & 0x0001;.
bb00: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
bb10: 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  *.** Fts5SegIter
bb20: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72  .iLeafOffset cur
bb30: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
bb40: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
bb50: 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  of a.** position
bb60: 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
bb70: 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65  . Read the value
bb80: 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 61 6e   of the field an
bb90: 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e  d store it.** in
bba0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
bbb0: 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ariables:.**.** 
bbc0: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 6e 50    Fts5SegIter.nP
bbd0: 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  os.**   Fts5SegI
bbe0: 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c  ter.bDel.**.** L
bbf0: 65 61 76 65 20 46 74 73 35 53 65 67 49 74 65 72  eave Fts5SegIter
bc00: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69  .iLeafOffset poi
bc10: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
bc20: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
bc30: 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ** position list
bc40: 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e 79   content (if any
bc50: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
bc60: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
bc70: 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65 78 20  dNPos(Fts5Index 
bc80: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
bc90: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
bca0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
bcb0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  ){.    int iOff 
bcc0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
bcd0: 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74  fset;  /* Offset
bce0: 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20   to read at */. 
bcf0: 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46     ASSERT_SZLEAF
bd00: 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  _OK(pIter->pLeaf
bd10: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 43  );.    if( p->pC
bd20: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
bd30: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
bd40: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45   ){.      int iE
bd50: 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e  od = MIN(pIter->
bd60: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c 20 70  iEndofDoclist, p
bd70: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
bd80: 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65  eaf);.      pIte
bd90: 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20 20 20  r->bDel = 0;.   
bda0: 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d     pIter->nPos =
bdb0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   1;.      if( iO
bdc0: 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72  ff<iEod && pIter
bdd0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
bde0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
bdf0: 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31 3b 0a  Iter->bDel = 1;.
be00: 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a          iOff++;.
be10: 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
be20: 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d 3e  <iEod && pIter->
be30: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d  pLeaf->p[iOff]==
be40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
be50: 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a  Iter->nPos = 1;.
be60: 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b            iOff++
be70: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
be80: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
be90: 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20  ->nPos = 0;.    
bea0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
beb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
bec0: 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 66 74  nt nSz;.      ft
bed0: 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
bee0: 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  2(pIter->pLeaf->
bef0: 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a 20  p, iOff, nSz);. 
bf00: 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c       pIter->bDel
bf10: 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31   = (nSz & 0x0001
bf20: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
bf30: 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20  nPos = nSz>>1;. 
bf40: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
bf50: 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29  pIter->nPos>=0 )
bf60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  ;.    }.    pIte
bf70: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
bf80: 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73 74   iOff;.  }.}..st
bf90: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
bfa0: 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 46  gIterLoadRowid(F
bfb0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
bfc0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
bfd0: 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65  {.  u8 *a = pIte
bfe0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20  r->pLeaf->p;    
bff0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
c000: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
c010: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  */.  int iOff = 
c020: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c030: 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a  et;..  ASSERT_SZ
c040: 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70  LEAF_OK(pIter->p
c050: 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69 4f 66  Leaf);.  if( iOf
c060: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
c070: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66  >szLeaf ){.    f
c080: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
c090: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
c0a0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
c0b0: 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  af==0 ){.      i
c0c0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
c0d0: 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  _OK ) p->rc = FT
c0e0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
c0f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c100: 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20      iOff = 4;.  
c110: 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65    a = pIter->pLe
c120: 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66  af->p;.  }.  iOf
c130: 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
c140: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
c150: 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
c160: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70 49 74  ->iRowid);.  pIt
c170: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
c180: 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = iOff;.}../*.**
c190: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
c1a0: 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74  afOffset current
c1b0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
c1c0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
c1d0: 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22  he .** "nSuffix"
c1e0: 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65 72 6d   field of a term
c1f0: 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  . Function param
c200: 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61  eter nKeep conta
c210: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  ins the value.**
c220: 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66 69 78   of the "nPrefix
c230: 22 20 66 69 65 6c 64 20 28 69 66 20 74 68 65 72  " field (if ther
c240: 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74 20 69  e was one - it i
c250: 73 20 70 61 73 73 65 64 20 30 20 69 66 20 74 68  s passed 0 if th
c260: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
c270: 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73  st term in the s
c280: 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54  egment)..**.** T
c290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  his function pop
c2a0: 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ulates:.**.**   
c2b0: 46 74 73 35 53 65 67 49 74 65 72 2e 74 65 72 6d  Fts5SegIter.term
c2c0: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
c2d0: 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63  r.rowid.**.** ac
c2e0: 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65  cordingly and le
c2f0: 61 76 65 73 20 28 46 74 73 35 53 65 67 49 74 65  aves (Fts5SegIte
c300: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29 20 73  r.iLeafOffset) s
c310: 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  et to the conten
c320: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  t of.** the firs
c330: 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e  t position list.
c340: 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   The position li
c350: 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  st belonging to 
c360: 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74  document .** (Ft
c370: 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77 69 64  s5SegIter.iRowid
c380: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
c390: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
c3a0: 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 20  dTerm(Fts5Index 
c3b0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
c3c0: 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65  *pIter, int nKee
c3d0: 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  p){.  u8 *a = pI
c3e0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
c3f0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
c400: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
c410: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
c420: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
c430: 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74  fset;  /* Offset
c440: 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20   to read at */. 
c450: 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e 65 77   /* Bytes of new
c480: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66   data */..  iOff
c490: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
c4a0: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e  t32(&a[iOff], nN
c4b0: 65 77 29 3b 0a 20 20 70 49 74 65 72 2d 3e 74 65  ew);.  pIter->te
c4c0: 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  rm.n = nKeep;.  
c4d0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
c4e0: 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49  Blob(&p->rc, &pI
c4f0: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
c500: 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f   &a[iOff]);.  iO
c510: 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49  ff += nNew;.  pI
c520: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
c530: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70  fset = iOff;.  p
c540: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
c550: 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
c560: 61 66 50 67 6e 6f 3b 0a 20 20 70 49 74 65 72 2d  afPgno;.  pIter-
c570: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
c580: 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70 49 74 65  Off;..  if( pIte
c590: 72 2d 3e 69 50 67 69 64 78 4f 66 66 3e 3d 70 49  r->iPgidxOff>=pI
c5a0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29  ter->pLeaf->nn )
c5b0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  {.    pIter->iEn
c5c0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74  dofDoclist = pIt
c5d0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  er->pLeaf->nn+1;
c5e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
c5f0: 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 70 49  t nExtra;.    pI
c600: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b  ter->iPgidxOff +
c610: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
c620: 32 28 26 61 5b 70 49 74 65 72 2d 3e 69 50 67 69  2(&a[pIter->iPgi
c630: 64 78 4f 66 66 5d 2c 20 6e 45 78 74 72 61 29 3b  dxOff], nExtra);
c640: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
c650: 6f 66 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 45 78  ofDoclist += nEx
c660: 74 72 61 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  tra;.  }..  fts5
c670: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
c680: 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73  (p, pIter);.}..s
c690: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
c6a0: 65 67 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  egIterNext(Fts5I
c6b0: 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74  ndex*, Fts5SegIt
c6c0: 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  er*, int*);.stat
c6d0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
c6e0: 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65 28  terNext_Reverse(
c6f0: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
c700: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
c710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c720: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e  5SegIterNext_Non
c730: 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74  e(Fts5Index*, Ft
c740: 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a  s5SegIter*, int*
c750: 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  );..static void 
c760: 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
c770: 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
c780: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c790: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
c7a0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
c7b0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
c7c0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e  ){.    pIter->xN
c7d0: 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65  ext = fts5SegIte
c7e0: 72 4e 65 78 74 5f 52 65 76 65 72 73 65 3b 0a 20  rNext_Reverse;. 
c7f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 43   }else if( p->pC
c800: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
c810: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
c820: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78   ){.    pIter->x
c830: 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74  Next = fts5SegIt
c840: 65 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a 20 20 7d  erNext_None;.  }
c850: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
c860: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67  >xNext = fts5Seg
c870: 49 74 65 72 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a  IterNext;.  }.}.
c880: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
c890: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
c8a0: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
c8b0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
c8c0: 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  he entries in.**
c8d0: 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54   segment pSeg. T
c8e0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
c8f0: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
c900: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
c910: 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  when .** this fu
c920: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
c930: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
c940: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
c950: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
c960: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
c970: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
c980: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
c990: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
c9a0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c9b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
c9c0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
c9d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c9e0: 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20  5SegIterInit(.  
c9f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca10: 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a  /* FTS index obj
ca20: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
ca30: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
ca40: 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
ca50: 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
ca60: 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
ca70: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
ca80: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
ca90: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
caa0: 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  .){.  if( pSeg->
cab0: 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a  pgnoFirst==0 ){.
cac0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
cad0: 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65  ens if the segme
cae0: 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  nt is being used
caf0: 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20   as an input to 
cb00: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20  an incremental. 
cb10: 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20     ** merge and 
cb20: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72  all data has alr
cb30: 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d  eady been "trimm
cb40: 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f  ed". See functio
cb50: 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69  n.    ** fts5Tri
cb60: 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20  mSegments() for 
cb70: 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  details. In this
cb80: 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20   case leave the 
cb90: 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a  iterator empty..
cba0: 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
cbb0: 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28  r will see the (
cbc0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
cbd0: 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20   and assume the 
cbe0: 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  iterator is.    
cbf0: 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64  ** at EOF alread
cc00: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
cc10: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
cc20: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
cc30: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
cc40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cc50: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72      memset(pIter
cc60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
cc70: 65 72 29 29 3b 0a 20 20 20 20 66 74 73 35 53 65  er));.    fts5Se
cc80: 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
cc90: 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65  pIter);.    pIte
cca0: 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
ccb0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ccc0: 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Pgno = pSeg->pgn
ccd0: 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74  oFirst-1;.    ft
cce0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
ccf0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
cd00: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
cd10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cd20: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
cd30: 65 74 20 3d 20 34 3b 0a 20 20 20 20 61 73 73 65  et = 4;.    asse
cd40: 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 70 4c  rt_nc( pIter->pL
cd50: 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20 20  eaf->nn>4 );.   
cd60: 20 61 73 73 65 72 74 28 20 66 74 73 35 4c 65 61   assert( fts5Lea
cd70: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49  fFirstTermOff(pI
cd80: 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29  ter->pLeaf)==4 )
cd90: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67  ;.    pIter->iPg
cda0: 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  idxOff = pIter->
cdb0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b  pLeaf->szLeaf+1;
cdc0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
cdd0: 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65  LoadTerm(p, pIte
cde0: 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53  r, 0);.    fts5S
cdf0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
ce00: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
ce10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
ce20: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
ce30: 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  r called on iter
ce40: 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79  ators created by
ce50: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73   calls to.** Fts
ce60: 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69  5IndexQuery() wi
ce70: 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58  th the FTS5INDEX
ce80: 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67  _QUERY_DESC flag
ce90: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   set..**.** The 
cea0: 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61  iterator is in a
ceb0: 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20  n unusual state 
cec0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
ced0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68  on is called: th
cee0: 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  e.** Fts5SegIter
cef0: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72  .iLeafOffset var
cf00: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
cf10: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
cf20: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
cf30: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
cf40: 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74  size field for t
cf50: 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
cf60: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
cf70: 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49  age..** Fts5SegI
cf80: 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74  ter.rowid is set
cf90: 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62  , but nPos and b
cfa0: 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a  Del are not..**.
cfb0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cfc0: 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 69 74   advances the it
cfd0: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
cfe0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
cff0: 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e  last .** relevan
d000: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
d010: 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  age and, if nece
d020: 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a  ssary, initializ
d030: 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69  es the .** aRowi
d040: 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52  dOffset[] and iR
d050: 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61  owidOffset varia
d060: 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f  bles. At this po
d070: 69 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  int the iterator
d080: 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65  .** is in its re
d090: 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74  gular state - Ft
d0a0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
d0b0: 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20  ffset points to 
d0c0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74  the first.** byt
d0d0: 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  e of the positio
d0e0: 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61  n list content a
d0f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
d100: 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74  aid rowid..*/.st
d110: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d120: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
d130: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
d140: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
d150: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 65 44  pIter){.  int eD
d160: 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66  etail = p->pConf
d170: 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69  ig->eDetail;.  i
d180: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
d190: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69  eaf->szLeaf;.  i
d1a0: 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c  nt i = pIter->iL
d1b0: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  eafOffset;.  u8 
d1c0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
d1d0: 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77  f->p;.  int iRow
d1e0: 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  idOffset = 0;.. 
d1f0: 20 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45   if( n>pIter->iE
d200: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ndofDoclist ){. 
d210: 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45     n = pIter->iE
d220: 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d  ndofDoclist;.  }
d230: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
d240: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
d250: 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  f);.  while( 1 )
d260: 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  {.    i64 iDelta
d270: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 65   = 0;..    if( e
d280: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
d290: 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
d2a0: 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20    /* todo */.   
d2b0: 20 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b     if( i<n && a[
d2c0: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
d2d0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   i++;.        if
d2e0: 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30  ( i<n && a[i]==0
d2f0: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) i++;.      }.
d300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d310: 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
d320: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
d330: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50     i += fts5GetP
d340: 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d  oslistSize(&a[i]
d350: 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
d360: 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50  );.      i += nP
d370: 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  os;.    }.    if
d380: 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a  ( i>=n ) break;.
d390: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
d3a0: 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75  Varint(&a[i], (u
d3b0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
d3c0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
d3d0: 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
d3e0: 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  /* If necessary,
d3f0: 20 67 72 6f 77 20 74 68 65 20 70 49 74 65 72 2d   grow the pIter-
d400: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20  >aRowidOffset[] 
d410: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66  array. */.    if
d420: 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d  ( iRowidOffset>=
d430: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
d440: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  set ){.      int
d450: 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e   nNew = pIter->n
d460: 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b  RowidOffset + 8;
d470: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  .      int *aNew
d480: 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
d490: 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e  _realloc(pIter->
d4a0: 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e  aRowidOffset, nN
d4b0: 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  ew*sizeof(int));
d4c0: 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d  .      if( aNew=
d4d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
d4e0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
d4f0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  EM;.        brea
d500: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d510: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
d520: 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20  fset = aNew;.   
d530: 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64     pIter->nRowid
d540: 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  Offset = nNew;. 
d550: 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d     }..    pIter-
d560: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52  >aRowidOffset[iR
d570: 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20  owidOffset++] = 
d580: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d590: 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  et;.    pIter->i
d5a0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a  LeafOffset = i;.
d5b0: 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f    }.  pIter->iRo
d5c0: 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  widOffset = iRow
d5d0: 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35  idOffset;.  fts5
d5e0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
d5f0: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
d600: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
d610: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
d620: 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73  verseNewPage(Fts
d630: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
d640: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
d650: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
d660: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
d670: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
d680: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
d690: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
d6a0: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
d6b0: 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  ;..  fts5DataRel
d6c0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
d6d0: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65  f);.  pIter->pLe
d6e0: 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  af = 0;.  while(
d6f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d700: 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61  K && pIter->iLea
d710: 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65  fPgno>pIter->iTe
d720: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
d730: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
d740: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
d750: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e  afPgno--;.    pN
d760: 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
d770: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
d780: 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20  T_ROWID(.       
d790: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e     pIter->pSeg->
d7a0: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
d7b0: 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b  LeafPgno.    ));
d7c0: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
d7d0: 0a 20 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c  .      /* iTermL
d7e0: 65 61 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65  eafOffset may be
d7f0: 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66   equal to szLeaf
d800: 20 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   if the term is 
d810: 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
d820: 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70  * thing on the p
d830: 61 67 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66  age - i.e. the f
d840: 69 72 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e  irst rowid is on
d850: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
d860: 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  age..      ** In
d870: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
d880: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
d890: 2c 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  , this iterator 
d8a0: 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20  is at EOF. */.  
d8b0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
d8c0: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
d8d0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
d8e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d8f0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
d900: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
d910: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
d920: 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a  fOffset<pNew->sz
d930: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
d940: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
d950: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
d960: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d970: 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65  set = pIter->iTe
d980: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  rmLeafOffset;.  
d990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d9a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
d9b0: 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
d9c0: 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
d9d0: 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
d9e0: 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20  idOff(pNew);.   
d9f0: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
da00: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
da10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
da20: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
da30: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
da40: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  t = iRowidOff;. 
da50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
da60: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
da70: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
da80: 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74      u8 *a = &pIt
da90: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74  er->pLeaf->p[pIt
daa0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  er->iLeafOffset]
dab0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
dac0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20  >iLeafOffset += 
dad0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c  fts5GetVarint(a,
dae0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
daf0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
db00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
db10: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
db20: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
db30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
db40: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
db50: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
db60: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
db70: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
db80: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66  eaf->nn+1;.    f
db90: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
dba0: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
dbb0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
dbc0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
dbd0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
dbe0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
dbf0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
dc00: 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20  ently.** points 
dc10: 74 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b  to a delete mark
dc20: 65 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72  er. A delete mar
dc30: 6b 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20  ker is an entry 
dc40: 77 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a  with a 0 byte.**
dc50: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a   position-list..
dc60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
dc70: 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
dc80: 74 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ty(Fts5Index *p,
dc90: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
dca0: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65  pIter){.  Fts5Se
dcb0: 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
dcc0: 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
dcd0: 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
dce0: 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  st];.  return (p
dcf0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
dd00: 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26  && pSeg->pLeaf &
dd10: 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29  & pSeg->nPos==0)
dd20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
dd30: 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  ce iterator pIte
dd40: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
dd50: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
dd60: 76 65 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53  version of fts5S
dd70: 65 67 49 74 65 72 4e 65 78 74 28 29 20 69 73 20  egIterNext() is 
dd80: 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 72 65 76  only used by rev
dd90: 65 72 73 65 20 69 74 65 72 61 74 6f 72 73 2e 0a  erse iterators..
dda0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
ddb0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52  ts5SegIterNext_R
ddc0: 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e  everse(.  Fts5In
ddd0: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
dde0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
ddf0: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
de00: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
de10: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
de20: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
de30: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
de40: 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d    int *pbNewTerm
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f    /* OUT: Set fo
de70: 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b  r new term */.){
de80: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
de90: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
dea0: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29  EGITER_REVERSE )
deb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
dec0: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  r->pNextLeaf==0 
ded0: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  );.  if( pIter->
dee0: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
def0: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49  {.    u8 *a = pI
df00: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
df10: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
df20: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
df30: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
df40: 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49 74  ffset--;.    pIt
df50: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
df60: 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  = pIter->aRowidO
df70: 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f  ffset[pIter->iRo
df80: 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  widOffset];.    
df90: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
dfa0: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
dfb0: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
dfc0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
dfd0: 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
dfe0: 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f  ->eDetail!=FTS5_
dff0: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
e000: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 49 74       iOff += pIt
e010: 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a  er->nPos;.    }.
e020: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
e030: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
e040: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
e050: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d  pIter->iRowid -=
e060: 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65   iDelta;.  }else
e070: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
e080: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
e090: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
e0a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
e0b0: 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74  iterator pIter t
e0c0: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
e0d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ..**.** This ver
e0e0: 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49  sion of fts5SegI
e0f0: 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c  terNext() is onl
e100: 79 20 75 73 65 64 20 69 66 20 64 65 74 61 69 6c  y used if detail
e110: 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a 2a  =none and the.**
e120: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74   iterator is not
e130: 20 61 20 72 65 76 65 72 73 65 20 64 69 72 65 63   a reverse direc
e140: 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a 2a  tion iterator..*
e150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
e160: 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f  s5SegIterNext_No
e170: 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ne(.  Fts5Index 
e180: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
e190: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
e1a0: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
e1b0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
e1c0: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
e1d0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
e1e0: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
e1f0: 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e210: 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65   OUT: Set for ne
e220: 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69  w term */.){.  i
e230: 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  nt iOff;..  asse
e240: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
e250: 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
e260: 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  ( (pIter->flags 
e270: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
e280: 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20 20  EVERSE)==0 );.  
e290: 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
e2a0: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
e2b0: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
e2c0: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
e2d0: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
e2e0: 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49 74  f);.  iOff = pIt
e2f0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
e300: 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ..  /* Next entr
e310: 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65 78 74  y is on the next
e320: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
e330: 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20 69 4f  Iter->pSeg && iO
e340: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
e350: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
e360: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
e370: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
e380: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c 20     if( p->rc || 
e390: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
e3a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 49  ) return;.    pI
e3b0: 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b  ter->iRowid = 0;
e3c0: 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20  .    iOff = 4;. 
e3d0: 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70   }..  if( iOff<p
e3e0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
e3f0: 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ist ){.    /* Ne
e400: 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74  xt entry is on t
e410: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
e420: 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  */.    i64 iDelt
e430: 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73  a;.    iOff += s
e440: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
e450: 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  int(&pIter->pLea
e460: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
e470: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
e480: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e490: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 70  et = iOff;.    p
e4a0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
e4b0: 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 20  iDelta;.  }else 
e4c0: 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  if( (pIter->flag
e4d0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
e4e0: 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29 7b 0a  _ONETERM)==0 ){.
e4f0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
e500: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Seg ){.      int
e510: 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
e520: 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35    if( iOff!=fts5
e530: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
e540: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 20 29  (pIter->pLeaf) )
e550: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
e560: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
e570: 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
e580: 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  >p[iOff], nKeep)
e590: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e5a0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e5b0: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
e5c0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
e5d0: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e  Term(p, pIter, n
e5e0: 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Keep);.    }else
e5f0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  {.      const u8
e600: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
e610: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e620: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
e630: 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  int nList;.     
e640: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
e650: 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73  ScanNext(p->pHas
e660: 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
e670: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
e680: 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54  ry(p->pHash, &zT
e690: 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
e6a0: 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ist);.      if( 
e6b0: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
e6c0: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
e6d0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e6e0: 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73  f->p = (u8*)pLis
e6f0: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
e700: 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73  pLeaf->nn = nLis
e710: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
e720: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20  pLeaf->szLeaf = 
e730: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74  nList;.      pIt
e740: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
e750: 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  t = nList;.     
e760: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
e770: 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26 70 49  erSet(&p->rc,&pI
e780: 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29  ter->term, (int)
e790: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28  strlen(zTerm), (
e7a0: 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
e7b0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e7c0: 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
e7d0: 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34  rint(pList, (u64
e7e0: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
e7f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
e800: 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70  ( pbNewTerm ) *p
e810: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
e820: 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74 6f 20  }else{.    goto 
e830: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
e840: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
e850: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
e860: 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b 0a  er);..  return;.
e870: 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a   next_none_eof:.
e880: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
e890: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
e8a0: 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
e8b0: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
e8c0: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
e8d0: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
e8e0: 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
e8f0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
e900: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
e910: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
e920: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
e930: 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20  code. It .** is 
e940: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
e950: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
e960: 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
e970: 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  EOF. If an error
e980: 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
e990: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
e9a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e9b0: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
e9c0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
e9d0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
e9e0: 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64  rNext(.  Fts5Ind
e9f0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
ea00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
ea10: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
ea20: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
ea30: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
ea40: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
ea50: 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
ea60: 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20   int *pbNewTerm 
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72   /* OUT: Set for
ea90: 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a   new term */.){.
eaa0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
eab0: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
eac0: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20  ;.  int iOff;.  
ead0: 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
eae0: 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20  ;.  int nKeep = 
eaf0: 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e  0;.  u8 *a;.  in
eb00: 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t n;..  assert( 
eb10: 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20  pbNewTerm==0 || 
eb20: 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b  *pbNewTerm==0 );
eb30: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
eb40: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d  onfig->eDetail!=
eb50: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
eb60: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68   );..  /* Search
eb70: 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
eb80: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
eb90: 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  t within the cur
eba0: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
ebb0: 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  a = pLeaf->p;.  
ebc0: 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  n = pLeaf->szLea
ebd0: 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c  f;..  ASSERT_SZL
ebe0: 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
ebf0: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
ec00: 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49 74  LeafOffset + pIt
ec10: 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66 28  er->nPos;..  if(
ec20: 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 2f   iOff<n ){.    /
ec30: 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79  * The next entry
ec40: 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65   is on the curre
ec50: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
ec60: 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c  assert_nc( iOff<
ec70: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
ec80: 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69 66 28  clist );.    if(
ec90: 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69 45   iOff>=pIter->iE
eca0: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ndofDoclist ){. 
ecb0: 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20       bNewTerm = 
ecc0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  1;.      if( iOf
ecd0: 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74  f!=fts5LeafFirst
ece0: 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29  TermOff(pLeaf) )
ecf0: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
ed00: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
ed10: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
ed20: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
ed30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 36 34  }else{.      u64
ed40: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
ed50: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
ed60: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
ed70: 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a  Off], &iDelta);.
ed80: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
ed90: 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  wid += iDelta;. 
eda0: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
edb0: 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20  iDelta>0 );.    
edc0: 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  }.    pIter->iLe
edd0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
ede0: 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ..  }else if( pI
edf0: 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a  ter->pSeg==0 ){.
ee00: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c      const u8 *pL
ee10: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ist = 0;.    con
ee20: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
ee30: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73   0;.    int nLis
ee40: 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  t = 0;.    asser
ee50: 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  t( (pIter->flags
ee60: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
ee70: 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e 65  ONETERM) || pbNe
ee80: 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28  wTerm );.    if(
ee90: 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67   0==(pIter->flag
eea0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
eeb0: 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20  _ONETERM) ){.   
eec0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
eed0: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48  shScanNext(p->pH
eee0: 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ash);.      sqli
eef0: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
ef00: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
ef10: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
ef20: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nList);.    }.  
ef30: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
ef40: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
ef50: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
ef60: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74  Leaf);.      pIt
ef70: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
ef80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef90: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20  pIter->pLeaf->p 
efa0: 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20  = (u8*)pList;.  
efb0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
efc0: 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  ->nn = nList;.  
efd0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
efe0: 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74  ->szLeaf = nList
eff0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
f000: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e  EndofDoclist = n
f010: 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20 73 71  List+1;.      sq
f020: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
f030: 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
f040: 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74  r->term, (int)st
f050: 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20  rlen(zTerm),.   
f060: 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72         (u8*)zTer
f070: 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  m);.      pIter-
f080: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
f090: 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69  ts5GetVarint(pLi
f0a0: 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  st, (u64*)&pIter
f0b0: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
f0c0: 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b   *pbNewTerm = 1;
f0d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
f0e0: 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20      iOff = 0;.  
f0f0: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
f100: 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
f110: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
f120: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30    while( iOff==0
f130: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
f140: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
f150: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70   pIter);.      p
f160: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
f170: 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eaf;.      if( p
f180: 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
f190: 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a  .      ASSERT_SZ
f1a0: 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a  LEAF_OK(pLeaf);.
f1b0: 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20        if( (iOff 
f1c0: 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
f1d0: 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20  owidOff(pLeaf)) 
f1e0: 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73  && iOff<pLeaf->s
f1f0: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
f200: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
f210: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
f220: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Leaf->p[iOff], (
f230: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
f240: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49  wid);.        pI
f250: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
f260: 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20   = iOff;..      
f270: 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e    if( pLeaf->nn>
f280: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
f290: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
f2a0: 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c  ->iPgidxOff = pL
f2b0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74  eaf->szLeaf + ft
f2c0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20  s5GetVarint32(. 
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c               &pL
f2e0: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
f2f0: 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45  Leaf], pIter->iE
f300: 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20  ndofDoclist.    
f310: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
f320: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7d 0a       }..      }.
f330: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70        else if( p
f340: 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e  Leaf->nn>pLeaf->
f350: 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
f360: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
f370: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
f380: 61 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69  af + fts5GetVari
f390: 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20  nt32(.          
f3a0: 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61    &pLeaf->p[pLea
f3b0: 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66 66  f->szLeaf], iOff
f3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
f3d0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
f3e0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f3f0: 66 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  f;.        pIter
f400: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
f410: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
f420: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
f430: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
f440: 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61  rt_nc( iOff<pLea
f450: 66 2d 3e 73 7a 4c 65 61 66 20 29 3b 0a 20 20 20  f->szLeaf );.   
f460: 20 20 20 69 66 28 20 69 4f 66 66 3e 70 4c 65 61     if( iOff>pLea
f470: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
f480: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
f490: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
f4a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
f4b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
f4c0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
f4d0: 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20  iterator is now 
f4e0: 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72  at EOF. If so, r
f4f0: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a  eturn early. */.
f500: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
f510: 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4e  af ){.    if( bN
f520: 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  ewTerm ){.      
f530: 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  if( pIter->flags
f540: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
f550: 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20  ONETERM ){.     
f560: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
f570: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
f580: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
f590: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
f5a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f5b0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
f5c0: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e  Term(p, pIter, n
f5d0: 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 66  Keep);.        f
f5e0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
f5f0: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
f600: 20 20 20 20 20 20 69 66 28 20 70 62 4e 65 77 54        if( pbNewT
f610: 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d  erm ) *pbNewTerm
f620: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
f630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
f640: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
f650: 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20 62 79  could be done by
f660: 20 63 61 6c 6c 69 6e 67 20 66 74 73 35 53 65 67   calling fts5Seg
f670: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 2e 20  IterLoadNPos(). 
f680: 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  But.      ** thi
f690: 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72 74 69  s block is parti
f6a0: 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d 61  cularly performa
f6b0: 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20 73 6f  nce critical, so
f6c0: 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
f6d0: 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e 6c    ** code is inl
f6e0: 69 6e 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  ined. .      **.
f6f0: 20 20 20 20 20 20 2a 2a 20 4c 61 74 65 72 3a 20        ** Later: 
f700: 53 77 69 74 63 68 65 64 20 62 61 63 6b 20 74 6f  Switched back to
f710: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
f720: 4e 50 6f 73 28 29 20 62 65 63 61 75 73 65 20 69  NPos() because i
f730: 74 20 73 75 70 70 6f 72 74 73 0a 20 20 20 20 20  t supports.     
f740: 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20   ** detail=none 
f750: 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65 61 6c 2e  mode. Not ideal.
f760: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f770: 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 61  int nSz;.      a
f780: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
f790: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
f7a0: 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
f7b0: 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61  nt32(pIter->pLea
f7c0: 66 2d 3e 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65  f->p, pIter->iLe
f7d0: 61 66 4f 66 66 73 65 74 2c 20 6e 53 7a 29 3b 0a  afOffset, nSz);.
f7e0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65        pIter->bDe
f7f0: 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30  l = (nSz & 0x000
f800: 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  1);.      pIter-
f810: 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a  >nPos = nSz>>1;.
f820: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
f830: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20   pIter->nPos>=0 
f840: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
f850: 23 64 65 66 69 6e 65 20 53 57 41 50 56 41 4c 28  #define SWAPVAL(
f860: 54 2c 20 61 2c 20 62 29 20 7b 20 54 20 74 6d 70  T, a, b) { T tmp
f870: 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d  ; tmp=a; a=b; b=
f880: 74 6d 70 3b 20 7d 0a 0a 23 64 65 66 69 6e 65 20  tmp; }..#define 
f890: 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72  fts5IndexSkipVar
f8a0: 69 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b 20 20  int(a, iOff) {  
f8b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 6e            \.  in
f8c0: 74 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b  t iEnd = iOff+9;
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
f8f0: 20 20 77 68 69 6c 65 28 20 28 61 5b 69 4f 66 66    while( (a[iOff
f900: 2b 2b 5d 20 26 20 30 78 38 30 29 20 26 26 20 69  ++] & 0x80) && i
f910: 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20 20 20 20  Off<iEnd );     
f920: 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    \.}../*.** Ite
f930: 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72  rator pIter curr
f940: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
f950: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
f960: 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68  in a doclist. Th
f970: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  is.** function s
f980: 65 74 73 20 74 68 65 20 69 74 65 72 61 74 6f 72  ets the iterator
f990: 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 65 72   up so that iter
f9a0: 61 74 65 73 20 69 6e 20 72 65 76 65 72 73 65 20  ates in reverse 
f9b0: 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a  order through.**
f9c0: 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f   the doclist..*/
f9d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
f9e0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
f9f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
fa00: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
fa10: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
fa20: 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74  er *pDlidx = pIt
fa30: 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74  er->pDlidx;.  Ft
fa40: 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20  s5Data *pLast = 
fa50: 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73  0;.  int pgnoLas
fa60: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44  t = 0;..  if( pD
fa70: 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  lidx ){.    int 
fa80: 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e  iSegid = pIter->
fa90: 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
faa0: 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73    pgnoLast = fts
fab0: 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
fac0: 44 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73  Dlidx);.    pLas
fad0: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
fae0: 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
faf0: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 70  _ROWID(iSegid, p
fb00: 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c  gnoLast));.  }el
fb10: 73 65 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61  se{.    Fts5Data
fb20: 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d   *pLeaf = pIter-
fb30: 3e 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  >pLeaf;         
fb40: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
fb50: 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  data */..    /* 
fb60: 43 75 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53  Currently, Fts5S
fb70: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
fb80: 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  et points to the
fb90: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 20   first byte of. 
fba0: 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c     ** position-l
fbb0: 69 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  ist content for 
fbc0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69  the current rowi
fbd0: 64 2e 20 42 61 63 6b 20 69 74 20 75 70 20 73 6f  d. Back it up so
fbe0: 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a 2a 20   that it.    ** 
fbf0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74  points to the st
fc00: 61 72 74 20 6f 66 20 74 68 65 20 70 6f 73 69 74  art of the posit
fc10: 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
fc20: 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eld. */.    int 
fc30: 69 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 69 66  iPoslist;.    if
fc40: 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ( pIter->iTermLe
fc50: 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
fc60: 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
fc70: 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 70 49 74    iPoslist = pIt
fc80: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
fc90: 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  set;.    }else{.
fca0: 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d        iPoslist =
fcb0: 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74   4;.    }.    ft
fcc0: 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e  s5IndexSkipVarin
fcd0: 74 28 70 4c 65 61 66 2d 3e 70 2c 20 69 50 6f 73  t(pLeaf->p, iPos
fce0: 6c 69 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72  list);.    asser
fcf0: 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  t( p->pConfig->e
fd00: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
fd10: 41 49 4c 5f 4e 4f 4e 45 20 7c 7c 20 69 50 6f 73  AIL_NONE || iPos
fd20: 6c 69 73 74 3d 3d 28 0a 20 20 20 20 20 20 20 20  list==(.        
fd30: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
fd40: 65 74 20 2d 20 73 71 6c 69 74 65 33 46 74 73 35  et - sqlite3Fts5
fd50: 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 70 49 74  GetVarintLen(pIt
fd60: 65 72 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74 65 72  er->nPos*2+pIter
fd70: 2d 3e 62 44 65 6c 29 0a 20 20 20 20 29 29 3b 0a  ->bDel).    ));.
fd80: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
fd90: 4f 66 66 73 65 74 20 3d 20 69 50 6f 73 6c 69 73  Offset = iPoslis
fda0: 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  t;..    /* If th
fdb0: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
fdc0: 74 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c 61  true then the la
fdd0: 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20  rgest rowid for 
fde0: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
fdf0: 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20  ** term may not 
fe00: 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  be stored on the
fe10: 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53   current page. S
fe20: 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61 72 64  o search forward
fe30: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20 77   to.    ** see w
fe40: 68 65 72 65 20 73 61 69 64 20 72 6f 77 69 64 20  here said rowid 
fe50: 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20  really is.  */. 
fe60: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 45     if( pIter->iE
fe70: 6e 64 6f 66 44 6f 63 6c 69 73 74 3e 3d 70 4c 65  ndofDoclist>=pLe
fe80: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
fe90: 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20      int pgno;.  
fea0: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
feb0: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
fec0: 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20   pIter->pSeg;.. 
fed0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74       /* The last
fee0: 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f   rowid in the do
fef0: 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65  clist may not be
ff00: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
ff10: 70 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20  page. Search.   
ff20: 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f     ** forward to
ff30: 20 66 69 6e 64 20 74 68 65 20 70 61 67 65 20 63   find the page c
ff40: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61  ontaining the la
ff50: 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20  st rowid.  */.  
ff60: 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74      for(pgno=pIt
ff70: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b  er->iLeafPgno+1;
ff80: 20 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c   !p->rc && pgno<
ff90: 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b  =pSeg->pgnoLast;
ffa0: 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20   pgno++){.      
ffb0: 20 20 69 36 34 20 69 41 62 73 20 3d 20 46 54 53    i64 iAbs = FTS
ffc0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
ffd0: 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67  pSeg->iSegid, pg
ffe0: 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74 73  no);.        Fts
fff0: 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74  5Data *pNew = ft
10000 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 41  s5DataRead(p, iA
10010 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  bs);.        if(
10020 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
10030 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 62     int iRowid, b
10040 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20 20 20 20  Termless;.      
10050 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73      iRowid = fts
10060 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
10070 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ff(pNew);.      
10080 20 20 20 20 62 54 65 72 6d 6c 65 73 73 20 3d 20      bTermless = 
10090 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
100a0 73 73 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ss(pNew);.      
100b0 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 20 29      if( iRowid )
100c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 57  {.            SW
100d0 41 50 56 41 4c 28 46 74 73 35 44 61 74 61 2a 2c  APVAL(Fts5Data*,
100e0 20 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20   pNew, pLast);. 
100f0 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c             pgnoL
10100 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ast = pgno;.    
10110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10120 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
10130 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
10140 20 20 20 69 66 28 20 62 54 65 72 6d 6c 65 73 73     if( bTermless
10150 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
10160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10170 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
10180 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20  f pLast is NULL 
10190 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
101a0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77  hen the last row
101b0 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c  id for this docl
101c0 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e  ist.  ** lies on
101d0 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e   the page curren
101e0 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79  tly indicated by
101f0 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49   the iterator. I
10200 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a  n this case .  *
10210 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  * pIter->iLeafOf
10220 66 73 65 74 20 69 73 20 61 6c 72 65 61 64 79 20  fset is already 
10230 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
10240 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
10250 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c  t size.  ** fiel
10260 64 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  d associated wit
10270 68 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65  h the first rele
10280 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
10290 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e page..  **.  *
102a0 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73 74 20 69  * Or, if pLast i
102b0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
102c0 20 69 74 20 69 73 20 74 68 65 20 70 61 67 65 20   it is the page 
102d0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
102e0 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69  e last.  ** rowi
102f0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
10300 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 74  configure the it
10310 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
10320 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  t points to the.
10330 20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64    ** first rowid
10340 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 0a 20   on this page.. 
10350 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 20   */.  if( pLast 
10360 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  ){.    int iOff;
10370 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
10380 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
10390 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
103a0 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20  Leaf = pLast;.  
103b0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
103c0 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20  no = pgnoLast;. 
103d0 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65     iOff = fts5Le
103e0 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
103f0 70 4c 61 73 74 29 3b 0a 20 20 20 20 69 4f 66 66  pLast);.    iOff
10400 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
10410 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66  t(&pLast->p[iOff
10420 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
10430 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49  >iRowid);.    pI
10440 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
10450 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 69 66   = iOff;..    if
10460 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d  ( fts5LeafIsTerm
10470 6c 65 73 73 28 70 4c 61 73 74 29 20 29 7b 0a 20  less(pLast) ){. 
10480 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
10490 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 61 73  ofDoclist = pLas
104a0 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c  t->nn+1;.    }el
104b0 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  se{.      pIter-
104c0 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
104d0 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
104e0 72 6d 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20  rmOff(pLast);.  
104f0 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74 73 35    }..  }..  fts5
10500 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
10510 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
10520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  ;.}../*.** Itera
10530 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
10540 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
10550 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 66  e first rowid of
10560 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54   a doclist..** T
10570 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
10580 74 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  t-index associat
10590 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6e 61  ed with the fina
105a0 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 63 75  l term on the cu
105b0 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20  rrent .** page. 
105c0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  If the current t
105d0 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20  erm is the last 
105e0 74 65 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65  term on the page
105f0 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64  , load the .** d
10600 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f  oclist-index fro
10610 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69  m disk and initi
10620 61 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f  alize an iterato
10630 72 20 61 74 20 28 70 49 74 65 72 2d 3e 70 44 6c  r at (pIter->pDl
10640 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  idx)..*/.static 
10650 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
10660 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e  LoadDlidx(Fts5In
10670 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
10680 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
10690 6e 74 20 69 53 65 67 20 3d 20 70 49 74 65 72 2d  nt iSeg = pIter-
106a0 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
106b0 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74   int bRev = (pIt
106c0 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
106d0 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
106e0 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  );.  Fts5Data *p
106f0 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
10700 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  eaf; /* Current 
10710 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20  leaf data */..  
10720 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
10730 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
10740 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20  TER_ONETERM );. 
10750 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
10760 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20  pDlidx==0 );..  
10770 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
10780 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20  current doclist 
10790 65 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67  ends on this pag
107a0 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72  e. If it does, r
107b0 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79  eturn.  ** early
107c0 20 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67   without loading
107d0 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
107e0 65 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e 67  ex (as it belong
107f0 73 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  s to a different
10800 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20  .  ** term. */. 
10810 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72   if( pIter->iTer
10820 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72  mLeafPgno==pIter
10830 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20  ->iLeafPgno .   
10840 26 26 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  && pIter->iEndof
10850 44 6f 63 6c 69 73 74 3c 70 4c 65 61 66 2d 3e 73  Doclist<pLeaf->s
10860 7a 4c 65 61 66 20 0a 20 20 29 7b 0a 20 20 20 20  zLeaf .  ){.    
10870 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70  return;.  }..  p
10880 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66  Iter->pDlidx = f
10890 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
108a0 28 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c 20  (p, bRev, iSeg, 
108b0 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
108c0 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Pgno);.}../*.** 
108d0 54 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  The iterator obj
108e0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
108f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10900 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  t currently cont
10910 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64  ains.** no valid
10920 20 76 61 6c 75 65 73 20 65 78 63 65 70 74 20 66   values except f
10930 6f 72 20 74 68 65 20 46 74 73 35 53 65 67 49 74  or the Fts5SegIt
10940 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62 65 72 20  er.pLeaf member 
10950 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 0a 2a  variable. This.*
10960 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  * function searc
10970 68 65 73 20 74 68 65 20 6c 65 61 66 20 70 61 67  hes the leaf pag
10980 65 20 66 6f 72 20 61 20 74 65 72 6d 20 6d 61 74  e for a term mat
10990 63 68 69 6e 67 20 28 70 54 65 72 6d 2f 6e 54 65  ching (pTerm/nTe
109a0 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rm)..**.** If th
109b0 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
109c0 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   is found on the
109d0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
109e0 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
109f0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
10a00 69 74 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20  it. If argument 
10a10 62 47 65 20 69 73 20 7a 65 72 6f 20 61 6e 64 20  bGe is zero and 
10a20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
10a30 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65 20 69 74  found,.** the it
10a40 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
10a50 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f 46 2e 0a  ointing at EOF..
10a60 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20 69 73 20  **.** If bGe is 
10a70 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
10a80 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
10a90 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
10aa0 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74  en the.** iterat
10ab0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
10ac0 69 6e 67 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c  ing to the small
10ad0 65 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20  est term in the 
10ae0 73 65 67 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  segment that.** 
10af0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
10b00 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
10b10 6d 2c 20 65 76 65 6e 20 69 66 20 74 68 69 73 20  m, even if this 
10b20 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f 6e 20 74  term is not on t
10b30 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 61  he.** current pa
10b40 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
10b50 69 64 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28  id fts5LeafSeek(
10b60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20     /* Leave any 
10b90 65 72 72 6f 72 20 63 6f 64 65 20 68 65 72 65 20  error code here 
10ba0 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c 20 20 20  */.  int bGe,   
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
10bd0 20 61 20 3e 3d 20 73 65 61 72 63 68 20 2a 2f 0a   a >= search */.
10be0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
10bf0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
10c00 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
10c10 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74   seek */.  const
10c20 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
10c30 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 54 65  nTerm      /* Te
10c40 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  rm to search for
10c50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66   */.){.  int iOf
10c60 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  f;.  const u8 *a
10c70 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
10c80 3e 70 3b 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66  >p;.  int szLeaf
10c90 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
10ca0 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e  >szLeaf;.  int n
10cb0 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
10cc0 3e 6e 6e 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61 74  >nn;..  int nMat
10cd0 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b  ch = 0;.  int nK
10ce0 65 65 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  eep = 0;.  int n
10cf0 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  New = 0;.  int i
10d00 54 65 72 6d 4f 66 66 3b 0a 20 20 69 6e 74 20 69  TermOff;.  int i
10d10 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  Pgidx;          
10d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
10d30 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 20  rrent offset in 
10d40 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  pgidx */.  int b
10d50 45 6e 64 4f 66 50 61 67 65 20 3d 20 30 3b 0a 0a  EndOfPage = 0;..
10d60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
10d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
10d80 20 69 50 67 69 64 78 20 3d 20 73 7a 4c 65 61 66   iPgidx = szLeaf
10d90 3b 0a 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74  ;.  iPgidx += ft
10da0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
10db0 5b 69 50 67 69 64 78 5d 2c 20 69 54 65 72 6d 4f  [iPgidx], iTermO
10dc0 66 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 69 54  ff);.  iOff = iT
10dd0 65 72 6d 4f 66 66 3b 0a 0a 20 20 77 68 69 6c 65  ermOff;..  while
10de0 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46  ( 1 ){..    /* F
10df0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
10e00 6e 79 20 6e 65 77 20 62 79 74 65 73 20 61 72 65  ny new bytes are
10e10 20 69 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f   in this term */
10e20 0a 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74  .    fts5FastGet
10e30 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66  Varint32(a, iOff
10e40 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28  , nNew);.    if(
10e50 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b   nKeep<nMatch ){
10e60 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72  .      goto sear
10e70 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  ch_failed;.    }
10e80 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b  ..    assert( nK
10e90 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20  eep>=nMatch );. 
10ea0 20 20 20 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d     if( nKeep==nM
10eb0 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 69 6e  atch ){.      in
10ec0 74 20 6e 43 6d 70 3b 0a 20 20 20 20 20 20 69 6e  t nCmp;.      in
10ed0 74 20 69 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20  t i;.      nCmp 
10ee0 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72  = MIN(nNew, nTer
10ef0 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20 20 20 20  m-nMatch);.     
10f00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70   for(i=0; i<nCmp
10f10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
10f20 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70  if( a[iOff+i]!=p
10f30 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29  Term[nMatch+i] )
10f40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10f50 20 20 20 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20        nMatch += 
10f60 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 54  i;..      if( nT
10f70 65 72 6d 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20  erm==nMatch ){. 
10f80 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e         if( i==nN
10f90 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
10fa0 67 6f 74 6f 20 73 65 61 72 63 68 5f 73 75 63 63  goto search_succ
10fb0 65 73 73 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ess;.        }el
10fc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
10fd0 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  to search_failed
10fe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10ff0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e    }else if( i<nN
11000 65 77 20 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e  ew && a[iOff+i]>
11010 70 54 65 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b  pTerm[nMatch] ){
11020 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
11030 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20  arch_failed;.   
11040 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11050 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b  if( iPgidx>=n ){
11060 0a 20 20 20 20 20 20 62 45 6e 64 4f 66 50 61 67  .      bEndOfPag
11070 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  e = 1;.      bre
11080 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ak;.    }..    i
11090 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74  Pgidx += fts5Get
110a0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
110b0 64 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  dx], nKeep);.   
110c0 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65   iTermOff += nKe
110d0 65 70 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69  ep;.    iOff = i
110e0 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 2f 2a  TermOff;..    /*
110f0 20 52 65 61 64 20 74 68 65 20 6e 4b 65 65 70 20   Read the nKeep 
11100 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65 78  field of the nex
11110 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66  t term. */.    f
11120 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
11130 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4b 65 65  32(a, iOff, nKee
11140 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68  p);.  }.. search
11150 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 62  _failed:.  if( b
11160 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  Ge==0 ){.    fts
11170 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
11180 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
11190 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
111a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
111b0 7d 65 6c 73 65 20 69 66 28 20 62 45 6e 64 4f 66  }else if( bEndOf
111c0 50 61 67 65 20 29 7b 0a 20 20 20 20 64 6f 20 7b  Page ){.    do {
111d0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
111e0 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
111f0 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
11200 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
11210 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
11220 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
11230 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ->p;.      if( f
11240 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
11250 73 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d  s(pIter->pLeaf)=
11260 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 50  =0 ){.        iP
11270 67 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 4c  gidx = pIter->pL
11280 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20  eaf->szLeaf;.   
11290 20 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66       iPgidx += f
112a0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
112b0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
112c0 69 50 67 69 64 78 5d 2c 20 69 4f 66 66 29 3b 0a  iPgidx], iOff);.
112d0 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
112e0 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70 49 74 65  <4 || iOff>=pIte
112f0 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
11300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
11310 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
11320 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
11330 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4b 65  e{.          nKe
11340 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ep = 0;.        
11350 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66    iTermOff = iOf
11360 66 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  f;.          n =
11370 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
11380 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  n;.          iOf
11390 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
113a0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
113b0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
113c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
113d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
113e0 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20  ile( 1 );.  }.. 
113f0 73 65 61 72 63 68 5f 73 75 63 63 65 73 73 3a 0a  search_success:.
11400 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  .  pIter->iLeafO
11410 66 66 73 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e  ffset = iOff + n
11420 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54  New;.  pIter->iT
11430 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ermLeafOffset = 
11440 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
11450 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65  et;.  pIter->iTe
11460 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74  rmLeafPgno = pIt
11470 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a  er->iLeafPgno;..
11480 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
11490 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
114a0 74 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65  term, nKeep, pTe
114b0 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  rm);.  fts5Buffe
114c0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
114d0 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
114e0 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d  , nNew, &a[iOff]
114f0 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 69 64 78  );..  if( iPgidx
11500 3e 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >=n ){.    pIter
11510 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
11520 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
11530 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
11540 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
11550 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73     iPgidx += fts
11560 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
11570 69 50 67 69 64 78 5d 2c 20 6e 45 78 74 72 61 29  iPgidx], nExtra)
11580 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  ;.    pIter->iEn
11590 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 54 65  dofDoclist = iTe
115a0 72 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a  rmOff + nExtra;.
115b0 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 50 67    }.  pIter->iPg
115c0 69 64 78 4f 66 66 20 3d 20 69 50 67 69 64 78 3b  idxOff = iPgidx;
115d0 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c  ..  fts5SegIterL
115e0 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65  oadRowid(p, pIte
115f0 72 29 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65  r);.  fts5SegIte
11600 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
11610 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  er);.}../*.** In
11620 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a  itialize the obj
11630 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ect pIter to poi
11640 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d  nt to term pTerm
11650 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65  /nTerm within se
11660 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49  gment.** pSeg. I
11670 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
11680 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69  ch term in the i
11690 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72 61 74  ndex, the iterat
116a0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
116b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
116c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
116d0 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
116e0 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
116f0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
11700 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
11710 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
11720 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
11730 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11740 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
11750 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11760 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
11770 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
11780 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11790 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
117a0 63 6b 65 6e 64 20 2a 2f 0a 20 20 46 74 73 35 42  ckend */.  Fts5B
117b0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20  uffer *pBuf,    
117c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
117d0 66 66 65 72 20 74 6f 20 75 73 65 20 66 6f 72 20  ffer to use for 
117e0 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
117f0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  .  const u8 *pTe
11800 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  rm, int nTerm,  
11810 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65     /* Term to se
11820 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66  ek to */.  int f
11830 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
11840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
11850 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
11860 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46  XXX flags */.  F
11870 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
11880 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f  ent *pSeg,     /
11890 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
118a0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
118b0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
118d0 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
118e0 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
118f0 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62  iPg = 1;.  int b
11900 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  Ge = (flags & FT
11910 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
11920 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64  AN);.  int bDlid
11930 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
11940 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11950 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
11960 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20  list-index */.. 
11970 20 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c   static int nCal
11980 6c 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b  l = 0;.  nCall++
11990 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 47 65  ;..  assert( bGe
119a0 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
119b0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
119c0 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73  DESC)==0 );.  as
119d0 73 65 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e  sert( pTerm && n
119e0 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74  Term );.  memset
119f0 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
11a00 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
11a10 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ter->pSeg = pSeg
11a20 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  ;..  /* This blo
11a30 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20 76 61  ck sets stack va
11a40 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68  riable iPg to th
11a50 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  e leaf page numb
11a60 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a  er that may.  **
11a70 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70   contain term (p
11a80 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20  Term/nTerm), if 
11a90 69 74 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  it is present in
11aa0 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f   the segment. */
11ab0 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 53 65  .  if( p->pIdxSe
11ac0 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46  lect==0 ){.    F
11ad0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
11ae0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
11af0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
11b00 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
11b10 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 73 71 6c  >pIdxSelect, sql
11b20 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
11b30 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
11b40 70 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27  pgno FROM '%q'.'
11b50 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 22 0a  %q_idx' WHERE ".
11b60 20 20 20 20 20 20 20 20 20 20 22 73 65 67 69 64            "segid
11b70 3d 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f  =? AND term<=? O
11b80 52 44 45 52 20 42 59 20 74 65 72 6d 20 44 45 53  RDER BY term DES
11b90 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20  C LIMIT 1",.    
11ba0 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
11bb0 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
11bc0 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20  me.    ));.  }. 
11bd0 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
11be0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  urn;.  sqlite3_b
11bf0 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53  ind_int(p->pIdxS
11c00 65 6c 65 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e  elect, 1, pSeg->
11c10 69 53 65 67 69 64 29 3b 0a 20 20 73 71 6c 69 74  iSegid);.  sqlit
11c20 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e  e3_bind_blob(p->
11c30 70 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 70  pIdxSelect, 2, p
11c40 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c  Term, nTerm, SQL
11c50 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69  ITE_STATIC);.  i
11c60 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
11c70 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
11c80 49 64 78 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  IdxSelect) ){.  
11c90 20 20 69 36 34 20 76 61 6c 20 3d 20 73 71 6c 69    i64 val = sqli
11ca0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
11cb0 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 30 29  ->pIdxSelect, 0)
11cc0 3b 0a 20 20 20 20 69 50 67 20 3d 20 28 69 6e 74  ;.    iPg = (int
11cd0 29 28 76 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62  )(val>>1);.    b
11ce0 44 6c 69 64 78 20 3d 20 28 76 61 6c 20 26 20 30  Dlidx = (val & 0
11cf0 78 30 30 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d  x0001);.  }.  p-
11d00 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
11d10 73 65 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  set(p->pIdxSelec
11d20 74 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c 70  t);..  if( iPg<p
11d30 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  Seg->pgnoFirst )
11d40 7b 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65 67  {.    iPg = pSeg
11d50 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20  ->pgnoFirst;.   
11d60 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d   bDlidx = 0;.  }
11d70 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ..  pIter->iLeaf
11d80 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a  Pgno = iPg - 1;.
11d90 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
11da0 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
11db0 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ..  if( pIter->p
11dc0 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
11dd0 4c 65 61 66 53 65 65 6b 28 70 2c 20 62 47 65 2c  LeafSeek(p, bGe,
11de0 20 70 49 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e   pIter, pTerm, n
11df0 54 65 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Term);.  }..  if
11e00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11e10 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a  OK && bGe==0 ){.
11e20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
11e30 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
11e40 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66  _ONETERM;.    if
11e50 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
11e60 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  {.      if( flag
11e70 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
11e80 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  ERY_DESC ){.    
11e90 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
11ea0 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
11eb0 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
11ec0 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44 6c 69  }.      if( bDli
11ed0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  dx ){.        ft
11ee0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69  s5SegIterLoadDli
11ef0 64 78 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  dx(p, pIter);.  
11f00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11f10 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
11f20 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a  X_QUERY_DESC ){.
11f30 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
11f40 74 65 72 52 65 76 65 72 73 65 28 70 2c 20 70 49  terReverse(p, pI
11f50 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
11f60 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53    }.  }..  fts5S
11f70 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c  egIterSetNext(p,
11f80 20 70 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 45   pIter);..  /* E
11f90 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ither:.  **.  **
11fa0 20 20 20 31 29 20 61 6e 20 65 72 72 6f 72 20 68     1) an error h
11fb0 61 73 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a  as occurred, or.
11fc0 20 20 2a 2a 20 20 20 32 29 20 74 68 65 20 69 74    **   2) the it
11fd0 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
11fe0 20 45 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20   EOF, or.  **   
11ff0 33 29 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  3) the iterator 
12000 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
12010 72 79 20 77 69 74 68 20 74 65 72 6d 20 28 70 54  ry with term (pT
12020 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20  erm/nTerm), or. 
12030 20 2a 2a 20 20 20 34 29 20 74 68 65 20 46 54 53   **   4) the FTS
12040 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
12050 4e 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 61  N flag was set a
12060 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  nd the iterator 
12070 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20  points.  **     
12080 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74   to an entry wit
12090 68 20 61 20 74 65 72 6d 20 67 72 65 61 74 65 72  h a term greater
120a0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
120b0 6f 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e  o (pTerm/nTerm).
120c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
120d0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a            /* 1 *
12110 2f 0a 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70  /.   || pIter->p
12120 4c 65 61 66 3d 3d 30 20 20 20 20 20 20 20 20 20  Leaf==0         
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20        /* 2 */.  
12160 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f   || fts5BufferCo
12170 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72  mpareBlob(&pIter
12180 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  ->term, pTerm, n
12190 54 65 72 6d 29 3d 3d 30 20 20 20 20 20 20 20 20  Term)==0        
121a0 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20    /* 3 */.   || 
121b0 28 62 47 65 20 26 26 20 66 74 73 35 42 75 66 66  (bGe && fts5Buff
121c0 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70  erCompareBlob(&p
121d0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72  Iter->term, pTer
121e0 6d 2c 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a  m, nTerm)>0)  /*
121f0 20 34 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a   4 */.  );.}../*
12200 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
12210 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20  he object pIter 
12220 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d  to point to term
12230 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74   pTerm/nTerm wit
12240 68 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65  hin the.** in-me
12250 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e  mory hash table.
12260 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
12270 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  such term in the
12280 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65   hash-table, the
12290 20 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73   .** iterator is
122a0 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a   set to EOF..**.
122b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
122c0 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78  ccurs, Fts5Index
122d0 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  .rc is set to an
122e0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
122f0 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20  or code. If .** 
12300 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
12310 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
12320 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
12330 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
12340 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
12350 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
12360 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20  gIterHashInit(. 
12370 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
123a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
123b0 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
123c0 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f  ,     /* Term to
123d0 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e   seek to */.  in
123e0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12400 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44   Mask of FTS5IND
12410 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  EX_XXX flags */.
12420 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
12430 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
12440 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70    /* Object to p
12450 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
12460 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20  const u8 *pList 
12470 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74  = 0;.  int nList
12480 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38   = 0;.  const u8
12490 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e   *z = 0;.  int n
124a0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
124b0 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61   p->pHash );.  a
124c0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
124d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
124e0 28 20 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66  ( pTerm==0 || (f
124f0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
12500 5f 51 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a  _QUERY_SCAN) ){.
12510 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
12520 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49  te3Fts5HashScanI
12530 6e 69 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63  nit(p->pHash, (c
12540 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d  onst char*)pTerm
12550 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71  , nTerm);.    sq
12560 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
12570 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c  nEntry(p->pHash,
12580 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26   (const char**)&
12590 7a 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  z, &pList, &nLis
125a0 74 29 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f  t);.    n = (z ?
125b0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f   (int)strlen((co
125c0 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30  nst char*)z) : 0
125d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
125e0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
125f0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
12600 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  TERM;.    sqlite
12610 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28 70  3Fts5HashQuery(p
12620 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20  ->pHash, (const 
12630 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65  char*)pTerm, nTe
12640 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  rm, &pList, &nLi
12650 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65  st);.    z = pTe
12660 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72  rm;.    n = nTer
12670 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  m;.  }..  if( pL
12680 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44  ist ){.    Fts5D
12690 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20  ata *pLeaf;.    
126a0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
126b0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
126c0 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29  ter->term, n, z)
126d0 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
126e0 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73  s5IdxMalloc(p, s
126f0 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29 29  izeof(Fts5Data))
12700 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d  ;.    if( pLeaf=
12710 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
12720 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a   pLeaf->p = (u8*
12730 29 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65 61  )pList;.    pLea
12740 66 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73  f->nn = pLeaf->s
12750 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20  zLeaf = nList;. 
12760 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
12770 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74  = pLeaf;.    pIt
12780 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
12790 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
127a0 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29  pLeaf->p, (u64*)
127b0 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
127c0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
127d0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61  ofDoclist = pLea
127e0 66 2d 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28 20  f->nn;..    if( 
127f0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
12800 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a  X_QUERY_DESC ){.
12810 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61        pIter->fla
12820 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
12830 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  ER_REVERSE;.    
12840 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
12850 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
12860 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73  pIter);.    }els
12870 65 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  e{.      fts5Seg
12880 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
12890 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
128a0 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  }..  fts5SegIter
128b0 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72  SetNext(p, pIter
128c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f  );.}../*.** Zero
128d0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
128e0 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
128f0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
12900 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
12910 67 49 74 65 72 43 6c 65 61 72 28 46 74 73 35 53  gIterClear(Fts5S
12920 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
12930 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
12940 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
12950 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
12960 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
12970 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
12980 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  se(pIter->pNextL
12990 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64  eaf);.  fts5Dlid
129a0 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d  xIterFree(pIter-
129b0 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69  >pDlidx);.  sqli
129c0 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e  te3_free(pIter->
129d0 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20  aRowidOffset);. 
129e0 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
129f0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
12a00 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65  Iter));.}..#ifde
12a10 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a  f SQLITE_DEBUG..
12a20 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12a30 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 70  ion is used as p
12a40 61 72 74 20 6f 66 20 74 68 65 20 62 69 67 20 61  art of the big a
12a50 73 73 65 72 74 28 29 20 70 72 6f 63 65 64 75 72  ssert() procedur
12a60 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  e implemented by
12a70 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75  .** fts5AssertMu
12a80 6c 74 69 49 74 65 72 53 65 74 75 70 28 29 2e 20  ltiIterSetup(). 
12a90 49 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  It ensures that 
12aa0 74 68 65 20 72 65 73 75 6c 74 20 63 75 72 72 65  the result curre
12ab0 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69  ntly stored.** i
12ac0 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65 20 63  n *pRes is the c
12ad0 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66  orrect result of
12ae0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63   comparing the c
12af0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73  urrent positions
12b00 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69   of the.** two i
12b10 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61  terators..*/.sta
12b20 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73  tic void fts5Ass
12b30 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73  ertComparisonRes
12b40 75 6c 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ult(.  Fts5Index
12b50 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
12b60 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 2c  Fts5SegIter *p1,
12b70 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
12b80 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73 75 6c  p2,.  Fts5CResul
12b90 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74  t *pRes.){.  int
12ba0 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74 65 72   i1 = p1 - pIter
12bb0 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20 69 32  ->aSeg;.  int i2
12bc0 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d 3e 61   = p2 - pIter->a
12bd0 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e  Seg;..  if( p1->
12be0 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65  pLeaf || p2->pLe
12bf0 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31  af ){.    if( p1
12c00 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
12c10 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12c20 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
12c30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32      }else if( p2
12c40 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
12c50 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12c60 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a  ->iFirst==i1 );.
12c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12c80 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28   int nMin = MIN(
12c90 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e  p1->term.n, p2->
12ca0 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69  term.n);.      i
12cb0 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
12cc0 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e  p1->term.p, p2->
12cd0 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20  term.p, nMin);. 
12ce0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
12cf0 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d  ) res = p1->term
12d00 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b  .n - p2->term.n;
12d10 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ..      if( res=
12d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
12d30 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
12d40 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  mEq==1 );.      
12d50 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e 69 52    assert( p1->iR
12d60 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64  owid!=p2->iRowid
12d70 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20   );.        res 
12d80 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e  = ((p1->iRowid >
12d90 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49   p2->iRowid)==pI
12da0 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20  ter->bRev) ? -1 
12db0 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : 1;.      }else
12dc0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
12dd0 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
12de0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
12df0 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
12e00 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
12e10 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d  ( pRes->iFirst==
12e20 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  i1 );.      }els
12e30 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
12e40 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
12e50 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  =i2 );.      }. 
12e60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12e70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12e80 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
12e90 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  s SQLITE_DEBUG i
12ea0 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74  s defined when t
12eb0 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73  his module.** is
12ec0 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68   compiled. In th
12ed0 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 66 75  at case, this fu
12ee0 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65 6e 74  nction is essent
12ef0 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72 74 28  ially an assert(
12f00 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ) .** statement 
12f10 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  used to verify t
12f20 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
12f30 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
12f40 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a  First[] array.**
12f50 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f   are correct..*/
12f60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
12f70 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
12f80 53 65 74 75 70 28 46 74 73 35 49 6e 64 65 78 20  Setup(Fts5Index 
12f90 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65  *p, Fts5IndexIte
12fa0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
12fb0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12fc0 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  K ){.    Fts5Seg
12fd0 49 74 65 72 20 2a 70 46 69 72 73 74 20 3d 20 26  Iter *pFirst = &
12fe0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
12ff0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
13000 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20  irst ];.    int 
13010 69 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  i;..    assert( 
13020 28 70 46 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d  (pFirst->pLeaf==
13030 30 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f 66 20  0)==pIter->bEof 
13040 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
13050 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69 53 77   that pIter->iSw
13060 69 74 63 68 52 6f 77 69 64 20 69 73 20 73 65 74  itchRowid is set
13070 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
13080 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
13090 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
130a0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
130b0 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
130c0 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20  >aSeg[i];.      
130d0 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46 69 72  assert( p1==pFir
130e0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  st .           |
130f0 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a  | p1->pLeaf==0 .
13100 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 74             || ft
13110 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
13120 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26  &pFirst->term, &
13130 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20 20  p1->term) .     
13140 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f        || p1->iRo
13150 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69  wid==pIter->iSwi
13160 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20 20 20  tchRowid.       
13170 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77      || (p1->iRow
13180 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63  id<pIter->iSwitc
13190 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  hRowid)==pIter->
131a0 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a 20 20  bRev.      );.  
131b0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
131c0 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
131d0 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74   i+=2){.      Ft
131e0 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
131f0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
13200 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13210 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d  er *p2 = &pIter-
13220 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20  >aSeg[i+1];.    
13230 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
13240 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
13250 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65  irst[(pIter->nSe
13260 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20  g + i) / 2];.   
13270 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d     fts5AssertCom
13280 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49  parisonResult(pI
13290 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65  ter, p1, p2, pRe
132a0 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  s);.    }..    f
132b0 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74 65 72  or(i=1; i<(pIter
132c0 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d  ->nSeg / 2); i+=
132d0 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
132e0 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
132f0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13300 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69  >aFirst[i*2].iFi
13310 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73  rst ];.      Fts
13320 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26  5SegIter *p2 = &
13330 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
13340 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31  er->aFirst[i*2+1
13350 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
13360 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
13370 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
13380 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66  irst[i];.      f
13390 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
133a0 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
133b0 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
133c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
133d0 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 41  e.# define fts5A
133e0 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
133f0 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  tup(x,y).#endif.
13400 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f  ./*.** Do the co
13410 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61  mparison necessa
13420 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70  ry to populate p
13430 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
13440 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  t]..**.** If the
13450 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
13460 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
13470 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65  n it is the inde
13480 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  x of an entry.**
13490 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
134a0 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74  Seg[] array that
134b0 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45   is (a) not at E
134c0 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e  OF, and (b) poin
134d0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79  ting.** to a key
134e0 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69   that is a dupli
134f0 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c  cate of another,
13500 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79   higher priority
13510 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74  , .** segment-it
13520 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53  erator in the pS
13530 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  eg->aSeg[] array
13540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13550 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
13560 6f 6d 70 61 72 65 28 46 74 73 35 49 6e 64 65 78  ompare(Fts5Index
13570 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
13580 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31   iOut){.  int i1
13590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
135a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
135b0 65 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  ex of left-hand 
135c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
135d0 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20   int i2;        
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
13600 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ht-hand Fts5SegI
13610 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ter */.  int iRe
13620 73 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  s;.  Fts5SegIter
13630 20 2a 70 31 3b 20 20 20 20 20 20 20 20 20 20 20   *p1;           
13640 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e       /* Left-han
13650 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
13660 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
13670 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
13680 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64     /* Right-hand
13690 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
136a0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
136b0 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
136c0 69 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61  irst[iOut];..  a
136d0 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49 74 65  ssert( iOut<pIte
136e0 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75 74 3e  r->nSeg && iOut>
136f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
13700 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c  Iter->bRev==0 ||
13710 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20   pIter->bRev==1 
13720 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d  );..  if( iOut>=
13730 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20  (pIter->nSeg/2) 
13740 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75  ){.    i1 = (iOu
13750 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f  t - pIter->nSeg/
13760 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d  2) * 2;.    i2 =
13770 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65   i1 + 1;.  }else
13780 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74 65 72  {.    i1 = pIter
13790 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d  ->aFirst[iOut*2]
137a0 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69 32 20  .iFirst;.    i2 
137b0 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
137c0 69 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74  iOut*2+1].iFirst
137d0 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49  ;.  }.  p1 = &pI
137e0 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20  ter->aSeg[i1];. 
137f0 20 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   p2 = &pIter->aS
13800 65 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d  eg[i2];..  pRes-
13810 3e 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20  >bTermEq = 0;.  
13820 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30  if( p1->pLeaf==0
13830 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   ){           /*
13840 20 49 66 20 70 31 20 69 73 20 61 74 20 45 4f 46   If p1 is at EOF
13850 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
13860 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
13870 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  2->pLeaf==0 ){  
13880 20 20 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61     /* If p2 is a
13890 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65  t EOF */.    iRe
138a0 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b  s = i1;.  }else{
138b0 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66  .    int res = f
138c0 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
138d0 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d  (&p1->term, &p2-
138e0 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  >term);.    if( 
138f0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
13900 61 73 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b  assert( i2>i1 );
13910 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
13920 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52  2!=0 );.      pR
13930 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b  es->bTermEq = 1;
13940 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69  .      if( p1->i
13950 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69  Rowid==p2->iRowi
13960 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70 31 2d  d ){.        p1-
13970 3e 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c  >bDel = p2->bDel
13980 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13990 20 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i2;.      }.   
139a0 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69     res = ((p1->i
139b0 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77  Rowid > p2->iRow
139c0 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
139d0 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20  ) ? -1 : +1;.   
139e0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
139f0 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  es!=0 );.    if(
13a00 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
13a10 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d  iRes = i1;.    }
13a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73  else{.      iRes
13a30 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   = i2;.    }.  }
13a40 0a 0a 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74  ..  pRes->iFirst
13a50 20 3d 20 28 75 31 36 29 69 52 65 73 3b 0a 20 20   = (u16)iRes;.  
13a60 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
13a70 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d  ** Move the seg-
13a80 69 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  iter so that it 
13a90 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
13aa0 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67  rst rowid on pag
13ab0 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20  e iLeafPgno..** 
13ac0 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  It is an error i
13ad0 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f  f leaf iLeafPgno
13ae0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
13af0 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  or contains no r
13b00 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  owids..*/.static
13b10 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
13b20 72 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73  rGotoPage(.  Fts
13b30 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b50 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
13b60 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
13b70 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
13b80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
13b90 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
13ba0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
13bb0 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  no.){.  assert( 
13bc0 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
13bd0 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20  >iLeafPgno );.. 
13be0 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70   if( iLeafPgno>p
13bf0 49 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  Iter->pSeg->pgno
13c00 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72  Last ){.    p->r
13c10 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
13c20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
13c30 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
13c40 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29  Iter->pNextLeaf)
13c50 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65  ;.    pIter->pNe
13c60 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  xtLeaf = 0;.    
13c70 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
13c80 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a   = iLeafPgno-1;.
13c90 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
13ca0 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
13cb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13cc0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
13cd0 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  || pIter->iLeafP
13ce0 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29  gno==iLeafPgno )
13cf0 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  ;..    if( p->rc
13d00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13d10 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20       int iOff;. 
13d20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74       u8 *a = pIt
13d30 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
13d40 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65      int n = pIte
13d50 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
13d60 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ;..      iOff = 
13d70 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
13d80 69 64 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65  idOff(pIter->pLe
13d90 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  af);.      if( i
13da0 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e  Off<4 || iOff>=n
13db0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
13dc0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
13dd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13de0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
13df0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
13e00 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
13e10 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
13e20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
13e30 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
13e40 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
13e50 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
13e60 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
13e70 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
13e80 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
13e90 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
13ea0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
13eb0 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 69  ument until it i
13ec0 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74  s at or .** past
13ed0 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52 65   rowid iFrom. Re
13ee0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
13ef0 76 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20  value of iFrom, 
13f00 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a  the iterator is.
13f10 2a 2a 20 61 6c 77 61 79 73 20 61 64 76 61 6e 63  ** always advanc
13f20 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  ed at least once
13f30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13f40 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
13f50 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  From(.  Fts5Inde
13f60 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
13f70 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
13f80 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
13f90 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
13fa0 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
13fb0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
13fc0 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
13fd0 69 36 34 20 69 4d 61 74 63 68 20 20 20 20 20 20  i64 iMatch      
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61  /* Advance itera
14000 74 6f 72 20 61 74 20 6c 65 61 73 74 20 74 68 69  tor at least thi
14010 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  s far */.){.  in
14020 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d  t bRev = (pIter-
14030 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
14040 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a  GITER_REVERSE);.
14050 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
14060 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  *pDlidx = pIter-
14070 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69  >pDlidx;.  int i
14080 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
14090 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69  ->iLeafPgno;.  i
140a0 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20  nt bMove = 1;.. 
140b0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
140c0 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
140d0 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
140e0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
140f0 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73 73  >pDlidx );.  ass
14100 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
14110 66 20 29 3b 0a 0a 20 20 69 66 28 20 62 52 65 76  f );..  if( bRev
14120 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  ==0 ){.    while
14130 28 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72  ( !fts5DlidxIter
14140 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26  Eof(p, pDlidx) &
14150 26 20 69 4d 61 74 63 68 3e 66 74 73 35 44 6c 69  & iMatch>fts5Dli
14160 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
14170 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69 4c 65  dx) ){.      iLe
14180 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  afPgno = fts5Dli
14190 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
141a0 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  x);.      fts5Dl
141b0 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70  idxIterNext(p, p
141c0 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20  Dlidx);.    }.  
141d0 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4c 65    assert_nc( iLe
141e0 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69  afPgno>=pIter->i
141f0 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72  LeafPgno || p->r
14200 63 20 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65  c );.    if( iLe
14210 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c  afPgno>pIter->iL
14220 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
14230 20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f   fts5SegIterGoto
14240 50 61 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69  Page(p, pIter, i
14250 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
14260 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20   bMove = 0;.    
14270 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
14280 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e  ssert( pIter->pN
14290 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  extLeaf==0 );.  
142a0 20 20 61 73 73 65 72 74 28 20 69 4d 61 74 63 68    assert( iMatch
142b0 3c 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 29  <pIter->iRowid )
142c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74  ;.    while( !ft
142d0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
142e0 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61  , pDlidx) && iMa
142f0 74 63 68 3c 66 74 73 35 44 6c 69 64 78 49 74 65  tch<fts5DlidxIte
14300 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
14310 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
14320 78 49 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c  xIterPrev(p, pDl
14330 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  idx);.    }.    
14340 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35  iLeafPgno = fts5
14350 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
14360 6c 69 64 78 29 3b 0a 0a 20 20 20 20 61 73 73 65  lidx);..    asse
14370 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65  rt( fts5DlidxIte
14380 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20  rEof(p, pDlidx) 
14390 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49  || iLeafPgno<=pI
143a0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
143b0 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66  ;..    if( iLeaf
143c0 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno<pIter->iLea
143d0 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70  fPgno ){.      p
143e0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
143f0 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20  = iLeafPgno+1;. 
14400 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14410 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70  ReverseNewPage(p
14420 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
14430 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  bMove = 0;.    }
14440 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
14450 69 66 28 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e  if( bMove && p->
14460 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
14470 70 49 74 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20  pIter->xNext(p, 
14480 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69  pIter, 0);.    i
14490 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
144a0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
144b0 69 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70  if( bRev==0 && p
144c0 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d  Iter->iRowid>=iM
144d0 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
144e0 20 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26    if( bRev!=0 &&
144f0 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d   pIter->iRowid<=
14500 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
14510 20 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20      bMove = 1;. 
14520 20 7d 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d   }while( p->rc==
14530 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a  SQLITE_OK );.}..
14540 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
14550 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
14560 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
14570 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
14580 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
14590 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
145a0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
145b0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
145c0 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
145d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
145e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
145f0 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
14600 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
14610 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d 3e  erClear(&pIter->
14620 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aSeg[i]);.    }.
14630 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
14640 65 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  eRelease(pIter->
14650 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 66 74  pStruct);.    ft
14660 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
14670 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
14680 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14690 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  pIter);.  }.}..s
146a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
146b0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
146c0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
146d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
146e0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
146f0 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
14700 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 49  ithin */.  Fts5I
14710 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
14720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
14730 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65  erator to update
14740 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20   aFirst[] array 
14750 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68  for */.  int iCh
14760 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20  anged,          
14770 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14780 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f  x of sub-iterato
14790 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20  r just advanced 
147a0 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65 74  */.  int iMinset
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147c0 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
147d0 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74 5b  entry in aFirst[
147e0 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  ] to set */.){. 
147f0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
14800 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68  (pIter->nSeg+iCh
14810 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69  anged)/2; i>=iMi
14820 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53  nset && p->rc==S
14830 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29  QLITE_OK; i=i/2)
14840 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20  {.    int iEq;. 
14850 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
14860 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
14870 70 61 72 65 28 70 49 74 65 72 2c 20 69 29 29 20  pare(pIter, i)) 
14880 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
14890 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
148a0 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a  ter->aSeg[iEq];.
148b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
148c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
148d0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e  ;.      pSeg->xN
148e0 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b  ext(p, pSeg, 0);
148f0 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74 65 72  .      i = pIter
14900 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20  ->nSeg + iEq;.  
14910 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
14920 20 53 75 62 2d 69 74 65 72 61 74 6f 72 20 69 43   Sub-iterator iC
14930 68 61 6e 67 65 64 20 6f 66 20 69 74 65 72 61 74  hanged of iterat
14940 6f 72 20 70 49 74 65 72 20 68 61 73 20 6a 75 73  or pIter has jus
14950 74 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64 2e  t been advanced.
14960 20 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69   It still.** poi
14970 6e 74 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  nts to the same 
14980 74 65 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a 75  term though - ju
14990 73 74 20 61 20 64 69 66 66 65 72 65 6e 74 20 72  st a different r
149a0 6f 77 69 64 2e 20 54 68 69 73 20 66 75 6e 63 74  owid. This funct
149b0 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ion.** attempts 
149c0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f  to update the co
149d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49  ntents of the pI
149e0 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 63  ter->aFirst[] ac
149f0 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66  cordingly..** If
14a00 20 69 74 20 64 6f 65 73 20 73 6f 20 73 75 63 63   it does so succ
14a10 65 73 73 66 75 6c 6c 79 2c 20 30 20 69 73 20 72  essfully, 0 is r
14a20 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
14a30 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  se 1..**.** If n
14a40 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
14a50 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
14a60 73 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73 35  should call fts5
14a70 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
14a80 64 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 74  d().** on the it
14a90 65 72 61 74 6f 72 20 69 6e 73 74 65 61 64 2e 20  erator instead. 
14aa0 54 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 64 6f  That function do
14ab0 65 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  es the same as t
14ac0 68 69 73 20 6f 6e 65 2c 20 65 78 63 65 70 74 0a  his one, except.
14ad0 2a 2a 20 74 68 61 74 20 69 74 20 64 65 61 6c 73  ** that it deals
14ae0 20 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   with more compl
14af0 69 63 61 74 65 64 20 63 61 73 65 73 20 61 73 20  icated cases as 
14b00 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  well..*/ .static
14b10 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74   int fts5MultiIt
14b20 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 0a  erAdvanceRowid(.
14b30 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
14b60 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
14b70 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  hin */.  Fts5Ind
14b80 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  exIter *pIter,  
14b90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
14ba0 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61  ator to update a
14bb0 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f  First[] array fo
14bc0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e  r */.  int iChan
14bd0 67 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ged             
14be0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
14bf0 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20  of sub-iterator 
14c00 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f  just advanced */
14c10 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  .){.  Fts5SegIte
14c20 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72  r *pNew = &pIter
14c30 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d  ->aSeg[iChanged]
14c40 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 69  ;..  if( pNew->i
14c50 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53  Rowid==pIter->iS
14c60 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c  witchRowid.   ||
14c70 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70   (pNew->iRowid<p
14c80 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
14c90 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
14ca0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  .  ){.    int i;
14cb0 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
14cc0 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65   *pOther = &pIte
14cd0 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64  r->aSeg[iChanged
14ce0 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20 20 20 20   ^ 0x0001];.    
14cf0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
14d00 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 62 52 65  wid = pIter->bRe
14d10 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  v ? SMALLEST_INT
14d20 36 34 20 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54  64 : LARGEST_INT
14d30 36 34 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 70  64;.    for(i=(p
14d40 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e  Iter->nSeg+iChan
14d50 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32  ged)/2; 1; i=i/2
14d60 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ){.      Fts5CRe
14d70 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
14d80 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a  ter->aFirst[i];.
14d90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14da0 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20  New->pLeaf );.  
14db0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
14dc0 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20  ->bTermEq==0 || 
14dd0 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b  pOther->pLeaf );
14de0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  ..      if( pRes
14df0 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20  ->bTermEq ){.   
14e00 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69       if( pNew->i
14e10 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69  Rowid==pOther->i
14e20 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
14e30 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14e40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
14e50 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70  pOther->iRowid>p
14e60 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49  New->iRowid)==pI
14e70 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20  ter->bRev ){.   
14e80 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53         pIter->iS
14e90 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74  witchRowid = pOt
14ea0 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20  her->iRowid;.   
14eb0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
14ec0 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  ther;.        }e
14ed0 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
14ee0 3e 69 52 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69  >iRowid>pIter->i
14ef0 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49  SwitchRowid)==pI
14f00 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20  ter->bRev ){.   
14f10 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53         pIter->iS
14f20 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74  witchRowid = pOt
14f30 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20  her->iRowid;.   
14f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14f50 20 20 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73       pRes->iFirs
14f60 74 20 3d 20 28 75 31 36 29 28 70 4e 65 77 20 2d  t = (u16)(pNew -
14f70 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20   pIter->aSeg);. 
14f80 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20       if( i==1 ) 
14f90 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f  break;..      pO
14fa0 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  ther = &pIter->a
14fb0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
14fc0 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e 69  st[i ^ 0x0001].i
14fd0 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20  First ];.    }. 
14fe0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
14ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
15000 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72   pIter->bEof var
15010 69 61 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74  iable based on t
15020 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
15030 73 75 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a  sub-iterators..*
15040 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
15050 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
15060 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  f(Fts5IndexIter 
15070 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53  *pIter){.  Fts5S
15080 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
15090 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
150a0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
150b0 69 72 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d  irst ];.  pIter-
150c0 3e 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c  >bEof = pSeg->pL
150d0 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d  eaf==0;.  pIter-
150e0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
150f0 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a  pSeg->iRowid;.}.
15100 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
15110 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
15120 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a  next entry. .**.
15130 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
15140 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
15150 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
15160 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74  Fts5Index.rc. It
15170 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73   is not .** cons
15180 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
15190 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
151a0 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20  reaches EOF, or 
151b0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
151c0 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e   at .** EOF when
151d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
151e0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
151f0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
15200 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  tiIterNext(.  Ft
15210 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
15220 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
15230 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d  ter,.  int bFrom
15240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15250 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
15260 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d  f argument iFrom
15270 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69   is valid */.  i
15280 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20  64 iFrom        
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
152a0 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61  * Advance at lea
152b0 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68 69  st as far as thi
152c0 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  s */.){.  if( p-
152d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
152e0 7b 0a 20 20 20 20 69 6e 74 20 62 55 73 65 46 72  {.    int bUseFr
152f0 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 20 20  om = bFrom;.    
15300 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  do {.      int i
15310 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61  First = pIter->a
15320 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b  First[1].iFirst;
15330 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
15340 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 46  erm = 0;.      F
15350 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
15360 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
15370 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 61  iFirst];.      a
15380 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
15390 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
153a0 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26   if( bUseFrom &&
153b0 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b   pSeg->pDlidx ){
153c0 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
153d0 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20  IterNextFrom(p, 
153e0 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20  pSeg, iFrom);.  
153f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15400 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70     pSeg->xNext(p
15410 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72  , pSeg, &bNewTer
15420 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  m);.      }..   
15430 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
15440 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72  af==0 || bNewTer
15450 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73  m .       || fts
15460 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
15470 65 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 2c  eRowid(p, pIter,
15480 20 69 46 69 72 73 74 29 0a 20 20 20 20 20 20 29   iFirst).      )
15490 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
154a0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
154b0 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
154c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  , 1);.        ft
154d0 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
154e0 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  f(pIter);.      
154f0 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  }.      fts5Asse
15500 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
15510 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20  (p, pIter);..   
15520 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b     bUseFrom = 0;
15530 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49 74  .    }while( pIt
15540 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26  er->bSkipEmpty &
15550 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  & fts5MultiIterI
15560 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29  sEmpty(p, pIter)
15570 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
15580 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
15590 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46 74 73  IterNext2(.  Fts
155a0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
155b0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
155c0 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77  er,.  int *pbNew
155d0 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
155e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72        /* OUT: Tr
155f0 75 65 20 69 66 20 2a 6d 69 67 68 74 2a 20 62 65  ue if *might* be
15600 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a   new term */.){.
15610 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
15620 3e 62 53 6b 69 70 45 6d 70 74 79 20 29 3b 0a 20  >bSkipEmpty );. 
15630 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
15640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 6f 20  TE_OK ){.    do 
15650 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69 72  {.      int iFir
15660 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  st = pIter->aFir
15670 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  st[1].iFirst;.  
15680 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
15690 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
156a0 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
156b0 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
156c0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73   = 0;..      ass
156d0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
156e0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
156f0 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53  Seg->xNext(p, pS
15700 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a  eg, &bNewTerm);.
15710 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
15720 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77  pLeaf==0 || bNew
15730 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20  Term .       || 
15740 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
15750 61 6e 63 65 52 6f 77 69 64 28 70 2c 20 70 49 74  anceRowid(p, pIt
15760 65 72 2c 20 69 46 69 72 73 74 29 0a 20 20 20 20  er, iFirst).    
15770 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73    ){.        fts
15780 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
15790 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  ed(p, pIter, iFi
157a0 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rst, 1);.       
157b0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65   fts5MultiIterSe
157c0 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20  tEof(pIter);.   
157d0 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20       *pbNewTerm 
157e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
157f0 7b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77  {.        *pbNew
15800 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
15810 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  }.      fts5Asse
15820 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
15830 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20  (p, pIter);..   
15840 20 7d 77 68 69 6c 65 28 20 66 74 73 35 4d 75 6c   }while( fts5Mul
15850 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c  tiIterIsEmpty(p,
15860 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d   pIter) );.  }.}
15870 0a 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49 6e  ...static Fts5In
15880 64 65 78 49 74 65 72 20 2a 66 74 73 35 4d 75 6c  dexIter *fts5Mul
15890 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46  tiIterAlloc(.  F
158a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
158c0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
158d0 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
158e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29   */.  int nSeg.)
158f0 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  {.  Fts5IndexIte
15900 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
15910 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20  Slot;           
15920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
15930 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53  wer of two >= nS
15940 65 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c  eg */..  for(nSl
15950 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67  ot=2; nSlot<nSeg
15960 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29  ; nSlot=nSlot*2)
15970 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49  ;.  pNew = fts5I
15980 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20  dxMalloc(p, .   
15990 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e     sizeof(Fts5In
159a0 64 65 78 49 74 65 72 29 20 2b 20 20 20 20 20 20  dexIter) +      
159b0 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a         /* pNew *
159c0 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  /.      sizeof(F
159d0 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 28 6e  ts5SegIter) * (n
159e0 53 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70  Slot-1) +   /* p
159f0 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20  New->aSeg[] */. 
15a00 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
15a10 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74  CResult) * nSlot
15a20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
15a30 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20  ->aFirst[] */.  
15a40 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
15a50 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20  .    pNew->nSeg 
15a60 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65  = nSlot;.    pNe
15a70 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73  w->aFirst = (Fts
15a80 35 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d  5CResult*)&pNew-
15a90 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20  >aSeg[nSlot];.  
15aa0 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d    pNew->pIndex =
15ab0 20 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   p;.  }.  return
15ac0 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
15ad0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46  Allocate a new F
15ae0 74 73 35 49 6e 64 65 78 49 74 65 72 20 6f 62 6a  ts5IndexIter obj
15af0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ect..**.** The n
15b00 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  ew object will b
15b10 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
15b20 65 20 74 68 72 6f 75 67 68 20 64 61 74 61 20 69  e through data i
15b30 6e 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  n structure pStr
15b40 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65  uct..** If iLeve
15b50 6c 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61  l is -ve, then a
15b60 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73  ll data in all s
15b70 65 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65  egments is merge
15b80 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c  d. Or, if iLevel
15b90 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67  .** is zero or g
15ba0 72 65 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f  reater, data fro
15bb0 6d 20 74 68 65 20 66 69 72 73 74 20 6e 53 65 67  m the first nSeg
15bc0 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e  ment segments on
15bd0 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a   level iLevel.**
15be0 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a   is merged..**.*
15bf0 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  * The iterator i
15c00 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20  nitially points 
15c10 74 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  to the first ter
15c20 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e  m/rowid entry in
15c30 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65   the .** iterate
15c40 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
15c50 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
15c60 49 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49  IterNew(.  Fts5I
15c70 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
15c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
15c90 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
15ca0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
15cb0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
15cc0 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  *pStruct,       
15cd0 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
15ce0 66 20 73 70 65 63 69 66 69 63 20 69 6e 64 65 78  f specific index
15cf0 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45   */.  int bSkipE
15d00 6d 70 74 79 2c 20 20 20 20 20 20 20 20 20 20 20  mpty,           
15d10 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
15d20 20 69 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d 6b   ignore delete-k
15d30 65 79 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  eys */.  int fla
15d40 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
15d50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
15d60 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20  INDEX_QUERY_XXX 
15d70 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
15d80 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
15d90 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
15da0 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
15db0 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
15dc0 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15de0 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
15df0 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
15e00 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
15e10 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
15e20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15e30 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
15e40 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
15e50 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
15e60 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  er **ppOut      
15e70 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
15e80 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
15e90 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Seg = 0;        
15ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15eb0 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d  mber of segment-
15ec0 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a  iters in use */.
15ed0 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b    int iIter = 0;
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53    /* */.  int iS
15f00 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
15f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
15f20 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
15f30 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
15f40 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
15f50 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20  f = {0,0,0};    
15f60 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
15f70 64 20 62 79 20 66 74 73 35 53 65 67 49 74 65 72  d by fts5SegIter
15f80 53 65 65 6b 49 6e 69 74 28 29 20 2a 2f 0a 20 20  SeekInit() */.  
15f90 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
15fa0 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35  el *pLvl;.  Fts5
15fb0 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77 3b  IndexIter *pNew;
15fc0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  ..  assert( (pTe
15fd0 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d  rm==0 && nTerm==
15fe0 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29  0) || iLevel<0 )
15ff0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
16000 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
16010 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65  ew multi-seg-ite
16020 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20  rator. */.  if( 
16030 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16040 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76   ){.    if( iLev
16050 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73  el<0 ){.      as
16060 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
16070 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72  Segment==fts5Str
16080 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
16090 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a  nts(pStruct) );.
160a0 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74        nSeg = pSt
160b0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a  ruct->nSegment;.
160c0 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70        nSeg += (p
160d0 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29  ->pHash ? 1 : 0)
160e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
160f0 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53     nSeg = MIN(pS
16100 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
16110 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67  evel].nSeg, nSeg
16120 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ment);.    }.  }
16130 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77  .  *ppOut = pNew
16140 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
16150 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a  Alloc(p, nSeg);.
16160 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
16170 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e  return;.  pNew->
16180 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67  bRev = (0!=(flag
16190 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
161a0 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e  ERY_DESC));.  pN
161b0 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d  ew->bSkipEmpty =
161c0 20 28 75 38 29 62 53 6b 69 70 45 6d 70 74 79 3b   (u8)bSkipEmpty;
161d0 0a 20 20 70 4e 65 77 2d 3e 70 53 74 72 75 63 74  .  pNew->pStruct
161e0 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 66 74   = pStruct;.  ft
161f0 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70  s5StructureRef(p
16200 53 74 72 75 63 74 29 3b 0a 0a 20 20 2f 2a 20 49  Struct);..  /* I
16210 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f  nitialize each o
16220 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  f the component 
16230 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
16240 73 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76  s. */.  if( iLev
16250 65 6c 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35  el<0 ){.    Fts5
16260 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
16270 70 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d  pEnd = &pStruct-
16280 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d  >aLevel[pStruct-
16290 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 69 66  >nLevel];.    if
162a0 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
162b0 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67      /* Add a seg
162c0 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f  ment iterator fo
162d0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  r the current co
162e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61  ntents of the ha
162f0 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  sh table. */.   
16300 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
16310 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
16320 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
16330 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 48      fts5SegIterH
16340 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d  ashInit(p, pTerm
16350 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
16360 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
16370 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72    for(pLvl=&pStr
16380 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20  uct->aLevel[0]; 
16390 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b  pLvl<pEnd; pLvl+
163a0 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  +){.      for(iS
163b0 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b  eg=pLvl->nSeg-1;
163c0 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d   iSeg>=0; iSeg--
163d0 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
163e0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
163f0 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61  *pSeg = &pLvl->a
16400 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
16410 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
16420 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
16430 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
16440 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
16450 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16460 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
16470 70 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  p, pSeg, pIter);
16480 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16490 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
164a0 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c  gIterSeekInit(p,
164b0 20 26 62 75 66 2c 20 70 54 65 72 6d 2c 20 6e 54   &buf, pTerm, nT
164c0 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67  erm, flags, pSeg
164d0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
164e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
164f0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
16500 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
16510 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a  aLevel[iLevel];.
16520 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65      for(iSeg=nSe
16530 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
16540 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73  eg--){.      fts
16550 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
16560 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
16570 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  ], &pNew->aSeg[i
16580 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a  Iter++]);.    }.
16590 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 49    }.  assert( iI
165a0 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20  ter==nSeg );..  
165b0 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20  /* If the above 
165c0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20  was successful, 
165d0 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69  each component i
165e0 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69  terators now poi
165f0 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65  nts .  ** to the
16600 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
16610 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20  its segment. In 
16620 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61  this case initia
16630 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61  lize the .  ** a
16640 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f  First[] array. O
16650 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  r, if an error h
16660 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65  as occurred, fre
16670 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20  e the iterator. 
16680 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73   ** object and s
16690 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
166a0 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20  riable to NULL. 
166b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
166c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
166d0 20 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65 77    for(iIter=pNew
166e0 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72 3e  ->nSeg-1; iIter>
166f0 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20  0; iIter--){.   
16700 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20     int iEq;.    
16710 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73    if( (iEq = fts
16720 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
16730 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29  are(pNew, iIter)
16740 29 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73  ) ){.        Fts
16750 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
16760 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71   &pNew->aSeg[iEq
16770 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
16780 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16790 29 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c  ) pSeg->xNext(p,
167a0 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20   pSeg, 0);.     
167b0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
167c0 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65 77  Advanced(p, pNew
167d0 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a 20  , iEq, iIter);. 
167e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
167f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65   fts5MultiIterSe
16800 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20 20  tEof(pNew);.    
16810 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
16820 74 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65 77  terSetup(p, pNew
16830 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  );..    if( pNew
16840 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20  ->bSkipEmpty && 
16850 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
16860 6d 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29 7b  mpty(p, pNew) ){
16870 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
16880 49 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65 77  IterNext(p, pNew
16890 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
168a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
168b0 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c  MultiIterFree(p,
168c0 20 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f   pNew);.    *ppO
168d0 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 74  ut = 0;.  }.  ft
168e0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
168f0 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  f);.}../*.** Cre
16900 61 74 65 20 61 6e 20 46 74 73 35 49 6e 64 65 78  ate an Fts5Index
16910 49 74 65 72 20 74 68 61 74 20 69 74 65 72 61 74  Iter that iterat
16920 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 64  es through the d
16930 6f 63 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a  oclist provided.
16940 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
16950 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
16960 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
16970 6c 74 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46  ltiIterNew2(.  F
16980 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
169a0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
169b0 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
169c0 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
169d0 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
169e0 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74        /* Doclist
169f0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
16a00 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  ugh */.  int bDe
16a10 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
16a20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16a30 20 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20   for descending 
16a40 72 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20  rowid order */. 
16a50 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
16a60 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
16a70 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
16a80 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  /.){.  Fts5Index
16a90 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  Iter *pNew;.  pN
16aa0 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  ew = fts5MultiIt
16ab0 65 72 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a 20  erAlloc(p, 2);. 
16ac0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
16ad0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
16ae0 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  ter = &pNew->aSe
16af0 67 5b 31 5d 3b 0a 0a 20 20 20 20 70 4e 65 77 2d  g[1];..    pNew-
16b00 3e 62 46 69 6c 74 65 72 65 64 20 3d 20 31 3b 0a  >bFiltered = 1;.
16b10 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
16b20 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   = FTS5_SEGITER_
16b30 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28  ONETERM;.    if(
16b40 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30   pData->szLeaf>0
16b50 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
16b60 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a  >pLeaf = pData;.
16b70 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
16b80 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
16b90 65 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e  etVarint(pData->
16ba0 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  p, (u64*)&pIter-
16bb0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
16bc0 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
16bd0 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e  list = pData->nn
16be0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46  ;.      pNew->aF
16bf0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d  irst[1].iFirst =
16c00 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44   1;.      if( bD
16c10 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  esc ){.        p
16c20 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20  New->bRev = 1;. 
16c30 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c         pIter->fl
16c40 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
16c50 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  TER_REVERSE;.   
16c60 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
16c70 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
16c80 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
16c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16ca0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
16cb0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
16cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61       }.      pDa
16cd0 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ta = 0;.    }els
16ce0 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62  e{.      pNew->b
16cf0 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
16d00 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65     fts5SegIterSe
16d10 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  tNext(p, pIter);
16d20 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70  ..    *ppOut = p
16d30 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  New;.  }..  fts5
16d40 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
16d50 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  a);.}../*.** Ret
16d60 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
16d70 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
16d80 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  OF or if an erro
16d90 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  r has occurred. 
16da0 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77  .** False otherw
16db0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
16dc0 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
16dd0 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
16de0 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  , Fts5IndexIter 
16df0 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
16e00 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20  t( p->rc .      
16e10 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b  || (pIter->aSeg[
16e20 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
16e30 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
16e40 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f  ==0)==pIter->bEo
16e50 66 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  f .  );.  return
16e60 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72   (p->rc || pIter
16e70 2d 3e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->bEof);.}../*.*
16e80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77  * Return the row
16e90 69 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20  id of the entry 
16ea0 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
16eb0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
16ec0 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65  ts.** to. If the
16ed0 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73   iterator points
16ee0 20 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69   to EOF when thi
16ef0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
16f00 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75  lled the.** resu
16f10 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65  lts are undefine
16f20 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  d..*/.static i64
16f30 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
16f40 77 69 64 28 46 74 73 35 49 6e 64 65 78 49 74 65  wid(Fts5IndexIte
16f50 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
16f60 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67  ert( pIter->aSeg
16f70 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
16f80 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61  1].iFirst ].pLea
16f90 66 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  f );.  return pI
16fa0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
16fb0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
16fc0 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a  st ].iRowid;.}..
16fd0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
16fe0 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
16ff0 65 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20  ext entry at or 
17000 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68  following iMatch
17010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17020 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
17030 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e  xtFrom(.  Fts5In
17040 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
17050 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
17060 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29   .  i64 iMatch.)
17070 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  {.  while( 1 ){.
17080 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
17090 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
170a0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
170b0 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20  1, iMatch);.    
170c0 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
170d0 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
170e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77   break;.    iRow
170f0 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
17100 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
17110 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
17120 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev==0 && iRowid
17130 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
17140 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
17150 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77  >bRev!=0 && iRow
17160 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
17170 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ak;.  }.}../*.**
17180 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
17190 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
171a0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
171b0 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  m associated wit
171c0 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20  h the .** entry 
171d0 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
171e0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
171f0 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ts to..*/.static
17200 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d   const u8 *fts5M
17210 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73  ultiIterTerm(Fts
17220 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
17230 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46  r, int *pn){.  F
17240 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20  ts5SegIter *p = 
17250 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
17260 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
17270 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d  First ];.  *pn =
17280 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65   p->term.n;.  re
17290 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a  turn p->term.p;.
172a0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
172b0 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
172c0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65     /* Index obje
172f0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
17300 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20  ter *pSeg,      
17310 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69          /* Posli
17320 73 74 20 6f 66 20 74 68 69 73 20 69 74 65 72 61  st of this itera
17330 74 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  tor */.  void *p
17340 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ctx,            
17350 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
17360 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  ext pointer for 
17370 78 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20  xChunk callback 
17380 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75  */.  void (*xChu
17390 6e 6b 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  nk)(Fts5Index*, 
173a0 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a  void*, const u8*
173b0 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20  , int).){.  int 
173c0 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f  nRem = pSeg->nPo
173d0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  s;          /* N
173e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 73  umber of bytes s
173f0 74 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a  till to come */.
17400 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
17410 61 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68  a = 0;.  u8 *pCh
17420 75 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  unk = &pSeg->pLe
17430 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
17440 66 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20  fOffset];.  int 
17450 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65  nChunk = MIN(nRe
17460 6d 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  m, pSeg->pLeaf->
17470 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69  szLeaf - pSeg->i
17480 4c 65 61 66 4f 66 66 73 65 74 29 3b 0a 20 20 69  LeafOffset);.  i
17490 6e 74 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  nt pgno = pSeg->
174a0 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  iLeafPgno;.  int
174b0 20 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a   pgnoSave = 0;..
174c0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
174d0 6f 6e 20 64 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b  on does notmwork
174e0 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e   with detail=non
174f0 65 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a  e databases. */.
17500 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
17510 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46  nfig->eDetail!=F
17520 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
17530 29 3b 0a 0a 20 20 69 66 28 20 28 70 53 65 67 2d  );..  if( (pSeg-
17540 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
17550 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d  GITER_REVERSE)==
17560 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76  0 ){.    pgnoSav
17570 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a  e = pgno+1;.  }.
17580 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
17590 20 20 20 78 43 68 75 6e 6b 28 70 2c 20 70 43 74     xChunk(p, pCt
175a0 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e  x, pChunk, nChun
175b0 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20  k);.    nRem -= 
175c0 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35  nChunk;.    fts5
175d0 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
175e0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 6d  a);.    if( nRem
175f0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  <=0 ){.      bre
17600 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
17610 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20       pgno++;.   
17620 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44     pData = fts5D
17630 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
17640 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
17650 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  eg->pSeg->iSegid
17660 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
17670 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 20 62  if( pData==0 ) b
17680 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 68 75  reak;.      pChu
17690 6e 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34  nk = &pData->p[4
176a0 5d 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b 20  ];.      nChunk 
176b0 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74  = MIN(nRem, pDat
176c0 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a  a->szLeaf - 4);.
176d0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
176e0 70 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20 20  pgnoSave ){.    
176f0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
17700 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
17710 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e  ;.        pSeg->
17720 70 4e 65 78 74 4c 65 61 66 20 3d 20 70 44 61 74  pNextLeaf = pDat
17730 61 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61  a;.        pData
17740 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
17750 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a    }.  }.}..../*.
17760 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
17770 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72  w segment-id for
17780 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
17790 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20  Struct. The new 
177a0 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75  segment.** id mu
177b0 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  st be between 1 
177c0 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73  and 65335 inclus
177d0 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f  ive, and must no
177e0 74 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a  t be used by .**
177f0 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65   any currently e
17800 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e  xisting segment.
17810 20 49 66 20 61 20 66 72 65 65 20 73 65 67 6d 65   If a free segme
17820 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20  nt id cannot be 
17830 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
17840 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  _FULL is returne
17850 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
17860 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
17870 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
17880 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
17890 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65  -op. 0 is .** re
178a0 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
178b0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
178c0 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53  nt fts5AllocateS
178d0 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a  egid(Fts5Index *
178e0 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  p, Fts5Structure
178f0 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e   *pStruct){.  in
17900 74 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20  t iSegid = 0;.. 
17910 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
17920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
17930 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
17940 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47  nt>=FTS5_MAX_SEG
17950 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d  MENT ){.      p-
17960 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c  >rc = SQLITE_FUL
17970 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
17980 20 20 20 20 77 68 69 6c 65 28 20 69 53 65 67 69      while( iSegi
17990 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
179a0 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
179b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
179c0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
179d0 66 28 75 33 32 29 2c 20 28 76 6f 69 64 2a 29 26  f(u32), (void*)&
179e0 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20  iSegid);.       
179f0 20 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64   iSegid = iSegid
17a00 20 26 20 28 28 31 20 3c 3c 20 46 54 53 35 5f 44   & ((1 << FTS5_D
17a10 41 54 41 5f 49 44 5f 42 29 2d 31 29 3b 0a 20 20  ATA_ID_B)-1);.  
17a20 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30        for(iLvl=0
17a30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
17a40 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
17a50 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
17a60 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72  Seg=0; iSeg<pStr
17a70 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
17a80 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ].nSeg; iSeg++){
17a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
17aa0 20 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74   iSegid==pStruct
17ab0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
17ac0 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
17ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17ae0 20 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 20 20    iSegid = 0;.  
17af0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17b10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
17b20 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 53    }..  return iS
17b30 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  egid;.}../*.** D
17b40 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20  iscard all data 
17b50 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
17b60 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62   in the hash-tab
17b70 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
17b80 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44 69 73  oid fts5IndexDis
17b90 63 61 72 64 44 61 74 61 28 46 74 73 35 49 6e 64  cardData(Fts5Ind
17ba0 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ex *p){.  assert
17bb0 28 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d  ( p->pHash || p-
17bc0 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30  >nPendingData==0
17bd0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61   );.  if( p->pHa
17be0 73 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sh ){.    sqlite
17bf0 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70  3Fts5HashClear(p
17c00 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d  ->pHash);.    p-
17c10 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20  >nPendingData = 
17c20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
17c30 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
17c40 6f 66 20 74 68 65 20 70 72 65 66 69 78 2c 20 69  of the prefix, i
17c50 6e 20 62 79 74 65 73 2c 20 74 68 61 74 20 62 75  n bytes, that bu
17c60 66 66 65 72 20 28 6e 4e 65 77 2f 70 4e 65 77 29  ffer (nNew/pNew)
17c70 20 73 68 61 72 65 73 0a 2a 2a 20 77 69 74 68 20   shares.** with 
17c80 62 75 66 66 65 72 20 28 6e 4f 6c 64 2f 70 4f 6c  buffer (nOld/pOl
17c90 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d)..*/.static in
17ca0 74 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  t fts5PrefixComp
17cb0 72 65 73 73 28 0a 20 20 69 6e 74 20 6e 4f 6c 64  ress(.  int nOld
17cc0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64  , const u8 *pOld
17cd0 2c 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 63 6f  ,.  int nNew, co
17ce0 6e 73 74 20 75 38 20 2a 70 4e 65 77 0a 29 7b 0a  nst u8 *pNew.){.
17cf0 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
17d00 74 28 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61  t( fts5BlobCompa
17d10 72 65 28 70 4f 6c 64 2c 20 6e 4f 6c 64 2c 20 70  re(pOld, nOld, p
17d20 4e 65 77 2c 20 6e 4e 65 77 29 3c 30 20 29 3b 0a  New, nNew)<0 );.
17d30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
17d40 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
17d50 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69   pOld[i]!=pNew[i
17d60 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ] ) break;.  }. 
17d70 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74   return i;.}..st
17d80 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
17d90 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20  iteDlidxClear(. 
17da0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
17db0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
17dc0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
17dd0 62 46 6c 75 73 68 20 20 20 20 20 20 20 20 20 20  bFlush          
17de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17df0 66 20 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c  f true, write dl
17e00 69 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29  idx to disk */.)
17e10 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
17e20 65 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c  ert( bFlush==0 |
17e30 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  | (pWriter->nDli
17e40 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  dx>0 && pWriter-
17e50 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
17e60 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  >0) );.  for(i=0
17e70 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c  ; i<pWriter->nDl
17e80 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  idx; i++){.    F
17e90 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
17ea0 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
17eb0 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20  r->aDlidx[i];.  
17ec0 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
17ed0 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  f.n==0 ) break;.
17ee0 20 20 20 20 69 66 28 20 62 46 6c 75 73 68 20 29      if( bFlush )
17ef0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17f00 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20  pDlidx->pgno!=0 
17f10 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  );.      fts5Dat
17f20 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20  aWrite(p, .     
17f30 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
17f40 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
17f50 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78  Segid, i, pDlidx
17f60 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20  ->pgno),.       
17f70 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
17f80 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a  , pDlidx->buf.n.
17f90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
17fa0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
17fb0 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
17fc0 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69  ->buf);.    pDli
17fd0 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
17fe0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
17ff0 20 47 72 6f 77 20 74 68 65 20 70 57 72 69 74 65   Grow the pWrite
18000 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61  r->aDlidx[] arra
18010 79 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c  y to at least nL
18020 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73  vl elements in s
18030 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20  ize..** Any new 
18040 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61  array elements a
18050 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65  re zeroed before
18060 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
18070 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72  tatic int fts5Wr
18080 69 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20  iteDlidxGrow(.  
18090 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
180a0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
180b0 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c  Writer,.  int nL
180c0 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  vl.){.  if( p->r
180d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
180e0 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e  nLvl>=pWriter->n
180f0 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
18100 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
18110 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64  lidx = (Fts5Dlid
18120 78 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33  xWriter*)sqlite3
18130 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
18140 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
18150 78 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  x, sizeof(Fts5Dl
18160 69 64 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76  idxWriter) * nLv
18170 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
18180 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20   aDlidx==0 ){.  
18190 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
181a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
181b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
181c0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
181d0 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
181e0 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72   (nLvl - pWriter
181f0 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  ->nDlidx);.     
18200 20 6d 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b   memset(&aDlidx[
18210 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d  pWriter->nDlidx]
18220 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
18230 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69     pWriter->aDli
18240 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20  dx = aDlidx;.   
18250 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69     pWriter->nDli
18260 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d  dx = nLvl;.    }
18270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
18280 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  >rc;.}../*.** If
18290 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
182a0 6c 69 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d  list-index accum
182b0 75 6c 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74  ulating in pWrit
182c0 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20  er->aDlidx[] is 
182d0 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c  large.** enough,
182e0 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
182f0 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  k and return 1. 
18300 4f 74 68 65 72 77 69 73 65 20 64 69 73 63 61 72  Otherwise discar
18310 64 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a  d it and return.
18320 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  ** zero..*/.stat
18330 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65  ic int fts5Write
18340 46 6c 75 73 68 44 6c 69 64 78 28 46 74 73 35 49  FlushDlidx(Fts5I
18350 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
18360 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
18370 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20  {.  int bFlag = 
18380 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  0;..  /* If ther
18390 65 20 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f  e were FTS5_MIN_
183a0 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f  DLIDX_SIZE or mo
183b0 72 65 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61  re empty leaf pa
183c0 67 65 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  ges written.  **
183d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
183e0 2c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  , also write the
183f0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74   doclist-index t
18400 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66  o disk.  */.  if
18410 28 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  ( pWriter->aDlid
18420 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20  x[0].buf.n>0 && 
18430 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e  pWriter->nEmpty>
18440 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f  =FTS5_MIN_DLIDX_
18450 53 49 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61  SIZE ){.    bFla
18460 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73  g = 1;.  }.  fts
18470 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
18480 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c  (p, pWriter, bFl
18490 61 67 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ag);.  pWriter->
184a0 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65  nEmpty = 0;.  re
184b0 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f  turn bFlag;.}../
184c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
184d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
184e0 6e 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67  never processing
184f0 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
18500 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74  for the .** last
18510 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61   term on leaf pa
18520 67 65 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74  ge (pWriter->iBt
18530 50 61 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74  Page) is complet
18540 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ed. .**.** The d
18550 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
18560 20 74 68 61 74 20 74 65 72 6d 20 69 73 20 63 75   that term is cu
18570 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
18580 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20  n-memory within 
18590 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72  the.** Fts5SegWr
185a0 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72  iter.aDlidx[] ar
185b0 72 61 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61  ray. If it is la
185c0 72 67 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73  rge enough, this
185d0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69   function.** wri
185e0 74 65 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69  tes it out to di
185f0 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73  sk. Or, if it is
18600 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f   too small to bo
18610 74 68 65 72 20 77 69 74 68 2c 20 64 69 73 63 61  ther with, disca
18620 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a  rds.** it..**.**
18630 20 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 62   Fts5SegWriter.b
18640 74 74 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20  tterm currently 
18650 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72  contains the fir
18660 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  st term on page 
18670 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  iBtPage..*/.stat
18680 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
18690 65 46 6c 75 73 68 42 74 72 65 65 28 46 74 73 35  eFlushBtree(Fts5
186a0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
186b0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
186c0 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a  ){.  int bFlag;.
186d0 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
186e0 65 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70  er->iBtPage || p
186f0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d  Writer->nEmpty==
18700 30 20 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74  0 );.  if( pWrit
18710 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29  er->iBtPage==0 )
18720 20 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67   return;.  bFlag
18730 20 3d 20 66 74 73 35 57 72 69 74 65 46 6c 75 73   = fts5WriteFlus
18740 68 44 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65  hDlidx(p, pWrite
18750 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  r);..  if( p->rc
18760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18770 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
18780 20 3d 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74   = (pWriter->btt
18790 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63  erm.n>0?(const c
187a0 68 61 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74  har*)pWriter->bt
187b0 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20  term.p:"");.    
187c0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
187d0 20 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e   was already don
187e0 65 20 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e  e in fts5WriteIn
187f0 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20  it(): */.    /* 
18800 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
18810 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
18820 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
18830 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  id); */.    sqli
18840 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d  te3_bind_blob(p-
18850 3e 70 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20  >pIdxWriter, 2, 
18860 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65  z, pWriter->btte
18870 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  rm.n, SQLITE_STA
18880 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
18890 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
188a0 70 49 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62  pIdxWriter, 3, b
188b0 46 6c 61 67 20 2b 20 28 28 69 36 34 29 70 57 72  Flag + ((i64)pWr
188c0 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31  iter->iBtPage<<1
188d0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
188e0 73 74 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74  step(p->pIdxWrit
188f0 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  er);.    p->rc =
18900 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
18910 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20  ->pIdxWriter);. 
18920 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42   }.  pWriter->iB
18930 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tPage = 0;.}../*
18940 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
18950 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
18960 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70   leaf page excep
18970 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74  t the first that
18980 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20   contains.** at 
18990 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20  least one term. 
189a0 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f  Argument (nTerm/
189b0 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70  pTerm) is the sp
189c0 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d  lit-key - a term
189d0 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
189e0 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d  er than all term
189f0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72  s written to ear
18a00 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64  lier leaves, and
18a10 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20   equal to or.** 
18a20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
18a30 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
18a40 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a  he new leaf..**.
18a50 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
18a60 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
18a70 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
18a80 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66  Fts5Index.rc. If
18a90 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73   an error.** has
18aa0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
18ab0 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
18ac0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
18ad0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
18ae0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18af0 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
18b00 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
18b10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18b20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
18b30 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
18b40 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
18b50 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
18b60 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
18b70 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
18b80 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
18b90 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
18ba0 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20  erm on new page 
18bb0 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74  */.){.  fts5Writ
18bc0 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
18bd0 57 72 69 74 65 72 29 3b 0a 20 20 66 74 73 35 42  Writer);.  fts5B
18be0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
18bf0 20 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72   &pWriter->btter
18c00 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
18c10 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  ;.  pWriter->iBt
18c20 50 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e  Page = pWriter->
18c30 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a  writer.pgno;.}..
18c40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
18c50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
18c60 65 6e 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65  en flushing a le
18c70 61 66 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  af page that con
18c80 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d  tains no.** term
18c90 73 20 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b  s at all to disk
18ca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18cb0 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
18cc0 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  oTerm(.  Fts5Ind
18cd0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
18ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
18cf0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
18d00 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
18d10 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20  er *pWriter     
18d20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
18d30 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  bject */.){.  /*
18d40 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
18d50 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20  o rowids on the 
18d60 6c 65 61 66 20 70 61 67 65 20 65 69 74 68 65 72  leaf page either
18d70 20 61 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74   and the doclist
18d80 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20  -index.  ** has 
18d90 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 61  already been sta
18da0 72 74 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20  rted, append an 
18db0 30 78 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e  0x00 byte to it.
18dc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74    */.  if( pWrit
18dd0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
18de0 6e 50 61 67 65 20 26 26 20 70 57 72 69 74 65 72  nPage && pWriter
18df0 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
18e00 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44  n>0 ){.    Fts5D
18e10 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
18e20 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
18e30 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73  Dlidx[0];.    as
18e40 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50  sert( pDlidx->bP
18e50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  revValid );.    
18e60 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
18e70 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
18e80 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
18e90 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  uf, 0);.  }..  /
18ea0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
18eb0 22 6e 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65  "number of seque
18ec0 6e 74 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74  ntial leaves wit
18ed0 68 6f 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75  hout a term" cou
18ee0 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74  nter. */.  pWrit
18ef0 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a  er->nEmpty++;.}.
18f00 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
18f10 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73  DlidxExtractFirs
18f20 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65  tRowid(Fts5Buffe
18f30 72 20 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20  r *pBuf){.  i64 
18f40 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f  iRowid;.  int iO
18f50 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20  ff;..  iOff = 1 
18f60 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  + fts5GetVarint(
18f70 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36  &pBuf->p[1], (u6
18f80 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66  4*)&iRowid);.  f
18f90 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
18fa0 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  uf->p[iOff], (u6
18fb0 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72  4*)&iRowid);.  r
18fc0 65 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a  eturn iRowid;.}.
18fd0 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f  ./*.** Rowid iRo
18fe0 77 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65  wid has just bee
18ff0 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
19000 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
19010 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a  age. It is the.*
19020 2a 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70  * first on the p
19030 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
19040 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70  on appends an ap
19050 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20  propriate entry 
19060 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  to the current.*
19070 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  * doclist-index.
19080 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19090 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
190a0 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65  pend(.  Fts5Inde
190b0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
190c0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
190d0 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29   .  i64 iRowid.)
190e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
190f0 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66   bDone = 0;..  f
19100 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
19110 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e  QLITE_OK && bDon
19120 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e==0; i++){.    
19130 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74  i64 iVal;.    Ft
19140 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
19150 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
19160 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20  ->aDlidx[i];..  
19170 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
19180 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  f.n>=p->pConfig-
19190 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f  >pgsz ){.      /
191a0 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f  * The current do
191b0 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65  clist-index page
191c0 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20   is full. Write 
191d0 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70  it to disk and p
191e0 75 73 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  ush.      ** a c
191f0 6f 70 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77  opy of iRowid (w
19200 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65  hich will become
19210 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
19220 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20   on the next.   
19230 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e     ** doclist-in
19240 64 65 78 20 6c 65 61 66 20 70 61 67 65 29 20 75  dex leaf page) u
19250 70 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20  p into the next 
19260 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74  level of the b-t
19270 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69  ree .      ** hi
19280 65 72 61 72 63 68 79 2e 20 49 66 20 74 68 65 20  erarchy. If the 
19290 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68  node being flush
192a0 65 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ed is currently 
192b0 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20  the root node,. 
192c0 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73       ** also pus
192d0 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69  h its first rowi
192e0 64 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20  d upwards. */.  
192f0 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e      pDlidx->buf.
19300 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20  p[0] = 0x01;    
19310 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20  /* Not the root 
19320 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74  node */.      ft
19330 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a  s5DataWrite(p, .
19340 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
19350 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74  LIDX_ROWID(pWrit
19360 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
19370 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20  Dlidx->pgno),.  
19380 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e          pDlidx->
19390 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62  buf.p, pDlidx->b
193a0 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20  uf.n.      );.  
193b0 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
193c0 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  dxGrow(p, pWrite
193d0 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70  r, i+2);.      p
193e0 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
193f0 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20  ->aDlidx[i];.   
19400 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
19410 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64  LITE_OK && pDlid
19420 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b  x[1].buf.n==0 ){
19430 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 46 69  .        i64 iFi
19440 72 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45  rst = fts5DlidxE
19450 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64  xtractFirstRowid
19460 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a  (&pDlidx->buf);.
19470 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
19480 20 77 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f   was the root no
19490 64 65 2e 20 50 75 73 68 20 69 74 73 20 66 69 72  de. Push its fir
194a0 73 74 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74  st rowid up to t
194b0 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a  he new root. */.
194c0 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
194d0 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d  ].pgno = pDlidx-
194e0 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73  >pgno;.        s
194f0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
19500 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
19510 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e  >rc, &pDlidx[1].
19520 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
19530 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
19540 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
19550 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
19560 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70  ].buf, pDlidx->p
19570 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  gno);.        sq
19580 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
19590 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
195a0 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
195b0 75 66 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20  uf, iFirst);.   
195c0 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62       pDlidx[1].b
195d0 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
195e0 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
195f0 2e 69 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b  .iPrev = iFirst;
19600 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19610 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
19620 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62  rZero(&pDlidx->b
19630 75 66 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64  uf);.      pDlid
19640 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  x->bPrevValid = 
19650 30 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  0;.      pDlidx-
19660 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >pgno++;.    }el
19670 73 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20  se{.      bDone 
19680 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
19690 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65  if( pDlidx->bPre
196a0 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  vValid ){.      
196b0 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20  iVal = iRowid - 
196c0 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20  pDlidx->iPrev;. 
196d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
196e0 69 36 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d  i64 iPgno = (i==
196f0 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69  0 ? pWriter->wri
19700 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64  ter.pgno : pDlid
19710 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20  x[-1].pgno);.   
19720 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
19730 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20  x->buf.n==0 );. 
19740 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
19750 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
19760 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
19770 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29  dx->buf, !bDone)
19780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
19790 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
197a0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
197b0 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e  Dlidx->buf, iPgn
197c0 6f 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d  o);.      iVal =
197d0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a   iRowid;.    }..
197e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
197f0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
19800 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
19810 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20  x->buf, iVal);. 
19820 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76     pDlidx->bPrev
19830 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70  Valid = 1;.    p
19840 44 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69  Dlidx->iPrev = i
19850 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Rowid;.  }.}..st
19860 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
19870 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73  iteFlushLeaf(Fts
19880 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
19890 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
198a0 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  r){.  static con
198b0 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b  st u8 zero[] = {
198c0 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
198d0 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73  0, 0x00 };.  Fts
198e0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
198f0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
19900 72 69 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f  riter;.  i64 iRo
19910 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  wid;..  assert( 
19920 28 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d  (pPage->pgidx.n=
19930 3d 30 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62  =0)==(pWriter->b
19940 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29  FirstTermInPage)
19950 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
19960 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20  e szLeaf header 
19970 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65  field. */.  asse
19980 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31  rt( 0==fts5GetU1
19990 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
199a0 32 5d 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74  2]) );.  fts5Put
199b0 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
199c0 70 5b 32 5d 2c 20 28 75 31 36 29 70 50 61 67 65  p[2], (u16)pPage
199d0 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28  ->buf.n);..  if(
199e0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
199f0 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20  TermInPage ){.  
19a00 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73    /* No term was
19a10 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
19a20 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
19a30 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 69  sert( pPage->pgi
19a40 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66  dx.n==0 );.    f
19a50 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
19a60 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
19a70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19a80 20 41 70 70 65 6e 64 20 74 68 65 20 70 67 69 64   Append the pgid
19a90 78 20 74 6f 20 74 68 65 20 70 61 67 65 20 62 75  x to the page bu
19aa0 66 66 65 72 2e 20 53 65 74 20 74 68 65 20 73 7a  ffer. Set the sz
19ab0 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c  Leaf header fiel
19ac0 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  d. */.    fts5Bu
19ad0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
19ae0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
19af0 75 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78  uf, pPage->pgidx
19b00 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78  .n, pPage->pgidx
19b10 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  .p);.  }..  /* W
19b20 72 69 74 65 20 74 68 65 20 70 61 67 65 20 6f 75  rite the page ou
19b30 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69  t to disk */.  i
19b40 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
19b50 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74  MENT_ROWID(pWrit
19b60 65 72 2d 3e 69 53 65 67 69 64 2c 20 70 50 61 67  er->iSegid, pPag
19b70 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35  e->pgno);.  fts5
19b80 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f  DataWrite(p, iRo
19b90 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  wid, pPage->buf.
19ba0 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  p, pPage->buf.n)
19bb0 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
19bc0 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ze the next page
19bd0 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
19be0 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75  rZero(&pPage->bu
19bf0 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  f);.  fts5Buffer
19c00 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70 67 69  Zero(&pPage->pgi
19c10 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  dx);.  fts5Buffe
19c20 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
19c30 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
19c40 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61   4, zero);.  pPa
19c50 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d  ge->iPrevPgidx =
19c60 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e   0;.  pPage->pgn
19c70 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  o++;..  /* Incre
19c80 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20 77  ase the leaves w
19c90 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a  ritten counter *
19ca0 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  /.  pWriter->nLe
19cb0 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20  afWritten++;..  
19cc0 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20  /* The new leaf 
19cd0 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f  holds no terms o
19ce0 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57  r rowids */.  pW
19cf0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
19d00 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70  mInPage = 1;.  p
19d10 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
19d20 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d  widInPage = 1;.}
19d30 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
19d40 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
19d50 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
19d60 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20  eing written by 
19d70 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65  the writer passe
19d80 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f  d.** as the seco
19d90 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
19da0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
19db0 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
19dc0 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
19dd0 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
19de0 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
19df0 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
19e00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
19e10 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
19e20 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
19e30 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74  AppendTerm(.  Ft
19e40 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
19e50 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
19e60 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65  riter,.  int nTe
19e70 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  rm, const u8 *pT
19e80 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  erm .){.  int nP
19e90 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
19ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
19eb0 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
19ec0 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72  pression for ter
19ed0 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  m */.  Fts5PageW
19ee0 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
19ef0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
19f00 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
19f10 50 67 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Pgidx = &pWriter
19f20 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a  ->writer.pgidx;.
19f30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
19f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
19f50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
19f60 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73  buf.n>=4 );.  as
19f70 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66  sert( pPage->buf
19f80 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72 2d  .n>4 || pWriter-
19f90 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
19fa0 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e );..  /* If th
19fb0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
19fc0 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75  age is full, flu
19fd0 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a  sh it to disk. *
19fe0 2f 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e  /.  if( (pPage->
19ff0 62 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  buf.n + pPgidx->
1a000 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d  n + nTerm + 2)>=
1a010 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1a020 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1a030 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  e->buf.n>4 ){.  
1a040 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1a050 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
1a060 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  r);.    }.    ft
1a070 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1a080 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1a090 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54  , nTerm+FTS5_DAT
1a0a0 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a  A_PADDING);.  }.
1a0b0 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55    .  /* TODO1: U
1a0c0 70 64 61 74 69 6e 67 20 70 67 69 64 78 20 68 65  pdating pgidx he
1a0d0 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d  re. */.  pPgidx-
1a0e0 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
1a0f0 35 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20  5PutVarint(.    
1a100 20 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67    &pPgidx->p[pPg
1a110 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e  idx->n], pPage->
1a120 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69  buf.n - pPage->i
1a130 50 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20  PrevPgidx.  );. 
1a140 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69   pPage->iPrevPgi
1a150 64 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e  dx = pPage->buf.
1a160 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50  n;.#if 0.  fts5P
1a170 75 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70  utU16(&pPgidx->p
1a180 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61  [pPgidx->n], pPa
1a190 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50  ge->buf.n);.  pP
1a1a0 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65  gidx->n += 2;.#e
1a1b0 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69  ndif..  if( pWri
1a1c0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1a1d0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72  nPage ){.    nPr
1a1e0 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66  efix = 0;.    if
1a1f0 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31  ( pPage->pgno!=1
1a200 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1a210 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1a220 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68  erm on a leaf th
1a230 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65  at is not the le
1a240 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20  ftmost leaf in. 
1a250 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d       ** the segm
1a260 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74  ent b-tree. In t
1a270 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
1a280 65 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20  ecessary to add 
1a290 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20  a term to.      
1a2a0 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  ** the b-tree hi
1a2b0 65 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20  erarchy that is 
1a2c0 28 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20  (a) larger than 
1a2d0 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d  the largest term
1a2e0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61   .      ** alrea
1a2f0 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
1a300 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62  e segment and (b
1a310 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  ) smaller than o
1a320 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20  r equal to.     
1a330 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49   ** this term. I
1a340 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
1a350 20 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72   prefix of (pTer
1a360 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73  m/nTerm) that is
1a370 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79   one.      ** by
1a380 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74  te longer than t
1a390 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69  he longest prefi
1a3a0 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  x (pTerm/nTerm) 
1a3b0 73 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a  shares with the.
1a3c0 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
1a3d0 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a  s term. .      *
1a3e0 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c  *.      ** Usual
1a3f0 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73  ly, the previous
1a400 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62   term is availab
1a410 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72  le in pPage->ter
1a420 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  m. The exception
1a430 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20  .      ** is if 
1a440 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1a450 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69  t term written i
1a460 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n an incremental
1a470 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20  -merge step..   
1a480 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
1a490 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
1a4a0 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69  term is not avai
1a4b0 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77  lable, so just w
1a4c0 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  rite a.      ** 
1a4d0 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e  copy of (pTerm/n
1a4e0 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70  Term) into the p
1a4f0 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73  arent node. This
1a500 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   is slightly.   
1a510 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e     ** inefficien
1a520 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72  t, but still cor
1a530 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rect.  */.      
1a540 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20  int n = nTerm;. 
1a550 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1a560 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20  term.n ){.      
1a570 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72    n = 1 + fts5Pr
1a580 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61  efixCompress(pPa
1a590 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67  ge->term.n, pPag
1a5a0 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d  e->term.p, nTerm
1a5b0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1a5c0 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  }.      fts5Writ
1a5d0 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57  eBtreeTerm(p, pW
1a5e0 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29  riter, n, pTerm)
1a5f0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1a600 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1a610 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1a620 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66  .    nPrefix = f
1a630 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
1a640 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c  s(pPage->term.n,
1a650 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
1a660 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1a670 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1a680 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1a690 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1a6a0 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20  Prefix);.  }..  
1a6b0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75  /* Append the nu
1a6c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1a6d0 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20   new data, then 
1a6e0 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74  the term data it
1a6f0 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65  self.  ** to the
1a700 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
1a710 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1a720 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1a730 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
1a740 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35  nPrefix);.  fts5
1a750 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1a760 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1a770 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50  >buf, nTerm - nP
1a780 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50  refix, &pTerm[nP
1a790 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55  refix]);..  /* U
1a7a0 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61  pdate the Fts5Pa
1a7b0 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69  geWriter.term fi
1a7c0 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  eld. */.  fts5Bu
1a7d0 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1a7e0 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54  &pPage->term, nT
1a7f0 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70  erm, pTerm);.  p
1a800 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1a810 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20  rmInPage = 0;.. 
1a820 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1a830 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
1a840 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1a850 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
1a860 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
1a870 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74   p->rc || (pWrit
1a880 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20  er->nDlidx>0 && 
1a890 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1a8a0 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a  0].buf.n==0) );.
1a8b0 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
1a8c0 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67  x[0].pgno = pPag
1a8d0 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  e->pgno;.}../*.*
1a8e0 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69 64  * Append a rowid
1a8f0 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   and position-li
1a900 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f  st size field to
1a910 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74   the writers out
1a920 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  put. .*/.static 
1a930 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1a940 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73  pendRowid(.  Fts
1a950 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1a960 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1a970 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77  iter,.  i64 iRow
1a980 69 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  id.){.  if( p->r
1a990 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a9a0 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
1a9b0 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
1a9c0 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20  iter->writer;.. 
1a9d0 20 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62     if( (pPage->b
1a9e0 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67  uf.n + pPage->pg
1a9f0 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66  idx.n)>=p->pConf
1aa00 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
1aa10 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1aa20 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1aa30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1aa40 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65  If this is to be
1aa50 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
1aa60 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1aa70 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20  page, set the . 
1aa80 20 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e     ** rowid-poin
1aa90 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d  ter in the page-
1aaa0 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70  header. Also app
1aab0 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74  end a value to t
1aac0 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20  he dlidx.    ** 
1aad0 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20  buffer, in case 
1aae0 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
1aaf0 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  is required.  */
1ab00 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
1ab10 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1ab20 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73  age ){.      fts
1ab30 35 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62  5PutU16(pPage->b
1ab40 75 66 2e 70 2c 20 28 75 31 36 29 70 50 61 67 65  uf.p, (u16)pPage
1ab50 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  ->buf.n);.      
1ab60 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
1ab70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c  pend(p, pWriter,
1ab80 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a   iRowid);.    }.
1ab90 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
1aba0 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20  e rowid. */.    
1abb0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1abc0 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
1abd0 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  t || pWriter->bF
1abe0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1abf0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
1ac00 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1ac10 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1ac20 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  buf, iRowid);.  
1ac30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1ac40 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
1ac50 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e  iRowid>pWriter->
1ac60 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20  iPrevRowid );.  
1ac70 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1ac80 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1ac90 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1aca0 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72  iRowid - pWriter
1acb0 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20  ->iPrevRowid);. 
1acc0 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72     }.    pWriter
1acd0 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69  ->iPrevRowid = i
1ace0 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74  Rowid;.    pWrit
1acf0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1ad00 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20  nDoclist = 0;.  
1ad10 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1ad20 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
1ad30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1ad40 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1ad50 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
1ad60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1ad70 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1ad80 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63  r *pWriter, .  c
1ad90 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20  onst u8 *aData, 
1ada0 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a  .  int nData.){.
1adb0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1adc0 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
1add0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f  er->writer;.  co
1ade0 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74  nst u8 *a = aDat
1adf0 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61  a;.  int n = nDa
1ae00 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  ta;.  .  assert(
1ae10 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1ae20 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  z>0 );.  while( 
1ae30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ae40 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
1ae50 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d  ->buf.n + pPage-
1ae60 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70  >pgidx.n + n)>=p
1ae70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1ae80 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52  .  ){.    int nR
1ae90 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  eq = p->pConfig-
1aea0 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62  >pgsz - pPage->b
1aeb0 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67  uf.n - pPage->pg
1aec0 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  idx.n;.    int n
1aed0 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68  Copy = 0;.    wh
1aee0 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20  ile( nCopy<nReq 
1aef0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d  ){.      i64 dum
1af00 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20  my;.      nCopy 
1af10 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
1af20 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34  (&a[nCopy], (u64
1af30 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d  *)&dummy);.    }
1af40 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1af50 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1af60 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1af70 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20  Copy, a);.    a 
1af80 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20  += nCopy;.    n 
1af90 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74  -= nCopy;.    ft
1afa0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1afb0 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1afc0 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
1afd0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1afe0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1aff0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20  &pPage->buf, n, 
1b000 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
1b010 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
1b020 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72  cached by the wr
1b030 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  iter object to t
1b040 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65  he database. Fre
1b050 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e any.** allocat
1b060 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
1b070 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e  with the writer.
1b080 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b090 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
1b0a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1b0b0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1b0c0 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
1b0d0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
1b0e0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
1b0f0 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  nLeaf           
1b100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1b110 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  : Number of leaf
1b120 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65   pages in b-tree
1b130 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1b140 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1b150 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74   *pLeaf = &pWrit
1b160 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66  er->writer;.  if
1b170 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b180 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1b190 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31  ( pLeaf->pgno>=1
1b1a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61   );.    if( pLea
1b1b0 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  f->buf.n>4 ){.  
1b1c0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1b1d0 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
1b1e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  r);.    }.    *p
1b1f0 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70  nLeaf = pLeaf->p
1b200 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 57  gno-1;.    fts5W
1b210 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 70  riteFlushBtree(p
1b220 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
1b230 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1b240 28 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a  (&pLeaf->term);.
1b250 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1b260 28 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20  (&pLeaf->buf);. 
1b270 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1b280 26 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a  &pLeaf->pgidx);.
1b290 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1b2a0 28 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72  (&pWriter->btter
1b2b0 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  m);..  for(i=0; 
1b2c0 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
1b2d0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  x; i++){.    sql
1b2e0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
1b2f0 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c  ee(&pWriter->aDl
1b300 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d  idx[i].buf);.  }
1b310 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1b320 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29  pWriter->aDlidx)
1b330 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1b340 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a   fts5WriteInit(.
1b350 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1b360 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1b370 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e   *pWriter, .  in
1b380 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f  t iSegid.){.  co
1b390 6e 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72 20  nst int nBuffer 
1b3a0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
1b3b0 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  sz + FTS5_DATA_P
1b3c0 41 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65  ADDING;..  memse
1b3d0 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69  t(pWriter, 0, si
1b3e0 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74  zeof(Fts5SegWrit
1b3f0 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  er));.  pWriter-
1b400 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1b410 3b 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c  ;..  fts5WriteDl
1b420 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74  idxGrow(p, pWrit
1b430 65 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65  er, 1);.  pWrite
1b440 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d  r->writer.pgno =
1b450 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
1b460 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
1b470 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
1b480 69 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20  iBtPage = 1;..  
1b490 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d  assert( pWriter-
1b4a0 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30  >writer.buf.n==0
1b4b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
1b4c0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67  riter->writer.pg
1b4d0 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f  idx.n==0 );..  /
1b4e0 2a 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20 62  * Grow the two b
1b4f0 75 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20 2b  uffers to pgsz +
1b500 20 70 61 64 64 69 6e 67 20 62 79 74 65 73 20 69   padding bytes i
1b510 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c  n size. */.  sql
1b520 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
1b530 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  ze(&p->rc, &pWri
1b540 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64  ter->writer.pgid
1b550 78 2c 20 6e 42 75 66 66 65 72 29 3b 0a 20 20 73  x, nBuffer);.  s
1b560 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1b570 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57  Size(&p->rc, &pW
1b580 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75  riter->writer.bu
1b590 66 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20  f, nBuffer);..  
1b5a0 69 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65  if( p->pIdxWrite
1b5b0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  r==0 ){.    Fts5
1b5c0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
1b5d0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
1b5e0 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
1b5f0 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49  reStmt(p, &p->pI
1b600 64 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65  dxWriter, sqlite
1b610 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
1b620 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1b630 4f 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28  O '%q'.'%q_idx'(
1b640 73 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29  segid,term,pgno)
1b650 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c   VALUES(?,?,?)",
1b660 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
1b670 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
1b680 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
1b690 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
1b6a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b6b0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1b6c0 65 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65 61  e the 4-byte lea
1b6d0 66 2d 70 61 67 65 20 68 65 61 64 65 72 20 74 6f  f-page header to
1b6e0 20 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65   0x00. */.    me
1b6f0 6d 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77 72  mset(pWriter->wr
1b700 69 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34  iter.buf.p, 0, 4
1b710 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  );.    pWriter->
1b720 77 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34  writer.buf.n = 4
1b730 3b 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20 74  ;..    /* Bind t
1b740 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75  he current outpu
1b750 74 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f 20  t segment id to 
1b760 74 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65 72  the index-writer
1b770 2e 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20 20  . This is an.   
1b780 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   ** optimization
1b790 20 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74 68   over binding th
1b7a0 65 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76 65  e same value ove
1b7b0 72 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72 6f  r and over as ro
1b7c0 77 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e  ws are.    ** in
1b7d0 73 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69 64  serted into %_id
1b7e0 78 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  x by the current
1b7f0 20 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20   writer.  */.   
1b800 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1b810 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c  t(p->pIdxWriter,
1b820 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65   1, pWriter->iSe
1b830 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gid);.  }.}../*.
1b840 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
1b850 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74  r was used to it
1b860 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
1b870 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  e input segments
1b880 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63   of on an.** inc
1b890 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f  remental merge o
1b8a0 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66  peration. This f
1b8b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1b8c0 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65  d if the increme
1b8d0 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74  ntal.** merge st
1b8e0 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ep has finished 
1b8f0 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61  but the input ha
1b900 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c  s not been compl
1b910 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e  etely exhausted.
1b920 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b930 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
1b940 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
1b950 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
1b960 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ter){.  int i;. 
1b970 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
1b980 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20  .  memset(&buf, 
1b990 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
1b9a0 66 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d  ffer));.  for(i=
1b9b0 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
1b9c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
1b9d0 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
1b9e0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
1b9f0 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
1ba00 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Seg==0 ){.      
1ba10 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
1ba20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e  }else if( pSeg->
1ba30 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
1ba40 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72    /* All keys fr
1ba50 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 65  om this input se
1ba60 67 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20  gment have been 
1ba70 74 72 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68  transfered to th
1ba80 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  e output..      
1ba90 2a 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65 20  ** Set both the 
1baa0 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70  first and last p
1bab0 61 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30  age-numbers to 0
1bac0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1bad0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  t the.      ** s
1bae0 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d  egment is now em
1baf0 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53  pty. */.      pS
1bb00 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  eg->pSeg->pgnoLa
1bb10 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  st = 0;.      pS
1bb20 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eg->pSeg->pgnoFi
1bb30 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rst = 0;.    }el
1bb40 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f  se{.      int iO
1bb50 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d  ff = pSeg->iTerm
1bb60 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20  LeafOffset;     
1bb70 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77  /* Offset on new
1bb80 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65   first leaf page
1bb90 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c   */.      i64 iL
1bba0 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  eafRowid;.      
1bbb0 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
1bbc0 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d  .      int iId =
1bbd0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65   pSeg->pSeg->iSe
1bbe0 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48  gid;.      u8 aH
1bbf0 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30  dr[4] = {0x00, 0
1bc00 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d  x00, 0x00, 0x00}
1bc10 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f  ;..      iLeafRo
1bc20 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
1bc30 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53  NT_ROWID(iId, pS
1bc40 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  eg->iTermLeafPgn
1bc50 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20  o);.      pData 
1bc60 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
1bc70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  , iLeafRowid);. 
1bc80 20 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29       if( pData )
1bc90 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
1bca0 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a  fferZero(&buf);.
1bcb0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1bcc0 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26  erGrow(&p->rc, &
1bcd0 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b  buf, pData->nn);
1bce0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1bcf0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1bd00 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65  ->rc, &buf, size
1bd10 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b  of(aHdr), aHdr);
1bd20 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1bd30 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1bd40 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
1bd50 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  eg->term.n);.   
1bd60 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1bd70 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1bd80 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
1bd90 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d  rm.n, pSeg->term
1bda0 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .p);.        fts
1bdb0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1bdc0 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
1bdd0 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f  pData->szLeaf-iO
1bde0 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f  ff, &pData->p[iO
1bdf0 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ff]);.        if
1be00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1be10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1be20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  /* Set the szLea
1be30 66 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20  f field */.     
1be40 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28       fts5PutU16(
1be50 26 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29  &buf.p[2], (u16)
1be60 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  buf.n);.        
1be70 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  }..        /* Se
1be80 74 20 75 70 20 74 68 65 20 6e 65 77 20 70 61 67  t up the new pag
1be90 65 2d 69 6e 64 65 78 20 61 72 72 61 79 20 2a 2f  e-index array */
1bea0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1beb0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1bec0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29  &p->rc, &buf, 4)
1bed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
1bee0 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70  eg->iLeafPgno==p
1bef0 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
1bf00 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  no .         && 
1bf10 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  pSeg->iEndofDocl
1bf20 69 73 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61  ist<pData->szLea
1bf30 66 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  f .        ){.  
1bf40 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 69 66          int nDif
1bf50 66 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61  f = pData->szLea
1bf60 66 20 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66  f - pSeg->iEndof
1bf70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20  Doclist;.       
1bf80 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1bf90 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1bfa0 2c 20 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20  , &buf, buf.n - 
1bfb0 31 20 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a  1 - nDiff - 4);.
1bfc0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1bfd0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1bfe0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20 20  p->rc, &buf, .  
1bff0 20 20 20 20 20 20 20 20 20 20 20 20 70 44 61 74              pDat
1c000 61 2d 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50  a->nn - pSeg->iP
1c010 67 69 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d  gidxOff, &pData-
1c020 3e 70 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f  >p[pSeg->iPgidxO
1c030 66 66 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ff].          );
1c040 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1c050 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
1c060 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
1c070 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
1c080 70 67 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67  pgnoFirst = pSeg
1c090 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  ->iTermLeafPgno;
1c0a0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
1c0b0 61 44 65 6c 65 74 65 28 70 2c 20 46 54 53 35 5f  aDelete(p, FTS5_
1c0c0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1c0d0 64 2c 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69  d, 1), iLeafRowi
1c0e0 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
1c0f0 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65  DataWrite(p, iLe
1c100 61 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20  afRowid, buf.p, 
1c110 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  buf.n);.      }.
1c120 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35      }.  }.  fts5
1c130 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
1c140 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1c150 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43   fts5MergeChunkC
1c160 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
1c170 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64  ndex *p, .  void
1c180 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74   *pCtx, .  const
1c190 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74   u8 *pChunk, int
1c1a0 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73   nChunk.){.  Fts
1c1b0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1c1c0 74 65 72 20 3d 20 28 46 74 73 35 53 65 67 57 72  ter = (Fts5SegWr
1c1d0 69 74 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74  iter*)pCtx;.  ft
1c1e0 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
1c1f0 6c 69 73 74 44 61 74 61 28 70 2c 20 70 57 72 69  listData(p, pWri
1c200 74 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  ter, pChunk, nCh
1c210 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  unk);.}../*.**.*
1c220 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1c230 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
1c240 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  l(.  Fts5Index *
1c250 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1c260 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1c270 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1c280 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1c290 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
1c2a0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63   /* IN/OUT: Stuc
1c2b0 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
1c2c0 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20  .  int iLvl,    
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2e0 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72     /* Level to r
1c2f0 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a  ead input from *
1c300 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20  /.  int *pnRem  
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20      /* Write up 
1c330 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74  to this many out
1c340 70 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b  put leaves */.){
1c350 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1c360 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
1c370 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72  truct;.  Fts5Str
1c380 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
1c390 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
1c3a0 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74  evel[iLvl];.  Ft
1c3b0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
1c3c0 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73   *pLvlOut;.  Fts
1c3d0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
1c3e0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
1c3f0 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64  Iterator to read
1c400 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20   input data */. 
1c410 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65   int nRem = pnRe
1c420 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20  m ? *pnRem : 0; 
1c430 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20   /* Output leaf 
1c440 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72  pages left to wr
1c450 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  ite */.  int nIn
1c460 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  put;            
1c470 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c480 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
1c490 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65  ents */.  Fts5Se
1c4a0 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
1c4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1c4c0 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
1c4d0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1c4e0 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
1c4f0 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e  /* Output segmen
1c500 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
1c510 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f  r term;.  int bO
1c520 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  ldest;          
1c530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c540 65 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  e if the output 
1c550 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f  segment is the o
1c560 6c 64 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ldest */.  int e
1c570 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
1c580 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 0a 20  fig->eDetail;.. 
1c590 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53   assert( iLvl<pS
1c5a0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b  truct->nLevel );
1c5b0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d  .  assert( pLvl-
1c5c0 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
1c5d0 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  Seg );..  memset
1c5e0 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
1c5f0 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
1c600 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74  r));.  memset(&t
1c610 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
1c620 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
1c630 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
1c640 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d  ){.    pLvlOut =
1c650 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1c660 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61  l[iLvl+1];.    a
1c670 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e  ssert( pLvlOut->
1c680 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49  nSeg>0 );.    nI
1c690 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65  nput = pLvl->nMe
1c6a0 72 67 65 3b 0a 20 20 20 20 70 53 65 67 20 3d 20  rge;.    pSeg = 
1c6b0 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
1c6c0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b  LvlOut->nSeg-1];
1c6d0 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ..    fts5WriteI
1c6e0 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
1c6f0 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
1c700 20 20 20 77 72 69 74 65 72 2e 77 72 69 74 65 72     writer.writer
1c710 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67  .pgno = pSeg->pg
1c720 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 77 72  noLast+1;.    wr
1c730 69 74 65 72 2e 69 42 74 50 61 67 65 20 3d 20 30  iter.iBtPage = 0
1c740 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c750 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74 73 35  nt iSegid = fts5
1c760 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c  AllocateSegid(p,
1c770 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 20 20   pStruct);..    
1c780 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20 46 74  /* Extend the Ft
1c790 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
1c7a0 63 74 20 61 73 20 72 65 71 75 69 72 65 64 20 74  ct as required t
1c7b0 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f 75 74  o ensure the out
1c7c0 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  put.    ** segme
1c7d0 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  nt exists. */.  
1c7e0 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72    if( iLvl==pStr
1c7f0 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b  uct->nLevel-1 ){
1c800 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
1c810 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d  tureAddLevel(&p-
1c820 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29 3b 0a  >rc, ppStruct);.
1c830 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20        pStruct = 
1c840 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d  *ppStruct;.    }
1c850 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1c860 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
1c870 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69  ->rc, pStruct, i
1c880 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20  Lvl+1, 1, 0);.  
1c890 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
1c8a0 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d  turn;.    pLvl =
1c8b0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1c8c0 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76  l[iLvl];.    pLv
1c8d0 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d  lOut = &pStruct-
1c8e0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b  >aLevel[iLvl+1];
1c8f0 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ..    fts5WriteI
1c900 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
1c910 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a  iSegid);..    /*
1c920 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65 67   Add the new seg
1c930 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 70  ment to the outp
1c940 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
1c950 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d  pSeg = &pLvlOut-
1c960 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
1c970 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75  Seg];.    pLvlOu
1c980 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70  t->nSeg++;.    p
1c990 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
1c9a0 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69 53   1;.    pSeg->iS
1c9b0 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
1c9c0 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1c9d0 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  ment++;..    /* 
1c9e0 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  Read input from 
1c9f0 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
1ca00 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20  the input level 
1ca10 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20  */.    nInput = 
1ca20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a  pLvl->nSeg;.  }.
1ca30 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76    bOldest = (pLv
1ca40 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26  lOut->nSeg==1 &&
1ca50 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1ca60 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61 73  ==iLvl+2);..  as
1ca70 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30 20 29 3b  sert( iLvl>=0 );
1ca80 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69  .  for(fts5Multi
1ca90 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75  IterNew(p, pStru
1caa0 63 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ct, 0, 0, 0, 0, 
1cab0 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70  iLvl, nInput, &p
1cac0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
1cad0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
1cae0 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
1caf0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
1cb00 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
1cb10 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73   0).  ){.    Fts
1cb20 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 49 74  5SegIter *pSegIt
1cb30 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  er = &pIter->aSe
1cb40 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1cb50 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
1cb60 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20    int nPos;     
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb80 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  /* position-list
1cb90 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61 6c 75   size field valu
1cba0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65  e */.    int nTe
1cbb0 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38  rm;.    const u8
1cbc0 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a   *pTerm;..    /*
1cbd0 20 43 68 65 63 6b 20 66 6f 72 20 6b 65 79 20 61   Check for key a
1cbe0 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a  nnihilation. */.
1cbf0 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72      if( pSegIter
1cc00 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f  ->nPos==0 && (bO
1cc10 6c 64 65 73 74 20 7c 7c 20 70 53 65 67 49 74 65  ldest || pSegIte
1cc20 72 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f  r->bDel==0) ) co
1cc30 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 54 65  ntinue;..    pTe
1cc40 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  rm = fts5MultiIt
1cc50 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e  erTerm(pIter, &n
1cc60 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e  Term);.    if( n
1cc70 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20  Term!=term.n || 
1cc80 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65  memcmp(pTerm, te
1cc90 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a  rm.p, nTerm) ){.
1cca0 20 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d 20        if( pnRem 
1ccb0 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57  && writer.nLeafW
1ccc0 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20  ritten>nRem ){. 
1ccd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1cce0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1ccf0 54 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65  This is a new te
1cd00 72 6d 2e 20 41 70 70 65 6e 64 20 61 20 74 65 72  rm. Append a ter
1cd10 6d 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  m to the output 
1cd20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  segment. */.    
1cd30 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
1cd40 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72  dTerm(p, &writer
1cd50 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
1cd60 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1cd70 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65  rSet(&p->rc, &te
1cd80 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
1cd90 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1cda0 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f 77 69   Append the rowi
1cdb0 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
1cdc0 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49 54 45 50  */.    /* WRITEP
1cdd0 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20  OSLISTSIZE */.  
1cde0 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
1cdf0 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74 65  dRowid(p, &write
1ce00 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r, fts5MultiIter
1ce10 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b 0a 0a  Rowid(pIter));..
1ce20 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d      if( eDetail=
1ce30 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
1ce40 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
1ce50 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 20 29 7b  SegIter->bDel ){
1ce60 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1ce70 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1ce80 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e  &p->rc, &writer.
1ce90 77 72 69 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a  writer.buf, 0);.
1cea0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67          if( pSeg
1ceb0 49 74 65 72 2d 3e 6e 50 6f 73 3e 30 20 29 7b 0a  Iter->nPos>0 ){.
1cec0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1ced0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1cee0 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72  (&p->rc, &writer
1cef0 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30 29 3b  .writer.buf, 0);
1cf00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cf10 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1cf20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
1cf30 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
1cf40 64 61 74 61 20 74 6f 20 74 68 65 20 6f 75 74 70  data to the outp
1cf50 75 74 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73  ut */.      nPos
1cf60 20 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f   = pSegIter->nPo
1cf70 73 2a 32 20 2b 20 70 53 65 67 49 74 65 72 2d 3e  s*2 + pSegIter->
1cf80 62 44 65 6c 3b 0a 20 20 20 20 20 20 66 74 73 35  bDel;.      fts5
1cf90 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1cfa0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74  nt(&p->rc, &writ
1cfb0 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e  er.writer.buf, n
1cfc0 50 6f 73 29 3b 0a 20 20 20 20 20 20 66 74 73 35  Pos);.      fts5
1cfd0 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20  ChunkIterate(p, 
1cfe0 70 53 65 67 49 74 65 72 2c 20 28 76 6f 69 64 2a  pSegIter, (void*
1cff0 29 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 65  )&writer, fts5Me
1d000 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b  rgeChunkCallback
1d010 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d020 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73  /* Flush the las
1d030 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64  t leaf page to d
1d040 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74  isk. Set the out
1d050 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  put segment b-tr
1d060 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61  ee height.  ** a
1d070 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  nd last leaf pag
1d080 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20  e number at the 
1d090 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20  same time.  */. 
1d0a0 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
1d0b0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53  (p, &writer, &pS
1d0c0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  eg->pgnoLast);..
1d0d0 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
1d0e0 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1d0f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a   ){.    int i;..
1d100 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
1d110 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d  e redundant segm
1d120 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f  ents from the %_
1d130 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
1d140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e    for(i=0; i<nIn
1d150 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  put; i++){.     
1d160 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53   fts5DataRemoveS
1d170 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e  egment(p, pLvl->
1d180 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b  aSeg[i].iSegid);
1d190 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1d1a0 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64  emove the redund
1d1b0 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  ant segments fro
1d1c0 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65  m the input leve
1d1d0 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76  l */.    if( pLv
1d1e0 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20  l->nSeg!=nInput 
1d1f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f  ){.      int nMo
1d200 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67  ve = (pLvl->nSeg
1d210 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a   - nInput) * siz
1d220 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1d230 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20  eSegment);.     
1d240 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61   memmove(pLvl->a
1d250 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Seg, &pLvl->aSeg
1d260 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29  [nInput], nMove)
1d270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72  ;.    }.    pStr
1d280 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d  uct->nSegment -=
1d290 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76   nInput;.    pLv
1d2a0 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75  l->nSeg -= nInpu
1d2b0 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65  t;.    pLvl->nMe
1d2c0 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rge = 0;.    if(
1d2d0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d   pSeg->pgnoLast=
1d2e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c  =0 ){.      pLvl
1d2f0 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20  Out->nSeg--;.   
1d300 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1d310 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ment--;.    }.  
1d320 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1d330 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  t( pSeg->pgnoLas
1d340 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54  t>0 );.    fts5T
1d350 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70  rimSegments(p, p
1d360 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  Iter);.    pLvl-
1d370 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74  >nMerge = nInput
1d380 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c  ;.  }..  fts5Mul
1d390 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 49  tiIterFree(p, pI
1d3a0 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66  ter);.  fts5Buff
1d3b0 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
1d3c0 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e   if( pnRem ) *pn
1d3d0 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c  Rem -= writer.nL
1d3e0 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f  eafWritten;.}../
1d3f0 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50  *.** Do up to nP
1d400 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d  g pages of autom
1d410 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65  erge work on the
1d420 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
1d430 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1d440 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  Merge(.  Fts5Ind
1d450 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1d460 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1d470 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1d480 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1d490 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
1d4a0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1d4b0 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
1d4c0 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
1d4d0 69 6e 74 20 6e 50 67 20 20 20 20 20 20 20 20 20  int nPg         
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4f0 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b  /* Pages of work
1d500 20 74 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20 69   to do */.){.  i
1d510 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20  nt nRem = nPg;. 
1d520 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1d530 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1d540 75 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52  uct;.  while( nR
1d550 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53  em>0 && p->rc==S
1d560 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d570 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
1d580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d590 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1d5a0 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20  h levels */.    
1d5b0 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30  int iBestLvl = 0
1d5c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
1d5d0 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68  evel offering th
1d5e0 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67  e most input seg
1d5f0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
1d600 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20   nBest = 0;     
1d610 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d620 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
1d630 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76  ents on best lev
1d640 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  el */..    /* Se
1d650 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68  t iBestLvl to th
1d660 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  e level to read 
1d670 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66  input segments f
1d680 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  rom. */.    asse
1d690 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  rt( pStruct->nLe
1d6a0 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72  vel>0 );.    for
1d6b0 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1d6c0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1d6d0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
1d6e0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
1d6f0 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
1d700 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
1d710 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
1d720 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  >nMerge ){.     
1d730 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
1d740 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  rge>nBest ){.   
1d750 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20         iBestLvl 
1d760 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20  = iLvl;.        
1d770 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e    nBest = pLvl->
1d780 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20  nMerge;.        
1d790 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1d7a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1d7b0 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42  f( pLvl->nSeg>nB
1d7c0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  est ){.        n
1d7d0 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  Best = pLvl->nSe
1d7e0 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74  g;.        iBest
1d7f0 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
1d800 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d810 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74  * If nBest is st
1d820 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20  ill 0, then the 
1d830 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d  index must be em
1d840 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  pty. */.#ifdef S
1d850 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1d860 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73  for(iLvl=0; nBes
1d870 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74  t==0 && iLvl<pSt
1d880 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
1d890 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  vl++){.      ass
1d8a0 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c  ert( pStruct->aL
1d8b0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d  evel[iLvl].nSeg=
1d8c0 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  =0 );.    }.#end
1d8d0 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73  if..    if( nBes
1d8e0 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  t<p->pConfig->nA
1d8f0 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20 20  utomerge .      
1d900 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c    && pStruct->aL
1d910 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e  evel[iBestLvl].n
1d920 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20 20 20 20  Merge==0 .      
1d930 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
1d940 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e      }.    fts5In
1d950 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
1d960 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74   &pStruct, iBest
1d970 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
1d980 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1d990 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74  TE_OK && pStruct
1d9a0 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76  ->aLevel[iBestLv
1d9b0 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  l].nMerge==0 ){.
1d9c0 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
1d9d0 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42  urePromote(p, iB
1d9e0 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  estLvl+1, pStruc
1d9f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1da00 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
1da10 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  uct;.}../*.** A 
1da20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c  total of nLeaf l
1da30 65 61 66 20 70 61 67 65 73 20 6f 66 20 64 61 74  eaf pages of dat
1da40 61 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  a has just been 
1da50 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76  flushed to a lev
1da60 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e  el-0.** segment.
1da70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   This function u
1da80 70 64 61 74 65 73 20 74 68 65 20 77 72 69 74 65  pdates the write
1da90 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69  -counter accordi
1daa0 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20  ngly and, if.** 
1dab0 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f  necessary, perfo
1dac0 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  rms incremental 
1dad0 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a  merge work..**.*
1dae0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1daf0 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
1db00 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
1db10 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
1db20 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
1db30 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
1db40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1db50 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1db60 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41   void fts5IndexA
1db70 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35  utomerge(.  Fts5
1db80 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1db90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1dba0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1dbb0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
1dbc0 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
1dbd0 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
1dbe0 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
1dbf0 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
1dc00 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20  .  int nLeaf    
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1dc30 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75  output leaves ju
1dc40 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b  st written */.){
1dc50 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1dc60 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43  LITE_OK && p->pC
1dc70 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67  onfig->nAutomerg
1dc80 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53  e>0 ){.    Fts5S
1dc90 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1dca0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1dcb0 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20     u64 nWrite;  
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
1dce0 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74  e of write-count
1dcf0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57  er */.    int nW
1dd00 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ork;            
1dd10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1dd20 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61  r of work-quanta
1dd30 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20   to perform */. 
1dd40 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20     int nRem;    
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
1dd70 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f  af pages left to
1dd80 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f   write */..    /
1dd90 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69  * Update the wri
1dda0 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c  te-counter. Whil
1ddb0 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20  e doing so, set 
1ddc0 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57  nWork. */.    nW
1ddd0 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e  rite = pStruct->
1dde0 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
1ddf0 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29     nWork = (int)
1de00 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61  (((nWrite + nLea
1de10 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  f) / p->nWorkUni
1de20 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70  t) - (nWrite / p
1de30 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20  ->nWorkUnit));. 
1de40 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69     pStruct->nWri
1de50 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65  teCounter += nLe
1de60 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28  af;.    nRem = (
1de70 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69  int)(p->nWorkUni
1de80 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72  t * nWork * pStr
1de90 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20  uct->nLevel);.. 
1dea0 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1deb0 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e  e(p, ppStruct, n
1dec0 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Rem);.  }.}..sta
1ded0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
1dee0 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a 20  exCrisismerge(. 
1def0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1df20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1df30 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1df40 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20  truct        /* 
1df50 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
1df60 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
1df70 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ex */.){.  const
1df80 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20 70   int nCrisis = p
1df90 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73  ->pConfig->nCris
1dfa0 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35 53  isMerge;.  Fts5S
1dfb0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1dfc0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1dfd0 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a   int iLvl = 0;..
1dfe0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
1dff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
1e000 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
1e010 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
1e020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e030 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1e040 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69  iLvl].nSeg>=nCri
1e050 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35 49  sis ){.    fts5I
1e060 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
1e070 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c  , &pStruct, iLvl
1e080 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1e090 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
1e0a0 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e  OK || pStruct->n
1e0b0 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29  Level>(iLvl+1) )
1e0c0 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
1e0d0 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c  urePromote(p, iL
1e0e0 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a  vl+1, pStruct);.
1e0f0 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a      iLvl++;.  }.
1e100 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
1e110 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
1e120 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65   int fts5IndexRe
1e130 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a  turn(Fts5Index *
1e140 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  p){.  int rc = p
1e150 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ->rc;.  p->rc = 
1e160 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74  SQLITE_OK;.  ret
1e170 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64  urn rc;.}..typed
1e180 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c  ef struct Fts5Fl
1e190 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68  ushCtx Fts5Flush
1e1a0 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35  Ctx;.struct Fts5
1e1b0 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73  FlushCtx {.  Fts
1e1c0 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20  5Index *pIdx;.  
1e1d0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
1e1e0 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  iter; .};../*.**
1e1f0 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63   Buffer aBuf[] c
1e200 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f  ontains a list o
1e210 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73  f varints, all s
1e220 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66  mall enough to f
1e230 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69  it.** in a 32-bi
1e240 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72  t integer. Retur
1e250 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1e260 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69 78  e largest prefix
1e270 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73   of this .** lis
1e280 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20  t nMax bytes or 
1e290 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  less in size..*/
1e2a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1e2b0 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f  PoslistPrefix(co
1e2c0 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e  nst u8 *aBuf, in
1e2d0 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72  t nMax){.  int r
1e2e0 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b  et;.  u32 dummy;
1e2f0 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65 74  .  ret = fts5Get
1e300 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64  Varint32(aBuf, d
1e310 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 65 74  ummy);.  if( ret
1e320 3c 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77 68 69  <nMax ){.    whi
1e330 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
1e340 6e 74 20 69 20 3d 20 66 74 73 35 47 65 74 56 61  nt i = fts5GetVa
1e350 72 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74  rint32(&aBuf[ret
1e360 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  ], dummy);.     
1e370 20 69 66 28 20 28 72 65 74 20 2b 20 69 29 20 3e   if( (ret + i) >
1e380 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a 20   nMax ) break;. 
1e390 20 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20       ret += i;. 
1e3a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e3b0 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
1e3c0 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e  Flush the conten
1e3d0 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  ts of in-memory 
1e3e0 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73 68  hash table iHash
1e3f0 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d   to a new level-
1e400 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e  0 .** segment on
1e410 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61   disk. Also upda
1e420 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  te the correspon
1e430 64 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72  ding structure r
1e440 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
1e450 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1e460 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
1e470 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
1e480 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
1e490 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
1e4a0 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
1e4b0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1e4c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e4d0 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73   fts5FlushOneHas
1e4e0 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  h(Fts5Index *p){
1e4f0 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70 48 61  .  Fts5Hash *pHa
1e500 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20  sh = p->pHash;. 
1e510 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1e520 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69  pStruct;.  int i
1e530 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e  Segid;.  int pgn
1e540 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20  oLast = 0;      
1e550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
1e560 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
1e570 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
1e580 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
1e590 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1e5a0 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
1e5b0 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61  e and allocate a
1e5c0 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a   new segment-id.
1e5d0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
1e5e0 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74   level-0 segment
1e5f0 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20  .  */.  pStruct 
1e600 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
1e610 65 61 64 28 70 29 3b 0a 20 20 69 53 65 67 69 64  ead(p);.  iSegid
1e620 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53   = fts5AllocateS
1e630 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29  egid(p, pStruct)
1e640 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 20  ;..  if( iSegid 
1e650 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
1e660 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66   pgsz = p->pConf
1e670 69 67 2d 3e 70 67 73 7a 3b 0a 20 20 20 20 69 6e  ig->pgsz;.    in
1e680 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70  t eDetail = p->p
1e690 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
1e6a0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1e6b0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
1e6c0 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e     /* New segmen
1e6d0 74 20 77 69 74 68 69 6e 20 70 53 74 72 75 63 74  t within pStruct
1e6e0 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
1e6f0 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20  er *pBuf;       
1e700 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1e710 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65  in which to asse
1e720 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a  mble leaf page *
1e730 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
1e740 20 2a 70 50 67 69 64 78 3b 20 20 20 20 20 20 20   *pPgidx;       
1e750 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
1e760 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
1e770 6c 65 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20  le pgidx */..   
1e780 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
1e790 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73 35 57  riter;.    fts5W
1e7a0 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1e7b0 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  ter, iSegid);.. 
1e7c0 20 20 20 70 42 75 66 20 3d 20 26 77 72 69 74 65     pBuf = &write
1e7d0 72 2e 77 72 69 74 65 72 2e 62 75 66 3b 0a 20 20  r.writer.buf;.  
1e7e0 20 20 70 50 67 69 64 78 20 3d 20 26 77 72 69 74    pPgidx = &writ
1e7f0 65 72 2e 77 72 69 74 65 72 2e 70 67 69 64 78 3b  er.writer.pgidx;
1e800 0a 0a 20 20 20 20 2f 2a 20 66 74 73 35 57 72 69  ..    /* fts5Wri
1e810 74 65 49 6e 69 74 28 29 20 73 68 6f 75 6c 64 20  teInit() should 
1e820 68 61 76 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  have initialized
1e830 20 74 68 65 20 62 75 66 66 65 72 73 20 74 6f 20   the buffers to 
1e840 28 6d 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20  (most likely).  
1e850 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
1e860 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 2e   space required.
1e870 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1e880 70 2d 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e  p->rc || pBuf->n
1e890 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46  Space>=(pgsz + F
1e8a0 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
1e8b0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
1e8c0 20 70 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64 78   p->rc || pPgidx
1e8d0 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20  ->nSpace>=(pgsz 
1e8e0 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
1e8f0 49 4e 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ING) );..    /* 
1e900 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74  Begin scanning t
1e910 68 72 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c  hrough hash tabl
1e920 65 20 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20  e entries. This 
1e930 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66  loop runs once f
1e940 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74  or each.    ** t
1e950 65 72 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72  erm/doclist curr
1e960 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74  ently stored wit
1e970 68 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62  hin the hash tab
1e980 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
1e990 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1e9a0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1e9b0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1e9c0 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20  ScanInit(pHash, 
1e9d0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
1e9e0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1e9f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73  QLITE_OK && 0==s
1ea00 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
1ea10 61 6e 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a  anEof(pHash) ){.
1ea20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1ea30 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *zTerm;        
1ea40 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
1ea50 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20  aining term */. 
1ea60 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
1ea70 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
1ea80 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
1ea90 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20  oclist for this 
1eaa0 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  term */.      in
1eab0 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  t nDoclist;     
1eac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ead0 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20  e of doclist in 
1eae0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20  bytes */..      
1eaf0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 72  /* Write the ter
1eb00 6d 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79  m for this entry
1eb10 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20   to disk. */.   
1eb20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
1eb30 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73  shScanEntry(pHas
1eb40 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63  h, &zTerm, &pDoc
1eb50 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29  list, &nDoclist)
1eb60 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
1eb70 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26  eAppendTerm(p, &
1eb80 77 72 69 74 65 72 2c 20 28 69 6e 74 29 73 74 72  writer, (int)str
1eb90 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e  len(zTerm), (con
1eba0 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a  st u8*)zTerm);..
1ebb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77 72        assert( wr
1ebc0 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
1ebd0 49 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20  InPage==0 );.   
1ebe0 20 20 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42     if( pgsz>=(pB
1ebf0 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  uf->n + pPgidx->
1ec00 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31  n + nDoclist + 1
1ec10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1ec20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  The entire docli
1ec30 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  st will fit on t
1ec40 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1ec50 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
1ec60 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1ec70 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c  Blob(pBuf, pDocl
1ec80 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ist, nDoclist);.
1ec90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1eca0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
1ecb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
1ecc0 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20   iDelta = 0;.   
1ecd0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
1ece0 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  0;..        /* T
1ecf0 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
1ed00 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  t will not fit o
1ed10 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65  n this leaf. The
1ed20 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20   following .    
1ed30 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72      ** loop iter
1ed40 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  ates through the
1ed50 20 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d   poslists that m
1ed60 61 6b 65 20 75 70 20 74 68 65 20 63 75 72 72 65  ake up the curre
1ed70 6e 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  nt .        ** d
1ed80 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20  oclist.  */.    
1ed90 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
1eda0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1edb0 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a  Off<nDoclist ){.
1edc0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
1edd0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
1ede0 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
1edf0 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
1ee00 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69  .          iRowi
1ee10 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
1ee20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
1ee30 20 20 69 66 28 20 77 72 69 74 65 72 2e 62 46 69    if( writer.bFi
1ee40 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
1ee50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
1ee60 73 35 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e  s5PutU16(&pBuf->
1ee70 70 5b 30 5d 2c 20 28 75 31 36 29 70 42 75 66 2d  p[0], (u16)pBuf-
1ee80 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73 74 20  >n);   /* first 
1ee90 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f  rowid on page */
1eea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75  .            pBu
1eeb0 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  f->n += sqlite3F
1eec0 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts5PutVarint(&pB
1eed0 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
1eee0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1eef0 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72       writer.bFir
1ef00 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
1ef10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  0;.            f
1ef20 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
1ef30 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  end(p, &writer, 
1ef40 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1ef50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ef60 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
1ef70 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
1ef80 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
1ef90 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29  Buf->n], iDelta)
1efa0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1efb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1efc0 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e  pBuf->n<=pBuf->n
1efd0 53 70 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20  Space );..      
1efe0 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d      if( eDetail=
1eff0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
1f000 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
1f010 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69   if( iOff<nDocli
1f020 73 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69  st && pDoclist[i
1f030 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Off]==0 ){.     
1f040 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70           pBuf->p
1f050 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b  [pBuf->n++] = 0;
1f060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1f070 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Off++;.         
1f080 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44       if( iOff<nD
1f090 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69  oclist && pDocli
1f0a0 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20  st[iOff]==0 ){. 
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f0c0 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
1f0d0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
1f0e0 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20         iOff++;. 
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1f100 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1f110 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42           if( (pB
1f120 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  uf->n + pPgidx->
1f130 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20  n)>=pgsz ){.    
1f140 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72            fts5Wr
1f150 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
1f160 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  &writer);.      
1f170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f190 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b       int bDummy;
1f1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1f1b0 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20   nPos;.         
1f1c0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 66     int nCopy = f
1f1d0 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
1f1e0 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  e(&pDoclist[iOff
1f1f0 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d  ], &nPos, &bDumm
1f200 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
1f210 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20  nCopy += nPos;. 
1f220 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1f230 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78  pBuf->n + pPgidx
1f240 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20  ->n + nCopy) <= 
1f250 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
1f260 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
1f270 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c  ire poslist will
1f280 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72   fit on the curr
1f290 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70  ent leaf. So cop
1f2a0 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y.              
1f2b0 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e  ** it in one go.
1f2c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1f2d0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1f2e0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
1f2f0 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d   &pDoclist[iOff]
1f300 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1f310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f330 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74  e entire poslist
1f340 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
1f350 20 74 68 69 73 20 6c 65 61 66 2e 20 53 6f 20 69   this leaf. So i
1f360 74 20 6e 65 65 64 73 0a 20 20 20 20 20 20 20 20  t needs.        
1f370 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 62        ** to be b
1f380 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74 69  roken into secti
1f390 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75  ons. The only qu
1f3a0 61 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69 6e  alification bein
1f3b0 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g.              
1f3c0 2a 2a 20 74 68 61 74 20 65 61 63 68 20 76 61 72  ** that each var
1f3d0 69 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72  int must be stor
1f3e0 65 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e  ed contiguously.
1f3f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
1f400 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f     const u8 *pPo
1f410 73 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73  slist = &pDoclis
1f420 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20  t[iOff];.       
1f430 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20         int iPos 
1f440 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
1f450 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1f460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1f480 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20  t nSpace = pgsz 
1f490 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69  - pBuf->n - pPgi
1f4a0 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20  dx->n;.         
1f4b0 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
1f4c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f4d0 20 20 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69    if( (nCopy - i
1f4e0 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a  Pos)<=nSpace ){.
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50    n = nCopy - iP
1f510 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
1f520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
1f540 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66   fts5PoslistPref
1f550 69 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f  ix(&pPoslist[iPo
1f560 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 20  s], nSpace);.   
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1f590 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
1f5b0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1f5c0 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50  ndBlob(pBuf, &pP
1f5d0 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29  oslist[iPos], n)
1f5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f5f0 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20    iPos += n;.   
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1f610 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69   (pBuf->n + pPgi
1f620 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a  dx->n)>=pgsz ){.
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f640 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1f650 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72 29  Leaf(p, &writer)
1f660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f670 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1f680 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43      if( iPos>=nC
1f690 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  opy ) break;.   
1f6a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1f6b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f6c0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
1f6d0 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20  Copy;.          
1f6e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1f6f0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f    }..      /* TO
1f700 44 4f 32 3a 20 44 6f 63 6c 69 73 74 20 74 65 72  DO2: Doclist ter
1f710 6d 69 6e 61 74 6f 72 20 77 72 69 74 74 65 6e 20  minator written 
1f720 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  here. */.      /
1f730 2a 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  * pBuf->p[pBuf->
1f740 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a  n++] = '\0'; */.
1f750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1f760 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70  uf->n<=pBuf->nSp
1f770 61 63 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ace );.      sql
1f780 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
1f790 4e 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20 20  Next(pHash);.   
1f7a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
1f7b0 73 35 48 61 73 68 43 6c 65 61 72 28 70 48 61 73  s5HashClear(pHas
1f7c0 68 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  h);.    fts5Writ
1f7d0 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74  eFinish(p, &writ
1f7e0 65 72 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a  er, &pgnoLast);.
1f7f0 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
1f800 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1f810 2e 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20  . It is written 
1f820 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
1f830 62 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20  base by the.    
1f840 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65  ** fts5Structure
1f850 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62  Release() call b
1f860 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66  elow.  */.    if
1f870 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
1f880 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  l==0 ){.      ft
1f890 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
1f8a0 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74  vel(&p->rc, &pSt
1f8b0 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ruct);.    }.   
1f8c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
1f8d0 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
1f8e0 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c  , pStruct, 0, 1,
1f8f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
1f900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f910 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70  .      pSeg = &p
1f920 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
1f930 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d  ].aSeg[ pStruct-
1f940 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b  >aLevel[0].nSeg+
1f950 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  + ];.      pSeg-
1f960 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1f970 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67  ;.      pSeg->pg
1f980 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
1f990 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73     pSeg->pgnoLas
1f9a0 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20  t = pgnoLast;.  
1f9b0 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
1f9c0 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  gment++;.    }. 
1f9d0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1f9e0 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53  Promote(p, 0, pS
1f9f0 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66  truct);.  }..  f
1fa00 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67  ts5IndexAutomerg
1fa10 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70  e(p, &pStruct, p
1fa20 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35  gnoLast);.  fts5
1fa30 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65  IndexCrisismerge
1fa40 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20  (p, &pStruct);. 
1fa50 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1fa60 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b  ite(p, pStruct);
1fa70 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
1fa80 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
1fa90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
1faa0 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
1fab0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1fac0 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f  y hash tables to
1fad0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1fae0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1faf0 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73  s5IndexFlush(Fts
1fb00 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a  5Index *p){.  /*
1fb10 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d   Unless it is em
1fb20 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68  pty, flush the h
1fb30 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
1fb40 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50  k */.  if( p->nP
1fb50 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20  endingData ){.  
1fb60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
1fb70 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  sh );.    p->nPe
1fb80 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
1fb90 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48     fts5FlushOneH
1fba0 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ash(p);.  }.}...
1fbb0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1fbc0 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73  ndexOptimize(Fts
1fbd0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
1fbe0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1fbf0 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
1fc00 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
1fc10 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b  .  int nSeg = 0;
1fc20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1fc30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1fc40 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
1fc50 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  (p);.  pStruct =
1fc60 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1fc70 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53  ad(p);..  if( pS
1fc80 74 72 75 63 74 20 29 7b 0a 20 20 20 20 61 73 73  truct ){.    ass
1fc90 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53  ert( pStruct->nS
1fca0 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75  egment==fts5Stru
1fcb0 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
1fcc0 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20  ts(pStruct) );. 
1fcd0 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63     nSeg = pStruc
1fce0 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20  t->nSegment;.   
1fcf0 20 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20   if( nSeg>1 ){. 
1fd00 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
1fd10 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1fd20 63 74 75 72 65 29 3b 0a 20 20 20 20 20 20 6e 42  cture);.      nB
1fd30 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d  yte += (pStruct-
1fd40 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a  >nLevel+1) * siz
1fd50 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1fd60 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 70  eLevel);.      p
1fd70 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63  New = (Fts5Struc
1fd80 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73  ture*)sqlite3Fts
1fd90 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1fda0 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1fdb0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77  }.  }.  if( pNew
1fdc0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
1fdd0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1fde0 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ;.    int nByte 
1fdf0 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28  = nSeg * sizeof(
1fe00 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1fe10 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ment);.    pNew-
1fe20 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63  >nLevel = pStruc
1fe30 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20  t->nLevel+1;.   
1fe40 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
1fe50 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74  .    pNew->nWrit
1fe60 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75  eCounter = pStru
1fe70 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
1fe80 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  r;.    pLvl = &p
1fe90 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  New->aLevel[pStr
1fea0 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
1feb0 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
1fec0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1fed0 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
1fee0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1fef0 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1ff00 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29  if( pLvl->aSeg )
1ff10 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
1ff20 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e  , iSeg;.      in
1ff30 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20  t iSegOut = 0;. 
1ff40 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
1ff50 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1ff60 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1ff70 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
1ff80 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
1ff90 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
1ffa0 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
1ffb0 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53          pLvl->aS
1ffc0 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53  eg[iSegOut] = pS
1ffd0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1ffe0 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
1fff0 20 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75            iSegOu
20000 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
20010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
20020 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c  w->nSegment = pL
20030 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b  vl->nSeg = nSeg;
20040 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20050 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
20060 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  New);.      pNew
20070 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
20080 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
20090 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e     int iLvl = pN
200a0 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20  ew->nLevel-1;.  
200b0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
200c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65  SQLITE_OK && pNe
200d0 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  w->aLevel[iLvl].
200e0 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSeg>0 ){.      
200f0 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f  int nRem = FTS5_
20100 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20  OPT_WORK_UNIT;. 
20110 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65       fts5IndexMe
20120 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65  rgeLevel(p, &pNe
20130 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  w, iLvl, &nRem);
20140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
20150 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
20160 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73  , pNew);.    fts
20170 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
20180 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
20190 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
201a0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
201b0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
201c0 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a  xReturn(p); .}..
201d0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
201e0 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e  ndexMerge(Fts5In
201f0 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72  dex *p, int nMer
20200 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  ge){.  Fts5Struc
20210 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 0a  ture *pStruct;..
20220 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
20230 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
20240 3b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  ;.  if( pStruct 
20250 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  && pStruct->nLev
20260 65 6c 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  el ){.    fts5In
20270 64 65 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74  dexMerge(p, &pSt
20280 72 75 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20  ruct, nMerge);. 
20290 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
202a0 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74  Write(p, pStruct
202b0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74 72  );.  }.  fts5Str
202c0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
202d0 74 72 75 63 74 29 3b 0a 0a 20 20 72 65 74 75 72  truct);..  retur
202e0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
202f0 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(p);.}..static 
20300 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74  void fts5Poslist
20310 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
20320 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69  Index *p, .  voi
20330 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20  d *pContext, .  
20340 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b  const u8 *pChunk
20350 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a  , int nChunk.){.
20360 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68    assert_nc( nCh
20370 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unk>=0 );.  if( 
20380 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  nChunk>0 ){.    
20390 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
203a0 70 65 6e 64 42 6c 6f 62 28 28 46 74 73 35 42 75  pendBlob((Fts5Bu
203b0 66 66 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20  ffer*)pContext, 
203c0 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b  pChunk, nChunk);
203d0 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20  .  }.}..typedef 
203e0 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61  struct PoslistCa
203f0 6c 6c 62 61 63 6b 43 74 78 20 50 6f 73 6c 69 73  llbackCtx Poslis
20400 74 43 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74  tCallbackCtx;.st
20410 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c  ruct PoslistCall
20420 62 61 63 6b 43 74 78 20 7b 0a 20 20 46 74 73 35  backCtx {.  Fts5
20430 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
20440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20450 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75  ppend to this bu
20460 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f  ffer */.  Fts5Co
20470 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20  lset *pColset;  
20480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
20490 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f  trict matches to
204a0 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   this column */.
204b0 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 20 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a    /* See above *
204e0 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74  /.};..typedef st
204f0 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66 73  ruct PoslistOffs
20500 65 74 73 43 74 78 20 50 6f 73 6c 69 73 74 4f 66  etsCtx PoslistOf
20510 66 73 65 74 73 43 74 78 3b 0a 73 74 72 75 63 74  fsetsCtx;.struct
20520 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43   PoslistOffsetsC
20530 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65  tx {.  Fts5Buffe
20540 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20  r *pBuf;        
20550 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64         /* Append
20560 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20   to this buffer 
20570 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
20580 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20  *pColset;       
20590 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
205a0 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69 73   matches to this
205b0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
205c0 20 69 52 65 61 64 3b 0a 20 20 69 6e 74 20 69 57   iRead;.  int iW
205d0 72 69 74 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  rite;.};../*.** 
205e0 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20  TODO: Make this 
205f0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a  more efficient!.
20600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
20610 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
20620 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43  t(Fts5Colset *pC
20630 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29  olset, int iCol)
20640 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
20650 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d  (i=0; i<pColset-
20660 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
20670 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69   if( pColset->ai
20680 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72  Col[i]==iCol ) r
20690 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
206a0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
206b0 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c  ic void fts5Posl
206c0 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61  istOffsetsCallba
206d0 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ck(.  Fts5Index 
206e0 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  *p, .  void *pCo
206f0 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20  ntext, .  const 
20700 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20  u8 *pChunk, int 
20710 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c  nChunk.){.  Posl
20720 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 2a 70  istOffsetsCtx *p
20730 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74 4f 66  Ctx = (PoslistOf
20740 66 73 65 74 73 43 74 78 2a 29 70 43 6f 6e 74 65  fsetsCtx*)pConte
20750 78 74 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28  xt;.  assert_nc(
20760 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20   nChunk>=0 );.  
20770 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a  if( nChunk>0 ){.
20780 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
20790 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75     while( i<nChu
207a0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  nk ){.      int 
207b0 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 20 2b 3d  iVal;.      i +=
207c0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
207d0 28 26 70 43 68 75 6e 6b 5b 69 5d 2c 20 69 56 61  (&pChunk[i], iVa
207e0 6c 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 2b  l);.      iVal +
207f0 3d 20 70 43 74 78 2d 3e 69 52 65 61 64 20 2d 20  = pCtx->iRead - 
20800 32 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 69  2;.      pCtx->i
20810 52 65 61 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20  Read = iVal;.   
20820 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78     if( fts5Index
20830 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d  ColsetTest(pCtx-
20840 3e 70 43 6f 6c 73 65 74 2c 20 69 56 61 6c 29 20  >pColset, iVal) 
20850 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
20860 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
20870 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75 66  arint(pCtx->pBuf
20880 2c 20 69 56 61 6c 20 2b 20 32 20 2d 20 70 43 74  , iVal + 2 - pCt
20890 78 2d 3e 69 57 72 69 74 65 29 3b 0a 20 20 20 20  x->iWrite);.    
208a0 20 20 20 20 70 43 74 78 2d 3e 69 57 72 69 74 65      pCtx->iWrite
208b0 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d   = iVal;.      }
208c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
208d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
208e0 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62  slistFilterCallb
208f0 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
20900 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43   *p, .  void *pC
20910 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74  ontext, .  const
20920 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74   u8 *pChunk, int
20930 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73   nChunk.){.  Pos
20940 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
20950 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74  *pCtx = (Poslist
20960 43 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70 43 6f  CallbackCtx*)pCo
20970 6e 74 65 78 74 3b 0a 20 20 61 73 73 65 72 74 5f  ntext;.  assert_
20980 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b  nc( nChunk>=0 );
20990 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20  .  if( nChunk>0 
209a0 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  ){.    /* Search
209b0 20 74 68 72 6f 75 67 68 20 74 6f 20 66 69 6e 64   through to find
209c0 20 74 68 65 20 66 69 72 73 74 20 76 61 72 69 6e   the first varin
209d0 74 20 77 69 74 68 20 76 61 6c 75 65 20 31 2e 20  t with value 1. 
209e0 54 68 69 73 20 69 73 20 74 68 65 0a 20 20 20 20  This is the.    
209f0 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
20a00 6e 65 78 74 20 63 6f 6c 75 6d 6e 73 20 68 69 74  next columns hit
20a10 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20  s. */.    int i 
20a20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 53 74  = 0;.    int iSt
20a30 61 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  art = 0;..    if
20a40 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 3d 3d  ( pCtx->eState==
20a50 32 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  2 ){.      int i
20a60 43 6f 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 46  Col;.      fts5F
20a70 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
20a80 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b  Chunk, i, iCol);
20a90 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49  .      if( fts5I
20aa0 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
20ab0 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43  Ctx->pColset, iC
20ac0 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ol) ){.        p
20ad0 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 31 3b  Ctx->eState = 1;
20ae0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
20af0 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
20b00 69 6e 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20  int(pCtx->pBuf, 
20b10 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
20b20 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65  .        pCtx->e
20b30 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  State = 0;.     
20b40 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f   }.    }..    do
20b50 20 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   {.      while( 
20b60 69 3c 6e 43 68 75 6e 6b 20 26 26 20 70 43 68 75  i<nChunk && pChu
20b70 6e 6b 5b 69 5d 21 3d 30 78 30 31 20 29 7b 0a 20  nk[i]!=0x01 ){. 
20b80 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43         while( pC
20b90 68 75 6e 6b 5b 69 5d 20 26 20 30 78 38 30 20 29  hunk[i] & 0x80 )
20ba0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b   i++;.        i+
20bb0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
20bc0 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74   if( pCtx->eStat
20bd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  e ){.        fts
20be0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
20bf0 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66  dBlob(pCtx->pBuf
20c00 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74  , &pChunk[iStart
20c10 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20  ], i-iStart);.  
20c20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20c30 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  i<nChunk ){.    
20c40 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
20c50 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
20c60 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  ;.        i++;. 
20c70 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43         if( i>=nC
20c80 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  hunk ){.        
20c90 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
20ca0 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   2;.        }els
20cb0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  e{.          fts
20cc0 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
20cd0 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c  (pChunk, i, iCol
20ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  );.          pCt
20cf0 78 2d 3e 65 53 74 61 74 65 20 3d 20 66 74 73 35  x->eState = fts5
20d00 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
20d10 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69  pCtx->pColset, i
20d20 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Col);.          
20d30 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65  if( pCtx->eState
20d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20d50 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
20d60 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70  pendBlob(pCtx->p
20d70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74  Buf, &pChunk[iSt
20d80 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b  art], i-iStart);
20d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 53 74  .            iSt
20da0 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  art = i;.       
20db0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
20dc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
20dd0 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20  e( i<nChunk );. 
20de0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72   }.}../*.** Iter
20df0 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
20e00 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
20e10 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f   valid entry (no
20e20 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20  t EOF). This.** 
20e30 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
20e40 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
20e50 73 74 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  st data for the 
20e60 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 74 6f  current entry to
20e70 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 2e  .** buffer pBuf.
20e80 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b   It does not mak
20e90 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
20ea0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
20eb0 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a  ze.** field..*/.
20ec0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
20ed0 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 0a  SegiterPoslist(.
20ee0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
20ef0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
20f00 53 65 67 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65  Seg,.  Fts5Colse
20f10 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74  t *pColset,.  Ft
20f20 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29  s5Buffer *pBuf.)
20f30 7b 0a 20 20 69 66 28 20 30 3d 3d 66 74 73 35 42  {.  if( 0==fts5B
20f40 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
20f50 2c 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50  , pBuf, pSeg->nP
20f60 6f 73 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  os) ){.    if( p
20f70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Colset==0 ){.   
20f80 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
20f90 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f  ate(p, pSeg, (vo
20fa0 69 64 2a 29 70 42 75 66 2c 20 66 74 73 35 50 6f  id*)pBuf, fts5Po
20fb0 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a  slistCallback);.
20fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20fd0 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
20fe0 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
20ff0 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20  ETAIL_FULL ){.  
21000 20 20 20 20 20 20 50 6f 73 6c 69 73 74 43 61 6c        PoslistCal
21010 6c 62 61 63 6b 43 74 78 20 73 43 74 78 3b 0a 20  lbackCtx sCtx;. 
21020 20 20 20 20 20 20 20 73 43 74 78 2e 70 42 75 66         sCtx.pBuf
21030 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20   = pBuf;.       
21040 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20   sCtx.pColset = 
21050 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20  pColset;.       
21060 20 73 43 74 78 2e 65 53 74 61 74 65 20 3d 20 66   sCtx.eState = f
21070 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
21080 73 74 28 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a  st(pColset, 0);.
21090 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
210a0 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c  sCtx.eState==0 |
210b0 7c 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 31  | sCtx.eState==1
210c0 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35   );.        fts5
210d0 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20  ChunkIterate(p, 
210e0 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43  pSeg, (void*)&sC
210f0 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 46  tx, fts5PoslistF
21100 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a  ilterCallback);.
21110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21120 20 20 20 20 20 50 6f 73 6c 69 73 74 4f 66 66 73       PoslistOffs
21130 65 74 73 43 74 78 20 73 43 74 78 3b 0a 20 20 20  etsCtx sCtx;.   
21140 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74       memset(&sCt
21150 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74  x, 0, sizeof(sCt
21160 78 29 29 3b 0a 20 20 20 20 20 20 20 20 73 43 74  x));.        sCt
21170 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20  x.pBuf = pBuf;. 
21180 20 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c         sCtx.pCol
21190 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20  set = pColset;. 
211a0 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b         fts5Chunk
211b0 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c  Iterate(p, pSeg,
211c0 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66   (void*)&sCtx, f
211d0 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ts5PoslistOffset
211e0 73 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  sCallback);.    
211f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
21200 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70 61  ./*.** IN/OUT pa
21210 72 61 6d 65 74 65 72 20 28 2a 70 61 29 20 70 6f  rameter (*pa) po
21220 69 6e 74 73 20 74 6f 20 61 20 70 6f 73 69 74 69  ints to a positi
21230 6f 6e 20 6c 69 73 74 20 6e 20 62 79 74 65 73 20  on list n bytes 
21240 69 6e 20 73 69 7a 65 2e 20 49 66 0a 2a 2a 20 74  in size. If.** t
21250 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
21260 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65   contains entrie
21270 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f  s for column iCo
21280 6c 2c 20 74 68 65 6e 20 28 2a 70 61 29 20 69 73  l, then (*pa) is
21290 20 73 65 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74   set.** to point
212a0 20 74 6f 20 74 68 65 20 73 75 62 2d 70 6f 73 69   to the sub-posi
212b0 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 72 20 74 68  tion-list for th
212c0 61 74 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68  at column and th
212d0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62  e number of.** b
212e0 79 74 65 73 20 69 6e 20 69 74 20 72 65 74 75 72  ytes in it retur
212f0 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ned. Or, if the 
21300 61 72 67 75 6d 65 6e 74 20 70 6f 73 69 74 69 6f  argument positio
21310 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 0a  n list does not.
21320 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 65  ** contain any e
21330 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d  ntries for colum
21340 6e 20 69 43 6f 6c 2c 20 72 65 74 75 72 6e 20 30  n iCol, return 0
21350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21360 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74  fts5IndexExtract
21370 43 6f 6c 28 0a 20 20 63 6f 6e 73 74 20 75 38 20  Col(.  const u8 
21380 2a 2a 70 61 2c 20 20 20 20 20 20 20 20 20 20 20  **pa,           
21390 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
213a0 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73  : Pointer to pos
213b0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c  list */.  int n,
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a            /* IN:
213e0 20 53 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74   Size of poslist
213f0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
21400 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20  nt iCol         
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21420 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  * Column to extr
21430 61 63 74 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74  act from poslist
21440 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75   */.){.  int iCu
21450 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  rrent = 0;      
21460 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 74           /* Anyt
21470 68 69 6e 67 20 62 65 66 6f 72 65 20 74 68 65 20  hing before the 
21480 66 69 72 73 74 20 30 78 30 31 20 69 73 20 63 6f  first 0x01 is co
21490 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  l 0 */.  const u
214a0 38 20 2a 70 20 3d 20 2a 70 61 3b 0a 20 20 63 6f  8 *p = *pa;.  co
214b0 6e 73 74 20 75 38 20 2a 70 45 6e 64 20 3d 20 26  nst u8 *pEnd = &
214c0 70 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  p[n];         /*
214d0 20 4f 6e 65 20 62 79 74 65 20 70 61 73 74 20 65   One byte past e
214e0 6e 64 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c  nd of position l
214f0 69 73 74 20 2a 2f 0a 20 20 75 38 20 70 72 65 76  ist */.  u8 prev
21500 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
21510 69 43 6f 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b  iCol>iCurrent ){
21520 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
21530 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20  pointer p until 
21540 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e  it points to pEn
21550 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74  d or an 0x01 byt
21560 65 20 74 68 61 74 20 69 73 0a 20 20 20 20 2a 2a  e that is.    **
21570 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76   not part of a v
21580 61 72 69 6e 74 20 2a 2f 0a 20 20 20 20 77 68 69  arint */.    whi
21590 6c 65 28 20 28 70 72 65 76 20 26 20 30 78 38 30  le( (prev & 0x80
215a0 29 20 7c 7c 20 2a 70 21 3d 30 78 30 31 20 29 7b  ) || *p!=0x01 ){
215b0 0a 20 20 20 20 20 20 70 72 65 76 20 3d 20 2a 70  .      prev = *p
215c0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 3d  ++;.      if( p=
215d0 3d 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20 30  =pEnd ) return 0
215e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 61 20  ;.    }.    *pa 
215f0 3d 20 70 2b 2b 3b 0a 20 20 20 20 70 20 2b 3d 20  = p++;.    p += 
21600 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
21610 70 2c 20 69 43 75 72 72 65 6e 74 29 3b 0a 20 20  p, iCurrent);.  
21620 7d 0a 20 20 69 66 28 20 69 43 6f 6c 21 3d 69 43  }.  if( iCol!=iC
21630 75 72 72 65 6e 74 20 29 20 72 65 74 75 72 6e 20  urrent ) return 
21640 30 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  0;..  /* Advance
21650 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c   pointer p until
21660 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45   it points to pE
21670 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79  nd or an 0x01 by
21680 74 65 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  te that is.  ** 
21690 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76 61  not part of a va
216a0 72 69 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74  rint */.  assert
216b0 28 20 28 70 72 65 76 20 26 20 30 78 38 30 29 3d  ( (prev & 0x80)=
216c0 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  =0 );.  while( p
216d0 3c 70 45 6e 64 20 26 26 20 28 28 70 72 65 76 20  <pEnd && ((prev 
216e0 26 20 30 78 38 30 29 20 7c 7c 20 2a 70 21 3d 30  & 0x80) || *p!=0
216f0 78 30 31 29 20 29 7b 0a 20 20 20 20 70 72 65 76  x01) ){.    prev
21700 20 3d 20 2a 70 2b 2b 3b 0a 20 20 7d 0a 20 20 72   = *p++;.  }.  r
21710 65 74 75 72 6e 20 70 20 2d 20 28 2a 70 61 29 3b  eturn p - (*pa);
21720 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
21730 74 73 35 41 70 70 65 6e 64 52 6f 77 69 64 28 0a  ts5AppendRowid(.
21740 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
21750 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20    i64 iDelta,.  
21760 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
21770 4d 75 6c 74 69 2c 0a 20 20 46 74 73 35 43 6f 6c  Multi,.  Fts5Col
21780 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20  set *pColset,.  
21790 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
217a0 0a 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72  .){.  fts5Buffer
217b0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
217c0 3e 72 63 2c 20 70 42 75 66 2c 20 69 44 65 6c 74  >rc, pBuf, iDelt
217d0 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  a);.  return 0;.
217e0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
217f0 72 20 70 4d 75 6c 74 69 20 63 75 72 72 65 6e 74  r pMulti current
21800 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  ly points to a v
21810 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20  alid entry (not 
21820 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75  EOF). This.** fu
21830 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74  nction appends t
21840 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20  he following to 
21850 62 75 66 66 65 72 20 70 42 75 66 3a 0a 2a 2a 0a  buffer pBuf:.**.
21860 2a 2a 20 20 20 2a 20 54 68 65 20 76 61 72 69 6e  **   * The varin
21870 74 20 69 44 65 6c 74 61 2c 20 61 6e 64 0a 2a 2a  t iDelta, and.**
21880 20 20 20 2a 20 74 68 65 20 70 6f 73 69 74 69 6f     * the positio
21890 6e 20 6c 69 73 74 20 74 68 61 74 20 63 75 72 72  n list that curr
218a0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c  ently points to,
218b0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 73   including the s
218c0 69 7a 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ize field..**.**
218d0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 43 6f   If argument pCo
218e0 6c 73 65 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  lset is NULL, th
218f0 65 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  en the position 
21900 6c 69 73 74 20 69 73 20 66 69 6c 74 65 72 65 64  list is filtered
21910 20 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f   according.** to
21920 20 70 43 6f 6c 73 65 74 20 62 65 66 6f 72 65 20   pColset before 
21930 62 65 69 6e 67 20 61 70 70 65 6e 64 65 64 20 74  being appended t
21940 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 49 66  o the buffer. If
21950 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65 72   this means ther
21960 65 20 61 72 65 0a 2a 2a 20 6e 6f 20 65 6e 74 72  e are.** no entr
21970 69 65 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74  ies in the posit
21980 69 6f 6e 20 6c 69 73 74 2c 20 6e 6f 74 68 69 6e  ion list, nothin
21990 67 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  g is appended to
219a0 20 74 68 65 20 62 75 66 66 65 72 20 28 6e 6f 74   the buffer (not
219b0 0a 2a 2a 20 65 76 65 6e 20 69 44 65 6c 74 61 29  .** even iDelta)
219c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
219d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
219e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
219f0 74 20 69 6e 20 70 2d 3e 72 63 2e 20 0a 2a 2f 0a  t in p->rc. .*/.
21a00 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 41  static int fts5A
21a10 70 70 65 6e 64 50 6f 73 6c 69 73 74 28 0a 20 20  ppendPoslist(.  
21a20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
21a30 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74  i64 iDelta,.  Ft
21a40 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4d 75  s5IndexIter *pMu
21a50 6c 74 69 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65  lti,.  Fts5Colse
21a60 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74  t *pColset,.  Ft
21a70 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29  s5Buffer *pBuf.)
21a80 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
21a90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21aa0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
21ab0 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65  g = &pMulti->aSe
21ac0 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73  g[ pMulti->aFirs
21ad0 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
21ae0 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 4d     assert( fts5M
21af0 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
21b00 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a 20 20 20  Multi)==0 );.   
21b10 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 6e   assert( pSeg->n
21b20 50 6f 73 3e 30 20 29 3b 0a 20 20 20 20 69 66 28  Pos>0 );.    if(
21b30 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47 72   0==fts5BufferGr
21b40 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ow(&p->rc, pBuf,
21b50 20 70 53 65 67 2d 3e 6e 50 6f 73 2b 39 2b 39 29   pSeg->nPos+9+9)
21b60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
21b70 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
21b80 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46  l==FTS5_DETAIL_F
21b90 55 4c 4c 0a 20 20 20 20 20 20 20 26 26 20 70 53  ULL.       && pS
21ba0 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
21bb0 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67  pSeg->nPos<=pSeg
21bc0 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
21bd0 0a 20 20 20 20 20 20 20 26 26 20 28 70 43 6f 6c  .       && (pCol
21be0 73 65 74 3d 3d 30 20 7c 7c 20 70 43 6f 6c 73 65  set==0 || pColse
21bf0 74 2d 3e 6e 43 6f 6c 3d 3d 31 29 0a 20 20 20 20  t->nCol==1).    
21c00 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e    ){.        con
21c10 73 74 20 75 38 20 2a 70 50 6f 73 20 3d 20 26 70  st u8 *pPos = &p
21c20 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
21c30 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
21c40 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50  ;.        int nP
21c50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  os;.        if( 
21c60 70 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20 20  pColset ){.     
21c70 20 20 20 20 20 6e 50 6f 73 20 3d 20 66 74 73 35       nPos = fts5
21c80 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28  IndexExtractCol(
21c90 26 70 50 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f  &pPos, pSeg->nPo
21ca0 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  s, pColset->aiCo
21cb0 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  l[0]);.         
21cc0 20 69 66 28 20 6e 50 6f 73 3d 3d 30 20 29 20 72   if( nPos==0 ) r
21cd0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
21ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21cf0 20 20 6e 50 6f 73 20 3d 20 70 53 65 67 2d 3e 6e    nPos = pSeg->n
21d00 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Pos;.        }. 
21d10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
21d20 50 6f 73 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Pos>0 );.       
21d30 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
21d40 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
21d50 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  , iDelta);.     
21d60 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
21d70 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42  eAppendVarint(pB
21d80 75 66 2c 20 6e 50 6f 73 2a 32 29 3b 0a 20 20 20  uf, nPos*2);.   
21d90 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
21da0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
21db0 75 66 2c 20 70 50 6f 73 2c 20 6e 50 6f 73 29 3b  uf, pPos, nPos);
21dc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21dd0 20 20 20 20 20 20 69 6e 74 20 69 53 76 31 3b 0a        int iSv1;.
21de0 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 76 32          int iSv2
21df0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  ;.        int iD
21e00 61 74 61 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ata;..        /*
21e10 20 41 70 70 65 6e 64 20 69 44 65 6c 74 61 20 2a   Append iDelta *
21e20 2f 0a 20 20 20 20 20 20 20 20 69 53 76 31 20 3d  /.        iSv1 =
21e30 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20 20   pBuf->n;.      
21e40 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
21e50 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
21e60 66 2c 20 69 44 65 6c 74 61 29 3b 0a 0a 20 20 20  f, iDelta);..   
21e70 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53       /* WRITEPOS
21e80 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20  LISTSIZE */.    
21e90 20 20 20 20 69 53 76 32 20 3d 20 70 42 75 66 2d      iSv2 = pBuf-
21ea0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  >n;.        fts5
21eb0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
21ec0 56 61 72 69 6e 74 28 70 42 75 66 2c 20 70 53 65  Varint(pBuf, pSe
21ed0 67 2d 3e 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20  g->nPos*2);.    
21ee0 20 20 20 20 69 44 61 74 61 20 3d 20 70 42 75 66      iData = pBuf
21ef0 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 20 20 66 74  ->n;..        ft
21f00 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
21f10 28 70 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65  (p, pSeg, pColse
21f20 74 2c 20 70 42 75 66 29 3b 0a 0a 20 20 20 20 20  t, pBuf);..     
21f30 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 20 29     if( pColset )
21f40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
21f50 6e 41 63 74 75 61 6c 20 3d 20 70 42 75 66 2d 3e  nActual = pBuf->
21f60 6e 20 2d 20 69 44 61 74 61 3b 0a 20 20 20 20 20  n - iData;.     
21f70 20 20 20 20 20 69 66 28 20 6e 41 63 74 75 61 6c       if( nActual
21f80 21 3d 70 53 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a  !=pSeg->nPos ){.
21f90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21fa0 6e 41 63 74 75 61 6c 3d 3d 30 20 29 7b 0a 20 20  nActual==0 ){.  
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
21fc0 2d 3e 6e 20 3d 20 69 53 76 31 3b 0a 20 20 20 20  ->n = iSv1;.    
21fd0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
21fe0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
21ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22000 20 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20       int nReq = 
22010 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
22020 72 69 6e 74 4c 65 6e 28 28 75 33 32 29 28 6e 41  rintLen((u32)(nA
22030 63 74 75 61 6c 2a 32 29 29 3b 0a 20 20 20 20 20  ctual*2));.     
22040 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
22050 69 53 76 32 3c 28 69 44 61 74 61 2d 6e 52 65 71  iSv2<(iData-nReq
22060 29 20 29 7b 20 70 42 75 66 2d 3e 70 5b 69 53 76  ) ){ pBuf->p[iSv
22070 32 2b 2b 5d 20 3d 20 30 78 38 30 3b 20 7d 0a 20  2++] = 0x80; }. 
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22090 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e  ite3Fts5PutVarin
220a0 74 28 26 70 42 75 66 2d 3e 70 5b 69 53 76 32 5d  t(&pBuf->p[iSv2]
220b0 2c 20 6e 41 63 74 75 61 6c 2a 32 29 3b 0a 20 20  , nActual*2);.  
220c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
220d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
220e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
220f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
22100 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
22110 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
22120 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73 74  Next(Fts5Doclist
22130 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
22140 75 38 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 61  u8 *p = pIter->a
22150 50 6f 73 6c 69 73 74 20 2b 20 70 49 74 65 72 2d  Poslist + pIter-
22160 3e 6e 53 69 7a 65 20 2b 20 70 49 74 65 72 2d 3e  >nSize + pIter->
22170 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61 73 73  nPoslist;..  ass
22180 65 72 74 28 20 70 49 74 65 72 2d 3e 61 50 6f 73  ert( pIter->aPos
22190 6c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 3e  list );.  if( p>
221a0 3d 70 49 74 65 72 2d 3e 61 45 6f 66 20 29 7b 0a  =pIter->aEof ){.
221b0 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c      pIter->aPosl
221c0 69 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ist = 0;.  }else
221d0 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  {.    i64 iDelta
221e0 3b 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 35  ;..    p += fts5
221f0 47 65 74 56 61 72 69 6e 74 28 70 2c 20 28 75 36  GetVarint(p, (u6
22200 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
22210 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
22220 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f  = iDelta;..    /
22230 2a 20 52 65 61 64 20 70 6f 73 69 74 69 6f 6e 20  * Read position 
22240 6c 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20  list size */.   
22250 20 69 66 28 20 70 5b 30 5d 20 26 20 30 78 38 30   if( p[0] & 0x80
22260 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
22270 6f 73 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  os;.      pIter-
22280 3e 6e 53 69 7a 65 20 3d 20 66 74 73 35 47 65 74  >nSize = fts5Get
22290 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73  Varint32(p, nPos
222a0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
222b0 6e 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73  nPoslist = (nPos
222c0 3e 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >>1);.    }else{
222d0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50  .      pIter->nP
222e0 6f 73 6c 69 73 74 20 3d 20 28 28 69 6e 74 29 28  oslist = ((int)(
222f0 70 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20  p[0])) >> 1;.   
22300 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20     pIter->nSize 
22310 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
22320 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
22330 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = p;.  }.}..stat
22340 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
22350 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46  istIterInit(.  F
22360 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
22370 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49   .  Fts5DoclistI
22380 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20  ter *pIter.){.  
22390 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
223a0 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
223b0 3b 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  ;.  pIter->aPosl
223c0 69 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20  ist = pBuf->p;. 
223d0 20 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26   pIter->aEof = &
223e0 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
223f0 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49  ;.  fts5DoclistI
22400 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
22410 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41  }..#if 0./*.** A
22420 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20  ppend a doclist 
22430 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  to buffer pBuf..
22440 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
22450 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
22460 20 73 70 61 63 65 20 77 69 74 68 69 6e 20 74 68   space within th
22470 65 20 62 75 66 66 65 72 20 68 61 73 20 61 6c 72  e buffer has alr
22480 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c  eady been.** all
22490 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ocated..*/.stati
224a0 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
224b0 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 46  AppendDocid(.  F
224c0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
224e0 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 69 74  * Buffer to writ
224f0 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70  e to */.  i64 *p
22500 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20  iLastRowid,     
22510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
22520 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f  OUT: Previous ro
22530 77 69 64 20 77 72 69 74 74 65 6e 20 28 69 66 20  wid written (if 
22540 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52  any) */.  i64 iR
22550 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
22560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
22570 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  id to append */.
22580 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  ){.  assert( pBu
22590 66 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c  f->n!=0 || (*piL
225a0 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a  astRowid)==0 );.
225b0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
225c0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
225d0 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c  f, iRowid - *piL
225e0 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69  astRowid);.  *pi
225f0 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
22600 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64  id;.}.#endif..#d
22610 65 66 69 6e 65 20 66 74 73 35 4d 65 72 67 65 41  efine fts5MergeA
22620 70 70 65 6e 64 44 6f 63 69 64 28 70 42 75 66 2c  ppendDocid(pBuf,
22630 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f   iLastRowid, iRo
22640 77 69 64 29 20 7b 20 20 20 20 20 20 20 5c 0a 20  wid) {       \. 
22650 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
22660 3e 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52  >n!=0 || (iLastR
22670 6f 77 69 64 29 3d 3d 30 20 29 3b 20 20 20 20 20  owid)==0 );     
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
22690 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
226a0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 28 70 42  AppendVarint((pB
226b0 75 66 29 2c 20 28 69 52 6f 77 69 64 29 20 2d 20  uf), (iRowid) - 
226c0 28 69 4c 61 73 74 52 6f 77 69 64 29 29 3b 20 5c  (iLastRowid)); \
226d0 0a 20 20 28 69 4c 61 73 74 52 6f 77 69 64 29 20  .  (iLastRowid) 
226e0 3d 20 28 69 52 6f 77 69 64 29 3b 20 20 20 20 20  = (iRowid);     
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22710 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  \.}../*.** Swap 
22720 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
22730 62 75 66 66 65 72 20 2a 70 31 20 77 69 74 68 20  buffer *p1 with 
22740 74 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a 2f 0a  that of *p2..*/.
22750 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
22760 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42  BufferSwap(Fts5B
22770 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42  uffer *p1, Fts5B
22780 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74  uffer *p2){.  Ft
22790 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a  s5Buffer tmp = *
227a0 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b  p1;.  *p1 = *p2;
227b0 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a  .  *p2 = tmp;.}.
227c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
227d0 35 4e 65 78 74 52 6f 77 69 64 28 46 74 73 35 42  5NextRowid(Fts5B
227e0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 6e 74  uffer *pBuf, int
227f0 20 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a 70 69   *piOff, i64 *pi
22800 52 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20 69 20  Rowid){.  int i 
22810 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66 28 20  = *piOff;.  if( 
22820 69 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a 20 20  i>=pBuf->n ){.  
22830 20 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20    *piOff = -1;. 
22840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36 34 20   }else{.    u64 
22850 69 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f 66 66  iVal;.    *piOff
22860 20 3d 20 69 20 2b 20 73 71 6c 69 74 65 33 46 74   = i + sqlite3Ft
22870 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75  s5GetVarint(&pBu
22880 66 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c 29 3b  f->p[i], &iVal);
22890 0a 20 20 20 20 2a 70 69 52 6f 77 69 64 20 2b 3d  .    *piRowid +=
228a0 20 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iVal;.  }.}../*
228b0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
228c0 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 66 74  equivalent of ft
228d0 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
228e0 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 3d  ts() for detail=
228f0 6e 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20 49 6e  none mode..** In
22900 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 62   this case the b
22910 75 66 66 65 72 73 20 63 6f 6e 73 69 73 74 20 6f  uffers consist o
22920 66 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65  f a delta-encode
22930 64 20 6c 69 73 74 20 6f 66 20 72 6f 77 69 64 73  d list of rowids
22940 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
22950 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 52   void fts5MergeR
22960 6f 77 69 64 4c 69 73 74 73 28 0a 20 20 46 74 73  owidLists(.  Fts
22970 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22990 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
229a0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ect */.  Fts5Buf
229b0 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20  fer *p1,        
229c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
229d0 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  t list to merge 
229e0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
229f0 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  *p2             
22a00 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c       /* Second l
22a10 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
22a20 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 30 3b  ){.  int i1 = 0;
22a30 0a 20 20 69 6e 74 20 69 32 20 3d 20 30 3b 0a 20  .  int i2 = 0;. 
22a40 20 69 36 34 20 69 52 6f 77 69 64 31 20 3d 20 30   i64 iRowid1 = 0
22a50 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 32 20  ;.  i64 iRowid2 
22a60 3d 20 30 3b 0a 20 20 69 36 34 20 69 4f 75 74 20  = 0;.  i64 iOut 
22a70 3d 20 30 3b 0a 0a 20 20 46 74 73 35 42 75 66 66  = 0;..  Fts5Buff
22a80 65 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73 65 74  er out;.  memset
22a90 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (&out, 0, sizeof
22aa0 28 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69 74 65  (out));.  sqlite
22ab0 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
22ac0 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31  &p->rc, &out, p1
22ad0 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20  ->n + p2->n);.  
22ae0 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
22af0 72 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78 74 52  rn;..  fts5NextR
22b00 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69  owid(p1, &i1, &i
22b10 52 6f 77 69 64 31 29 3b 0a 20 20 66 74 73 35 4e  Rowid1);.  fts5N
22b20 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69 32  extRowid(p2, &i2
22b30 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20 77  , &iRowid2);.  w
22b40 68 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c 20 69  hile( i1>=0 || i
22b50 32 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  2>=0 ){.    if( 
22b60 69 31 3e 3d 30 20 26 26 20 28 69 32 3c 30 20 7c  i1>=0 && (i2<0 |
22b70 7c 20 69 52 6f 77 69 64 31 3c 69 52 6f 77 69 64  | iRowid1<iRowid
22b80 32 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  2) ){.      asse
22b90 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69  rt( iOut==0 || i
22ba0 52 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b 0a 20  Rowid1>iOut );. 
22bb0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
22bc0 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
22bd0 26 6f 75 74 2c 20 69 52 6f 77 69 64 31 20 2d 20  &out, iRowid1 - 
22be0 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f 75  iOut);.      iOu
22bf0 74 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20 20 20  t = iRowid1;.   
22c00 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64     fts5NextRowid
22c10 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69  (p1, &i1, &iRowi
22c20 64 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  d1);.    }else{.
22c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
22c40 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 32  ut==0 || iRowid2
22c50 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66  >iOut );.      f
22c60 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
22c70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20  endVarint(&out, 
22c80 69 52 6f 77 69 64 32 20 2d 20 69 4f 75 74 29 3b  iRowid2 - iOut);
22c90 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52  .      iOut = iR
22ca0 6f 77 69 64 32 3b 0a 20 20 20 20 20 20 69 66 28  owid2;.      if(
22cb0 20 69 31 3e 3d 30 20 26 26 20 69 52 6f 77 69 64   i1>=0 && iRowid
22cc0 31 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a 20 20  1==iRowid2 ){.  
22cd0 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f        fts5NextRo
22ce0 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52  wid(p1, &i1, &iR
22cf0 6f 77 69 64 31 29 3b 0a 20 20 20 20 20 20 7d 0a  owid1);.      }.
22d00 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f        fts5NextRo
22d10 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52  wid(p2, &i2, &iR
22d20 6f 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a 20 20  owid2);.    }.  
22d30 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  }..  fts5BufferS
22d40 77 61 70 28 26 6f 75 74 2c 20 70 31 29 3b 0a 20  wap(&out, p1);. 
22d50 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
22d60 26 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &out);.}../*.** 
22d70 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20 70  Buffers p1 and p
22d80 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73  2 contain doclis
22d90 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
22da0 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e  n merges the con
22db0 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74  tent.** of the t
22dc0 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65  wo doclists toge
22dd0 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62 75  ther and sets bu
22de0 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20 72  ffer p1 to the r
22df0 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20  esult before.** 
22e00 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
22e10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
22e20 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
22e30 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d  de is left in p-
22e40 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  >rc. If an error
22e50 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
22e60 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
22e70 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
22e80 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
22e90 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65 66  id fts5MergePref
22ea0 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49  ixLists(.  Fts5I
22eb0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
22ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
22ed0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
22ee0 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
22ef0 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20  r *p1,          
22f00 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22f10 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f  list to merge */
22f20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
22f30 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
22f40 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73     /* Second lis
22f50 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b  t to merge */.){
22f60 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a  .  if( p2->n ){.
22f70 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77      i64 iLastRow
22f80 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35  id = 0;.    Fts5
22f90 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b 0a  DoclistIter i1;.
22fa0 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
22fb0 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73 35  ter i2;.    Fts5
22fc0 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20 20 20  Buffer out;.    
22fd0 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 3b 0a  Fts5Buffer tmp;.
22fe0 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c      memset(&out,
22ff0 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29   0, sizeof(out))
23000 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 6d  ;.    memset(&tm
23010 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 6d 70  p, 0, sizeof(tmp
23020 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ));..    sqlite3
23030 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
23040 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d  p->rc, &out, p1-
23050 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 20  >n + p2->n);.   
23060 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
23070 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a 20  Init(p1, &i1);. 
23080 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
23090 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29 3b  erInit(p2, &i2);
230a0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
230b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
230c0 28 69 31 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20  (i1.aPoslist!=0 
230d0 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74 21 3d  || i2.aPoslist!=
230e0 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  0) ){.      if( 
230f0 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c  i2.aPoslist==0 |
23100 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 20 26  | (i1.aPoslist &
23110 26 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69  & i1.iRowid<i2.i
23120 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20  Rowid) ){.      
23130 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20    /* Copy entry 
23140 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20  from i1 */.     
23150 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
23160 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
23170 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f  astRowid, i1.iRo
23180 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
23190 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
231a0 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e  ndBlob(&out, i1.
231b0 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
231c0 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b  slist+i1.nSize);
231d0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
231e0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
231f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23200 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61 50 6f   else if( i1.aPo
23210 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 69  slist==0 || i2.i
23220 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69 64  Rowid!=i1.iRowid
23230 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
23240 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69  opy entry from i
23250 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  2 */.        fts
23260 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
23270 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77  d(&out, iLastRow
23280 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a  id, i2.iRowid);.
23290 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
232a0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
232b0 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c 69  (&out, i2.aPosli
232c0 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2b  st, i2.nPoslist+
232d0 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  i2.nSize);.     
232e0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
232f0 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20  erNext(&i2);.   
23300 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b     }.      else{
23310 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 50 6f  .        i64 iPo
23320 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s1 = 0;.        
23330 69 36 34 20 69 50 6f 73 32 20 3d 20 30 3b 0a 20  i64 iPos2 = 0;. 
23340 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 31         int iOff1
23350 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
23360 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a 20 20 20  t iOff2 = 0;.   
23370 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20 26 69       u8 *a1 = &i
23380 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31 2e 6e 53  1.aPoslist[i1.nS
23390 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  ize];.        u8
233a0 20 2a 61 32 20 3d 20 26 69 32 2e 61 50 6f 73 6c   *a2 = &i2.aPosl
233b0 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a  ist[i2.nSize];..
233c0 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
233d0 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72  istWriter writer
233e0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
233f0 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
23400 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20  eof(writer));.. 
23410 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20         /* Merge 
23420 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e  the two position
23430 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20   lists. */ .    
23440 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
23450 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
23460 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
23470 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
23480 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74  ts5BufferZero(&t
23490 6d 70 29 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  mp);..        sq
234a0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
234b0 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50  Next64(a1, i1.nP
234c0 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20  oslist, &iOff1, 
234d0 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20  &iPos1);.       
234e0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
234f0 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
23500 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
23510 32 2c 20 26 69 50 6f 73 32 29 3b 0a 0a 20 20 20  2, &iPos2);..   
23520 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
23530 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23540 28 69 50 6f 73 31 3e 3d 30 20 7c 7c 20 69 50 6f  (iPos1>=0 || iPo
23550 73 32 3e 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  s2>=0) ){.      
23560 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a 20 20      i64 iNew;.  
23570 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
23580 32 3c 30 20 7c 7c 20 28 69 50 6f 73 31 3e 3d 30  2<0 || (iPos1>=0
23590 20 26 26 20 69 50 6f 73 31 3c 69 50 6f 73 32 29   && iPos1<iPos2)
235a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
235b0 69 4e 65 77 20 3d 20 69 50 6f 73 31 3b 0a 20 20  iNew = iPos1;.  
235c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
235d0 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
235e0 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69  64(a1, i1.nPosli
235f0 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f  st, &iOff1, &iPo
23600 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  s1);.          }
23610 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23620 20 20 69 4e 65 77 20 3d 20 69 50 6f 73 32 3b 0a    iNew = iPos2;.
23630 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23640 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
23650 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73  xt64(a2, i2.nPos
23660 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69  list, &iOff2, &i
23670 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos2);.         
23680 20 20 20 69 66 28 20 69 50 6f 73 31 3d 3d 69 50     if( iPos1==iP
23690 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os2 ){.         
236a0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
236b0 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31  PoslistNext64(a1
236c0 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i1.nPoslist, &
236d0 69 4f 66 66 31 2c 26 69 50 6f 73 31 29 3b 0a 20  iOff1,&iPos1);. 
236e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
236f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23700 20 20 20 69 66 28 20 69 4e 65 77 21 3d 77 72 69     if( iNew!=wri
23710 74 65 72 2e 69 50 72 65 76 20 7c 7c 20 74 6d 70  ter.iPrev || tmp
23720 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
23730 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
23740 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57  ite3Fts5PoslistW
23750 72 69 74 65 72 41 70 70 65 6e 64 28 26 74 6d 70  riterAppend(&tmp
23760 2c 20 26 77 72 69 74 65 72 2c 20 69 4e 65 77 29  , &writer, iNew)
23770 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23780 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
23790 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54   /* WRITEPOSLIST
237a0 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  SIZE */.        
237b0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
237c0 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c  pendVarint(&out,
237d0 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20   tmp.n * 2);.   
237e0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
237f0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f  afeAppendBlob(&o
23800 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70 2e 6e  ut, tmp.p, tmp.n
23810 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
23820 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
23830 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  i1);.        fts
23840 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
23850 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (&i2);.      }. 
23860 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
23870 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
23880 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70  p1, out.n, out.p
23890 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
238a0 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20  rFree(&tmp);.   
238b0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
238c0 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  &out);.  }.}..st
238d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
238e0 74 75 70 50 72 65 66 69 78 49 74 65 72 28 0a 20  tupPrefixIter(. 
238f0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61   /* Index to rea
23920 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
23930 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20  bDesc,          
23940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23950 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42  rue for "ORDER B
23960 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f  Y rowid DESC" */
23970 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f  .  const u8 *pTo
23980 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
23990 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
239a0 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74  taining prefix t
239b0 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74  o match */.  int
239c0 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20   nToken,        
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
239e0 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
239f0 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a  Token in bytes *
23a00 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
23a10 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20  pColset,        
23a20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20      /* Restrict 
23a30 6d 61 74 63 68 65 73 20 74 6f 20 74 68 65 73 65  matches to these
23a40 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74   columns */.  Ft
23a50 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70  s5IndexIter **pp
23a60 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Iter          /*
23a70 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74   OUT: New iterat
23a80 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  or */.){.  Fts5S
23a90 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
23aa0 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t;.  Fts5Buffer 
23ab0 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69  *aBuf;.  const i
23ac0 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20  nt nBuf = 32;.. 
23ad0 20 76 6f 69 64 20 28 2a 78 4d 65 72 67 65 29 28   void (*xMerge)(
23ae0 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
23af0 42 75 66 66 65 72 2a 2c 20 46 74 73 35 42 75 66  Buffer*, Fts5Buf
23b00 66 65 72 2a 29 3b 0a 20 20 69 6e 74 20 28 2a 78  fer*);.  int (*x
23b10 41 70 70 65 6e 64 29 28 46 74 73 35 49 6e 64 65  Append)(Fts5Inde
23b20 78 2a 2c 20 69 36 34 2c 20 46 74 73 35 49 6e 64  x*, i64, Fts5Ind
23b30 65 78 49 74 65 72 2a 2c 20 46 74 73 35 43 6f 6c  exIter*, Fts5Col
23b40 73 65 74 2a 2c 20 46 74 73 35 42 75 66 66 65 72  set*, Fts5Buffer
23b50 2a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f  *);.  if( p->pCo
23b60 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
23b70 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
23b80 29 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d 20  ){.    xMerge = 
23b90 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69  fts5MergeRowidLi
23ba0 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e 64  sts;.    xAppend
23bb0 20 3d 20 66 74 73 35 41 70 70 65 6e 64 52 6f 77   = fts5AppendRow
23bc0 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  id;.  }else{.   
23bd0 20 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65   xMerge = fts5Me
23be0 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 3b 0a  rgePrefixLists;.
23bf0 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66 74      xAppend = ft
23c00 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 3b  s5AppendPoslist;
23c10 0a 20 20 7d 0a 0a 20 20 61 42 75 66 20 3d 20 28  .  }..  aBuf = (
23c20 46 74 73 35 42 75 66 66 65 72 2a 29 66 74 73 35  Fts5Buffer*)fts5
23c30 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
23c40 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 2a  eof(Fts5Buffer)*
23c50 6e 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74  nBuf);.  pStruct
23c60 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
23c70 52 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20  Read(p);..  if( 
23c80 61 42 75 66 20 26 26 20 70 53 74 72 75 63 74 20  aBuf && pStruct 
23c90 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
23ca0 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44   flags = FTS5IND
23cb0 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 3b 0a 20  EX_QUERY_SCAN;. 
23cc0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 36     int i;.    i6
23cd0 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30  4 iLastRowid = 0
23ce0 3b 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 49  ;.    Fts5IndexI
23cf0 74 65 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20  ter *p1 = 0;    
23d00 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65   /* Iterator use
23d10 64 20 74 6f 20 67 61 74 68 65 72 20 64 61 74 61  d to gather data
23d20 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20   from index */. 
23d30 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61     Fts5Data *pDa
23d40 74 61 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  ta;.    Fts5Buff
23d50 65 72 20 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20  er doclist;.    
23d60 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 31  int bNewTerm = 1
23d70 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ;..    memset(&d
23d80 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f  oclist, 0, sizeo
23d90 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20  f(doclist));.   
23da0 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
23db0 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
23dc0 2c 20 31 2c 20 66 6c 61 67 73 2c 20 70 54 6f 6b  , 1, flags, pTok
23dd0 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20  en, nToken, -1, 
23de0 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20 20  0, &p1);.       
23df0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
23e00 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20  f(p, p1)==0;.   
23e10 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
23e20 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c 20 26  erNext2(p, p1, &
23e30 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20 29 7b  bNewTerm).    ){
23e40 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
23e50 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
23e60 72 52 6f 77 69 64 28 70 31 29 3b 0a 20 20 20 20  rRowid(p1);.    
23e70 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20    int nTerm;.   
23e80 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65     const u8 *pTe
23e90 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  rm = fts5MultiIt
23ea0 65 72 54 65 72 6d 28 70 31 2c 20 26 6e 54 65 72  erTerm(p1, &nTer
23eb0 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  m);.      assert
23ec0 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b  _nc( memcmp(pTok
23ed0 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e  en, pTerm, MIN(n
23ee0 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d  Token, nTerm))<=
23ef0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  0 );.      if( b
23f00 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  NewTerm ){.     
23f10 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f     if( nTerm<nTo
23f20 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54  ken || memcmp(pT
23f30 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f  oken, pTerm, nTo
23f40 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ken) ) break;.  
23f50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
23f60 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 26 26 20   doclist.n>0 && 
23f70 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77  iRowid<=iLastRow
23f80 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  id ){.        fo
23f90 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
23fa0 4c 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69  LITE_OK && docli
23fb0 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  st.n; i++){.    
23fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
23fd0 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20  nBuf );.        
23fe0 20 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d    if( aBuf[i].n=
23ff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24000 20 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70    fts5BufferSwap
24010 28 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66  (&doclist, &aBuf
24020 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
24030 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
24040 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  (&doclist);.    
24050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24060 20 20 20 20 20 20 20 20 20 78 4d 65 72 67 65 28           xMerge(
24070 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42  p, &doclist, &aB
24080 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
24090 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
240a0 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  ro(&aBuf[i]);.  
240b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
240c0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4c 61 73    }.        iLas
240d0 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  tRowid = 0;.    
240e0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 21    }..      if( !
240f0 78 41 70 70 65 6e 64 28 70 2c 20 69 52 6f 77 69  xAppend(p, iRowi
24100 64 2d 69 4c 61 73 74 52 6f 77 69 64 2c 20 70 31  d-iLastRowid, p1
24110 2c 20 70 43 6f 6c 73 65 74 2c 20 26 64 6f 63 6c  , pColset, &docl
24120 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
24130 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f  iLastRowid = iRo
24140 77 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  wid;.      }.   
24150 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   }..    for(i=0;
24160 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20   i<nBuf; i++){. 
24170 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
24180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24190 20 20 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26       xMerge(p, &
241a0 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69  doclist, &aBuf[i
241b0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
241c0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
241d0 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20  (&aBuf[i]);.    
241e0 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  }.    fts5MultiI
241f0 74 65 72 46 72 65 65 28 70 2c 20 70 31 29 3b 0a  terFree(p, p1);.
24200 0a 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73  .    pData = fts
24210 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
24220 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b  zeof(Fts5Data) +
24230 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20   doclist.n);.   
24240 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
24250 20 20 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28      pData->p = (
24260 75 38 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20  u8*)&pData[1];. 
24270 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d       pData->nn =
24280 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d   pData->szLeaf =
24290 20 64 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20   doclist.n;.    
242a0 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2d 3e    memcpy(pData->
242b0 70 2c 20 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f  p, doclist.p, do
242c0 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20  clist.n);.      
242d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
242e0 32 28 70 2c 20 70 44 61 74 61 2c 20 62 44 65 73  2(p, pData, bDes
242f0 63 2c 20 70 70 49 74 65 72 29 3b 0a 20 20 20 20  c, ppIter);.    
24300 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
24310 46 72 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a  Free(&doclist);.
24320 20 20 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63    }..  fts5Struc
24330 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
24340 75 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  uct);.  sqlite3_
24350 66 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a  free(aBuf);.}...
24360 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
24370 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65  hat all subseque
24380 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
24390 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
243a0 65 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74  e() pertain.** t
243b0 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77  o the document w
243c0 69 74 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64  ith rowid iRowid
243d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
243e0 46 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72  Fts5IndexBeginWr
243f0 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ite(Fts5Index *p
24400 2c 20 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 69  , int bDelete, i
24410 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73  64 iRowid){.  as
24420 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
24430 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20  ITE_OK );..  /* 
24440 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73  Allocate the has
24450 68 20 74 61 62 6c 65 20 69 66 20 69 74 20 68 61  h table if it ha
24460 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
24470 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
24480 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d    if( p->pHash==
24490 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 ){.    p->rc =
244a0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
244b0 4e 65 77 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20  New(p->pConfig, 
244c0 26 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e  &p->pHash, &p->n
244d0 50 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20  PendingData);.  
244e0 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68  }..  /* Flush th
244f0 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  e hash table to 
24500 64 69 73 6b 20 69 66 20 72 65 71 75 69 72 65 64  disk if required
24510 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77 69 64   */.  if( iRowid
24520 3c 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20  <p->iWriteRowid 
24530 0a 20 20 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d  .   || (iRowid==
24540 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 26  p->iWriteRowid &
24550 26 20 70 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29  & p->bDelete==0)
24560 0a 20 20 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64  .   || (p->nPend
24570 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f  ingData > p->pCo
24580 6e 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29  nfig->nHashSize)
24590 20 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49   .  ){.    fts5I
245a0 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20  ndexFlush(p);.  
245b0 7d 0a 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f  }..  p->iWriteRo
245c0 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
245d0 70 2d 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65  p->bDelete = bDe
245e0 6c 65 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66  lete;.  return f
245f0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
24600 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
24610 69 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e  it data to disk.
24620 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
24630 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73  ts5IndexSync(Fts
24640 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62  5Index *p, int b
24650 43 6f 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72  Commit){.  asser
24660 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
24670 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64  _OK );.  fts5Ind
24680 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66  exFlush(p);.  if
24690 28 20 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35  ( bCommit ) fts5
246a0 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
246b0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
246c0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
246d0 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e  /*.** Discard an
246e0 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
246f0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
24700 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e  ash tables. Do n
24710 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74  ot write it.** t
24720 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
24730 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73  Additionally, as
24740 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f  sume that the co
24750 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f  ntents of the %_
24760 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61  data.** table ma
24770 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f  y have changed o
24780 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69  n disk. So any i
24790 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20  n-memory caches 
247a0 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65  of %_data .** re
247b0 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e  cords must be in
247c0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e  validated..*/.in
247d0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
247e0 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49  exRollback(Fts5I
247f0 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35  ndex *p){.  fts5
24800 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
24810 20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61    fts5IndexDisca
24820 72 64 44 61 74 61 28 70 29 3b 0a 20 20 61 73 73  rdData(p);.  ass
24830 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
24840 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
24850 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24860 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61  /*.** The %_data
24870 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65   table is comple
24880 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20  tely empty when 
24890 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
248a0 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a   called. This.**
248b0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
248c0 74 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20  tes it with the 
248d0 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72  initial structur
248e0 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  e objects for ea
248f0 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64  ch index,.** and
24900 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72   the initial ver
24910 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65  sion of the "ave
24920 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61  rages" record (a
24930 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29   zero-byte blob)
24940 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24950 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28  Fts5IndexReinit(
24960 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
24970 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73   Fts5Structure s
24980 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
24990 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
249a0 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35  ucture));.  fts5
249b0 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
249c0 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
249d0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c  , (const u8*)"",
249e0 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   0);.  fts5Struc
249f0 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29  tureWrite(p, &s)
24a00 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
24a10 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
24a20 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
24a30 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ew Fts5Index han
24a40 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65  dle. If the bCre
24a50 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ate argument is 
24a60 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20  true, create.** 
24a70 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
24a80 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f  he underlying %_
24a90 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
24aa0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
24ab0 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
24ac0 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
24ad0 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
24ae0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
24af0 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20  erwise, set *pp 
24b00 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75  to NULL and retu
24b10 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
24b20 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
24b30 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
24b40 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66  Open(.  Fts5Conf
24b50 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
24b60 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20  int bCreate, .  
24b70 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a  Fts5Index **pp,.
24b80 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
24b90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24ba0 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e  ITE_OK;.  Fts5In
24bb0 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
24bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
24bd0 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70   object */..  *p
24be0 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64  p = p = (Fts5Ind
24bf0 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  ex*)sqlite3Fts5M
24c00 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
24c10 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29  izeof(Fts5Index)
24c20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
24c30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
24c40 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
24c50 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b  ig;.    p->nWork
24c60 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b  Unit = FTS5_WORK
24c70 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44  _UNIT;.    p->zD
24c80 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ataTbl = sqlite3
24c90 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
24ca0 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e   "%s_data", pCon
24cb0 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  fig->zName);.   
24cc0 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c   if( p->zDataTbl
24cd0 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20   && bCreate ){. 
24ce0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24cf0 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
24d00 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  (.          pCon
24d10 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
24d20 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
24d30 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
24d40 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
24d50 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72    );.      if( r
24d60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24d70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24d80 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
24d90 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64  ble(pConfig, "id
24da0 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  x", .           
24db0 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70   "segid, term, p
24dc0 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  gno, PRIMARY KEY
24dd0 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20  (segid, term)", 
24de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  .            1, 
24df0 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b  pzErr.        );
24e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24e10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24e20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
24e30 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
24e40 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20  xReinit(p);.    
24e50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
24e60 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
24e70 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
24e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
24e90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
24ea0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c  lite3Fts5IndexCl
24eb0 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20  ose(p);.    *pp 
24ec0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
24ed0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
24ee0 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70  lose a handle op
24ef0 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
24f00 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
24f10 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
24f20 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
24f30 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
24f40 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
24f50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24f60 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  _OK;.  if( p ){.
24f70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
24f80 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
24f90 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
24fa0 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20  e(p->pWriter);. 
24fb0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
24fc0 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  ize(p->pDeleter)
24fd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
24fe0 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72  nalize(p->pIdxWr
24ff0 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
25000 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
25010 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20  IdxDeleter);.   
25020 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
25030 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  e(p->pIdxSelect)
25040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
25050 35 48 61 73 68 46 72 65 65 28 70 2d 3e 70 48 61  5HashFree(p->pHa
25060 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sh);.    sqlite3
25070 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62  _free(p->zDataTb
25080 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
25090 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  free(p);.  }.  r
250a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
250b0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f  ** Argument p po
250c0 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
250d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d   containing utf-
250e0 38 20 74 65 78 74 20 74 68 61 74 20 69 73 20 6e  8 text that is n
250f0 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69   bytes in .** si
25100 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ze. Return the n
25110 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
25120 6e 20 74 68 65 20 6e 43 68 61 72 20 63 68 61 72  n the nChar char
25130 61 63 74 65 72 20 70 72 65 66 69 78 20 6f 66 20  acter prefix of 
25140 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f  the.** buffer, o
25150 72 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  r 0 if there are
25160 20 6c 65 73 73 20 74 68 61 6e 20 6e 43 68 61 72   less than nChar
25170 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
25180 6f 74 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  otal..*/.int sql
25190 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 68 61  ite3Fts5IndexCha
251a0 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 0a 20  rlenToBytelen(. 
251b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20   const char *p, 
251c0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 0a 20  .  int nByte, . 
251d0 20 69 6e 74 20 6e 43 68 61 72 0a 29 7b 0a 20 20   int nChar.){.  
251e0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  int n = 0;.  int
251f0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
25200 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nChar; i++){.  
25210 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29    if( n>=nByte )
25220 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
25230 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e  /* Input contain
25240 73 20 66 65 77 65 72 20 74 68 61 6e 20 6e 43 68  s fewer than nCh
25250 61 72 20 63 68 61 72 73 20 2a 2f 0a 20 20 20 20  ar chars */.    
25260 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68  if( (unsigned ch
25270 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20  ar)p[n++]>=0xc0 
25280 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
25290 28 70 5b 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30  (p[n] & 0xc0)==0
252a0 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d  x80 ) n++;.    }
252b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
252c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73  .}../*.** pIn is
252d0 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64   a UTF-8 encoded
252e0 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74   string, nIn byt
252f0 65 73 20 69 6e 20 73 69 7a 65 2e 20 52 65 74 75  es in size. Retu
25300 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
25310 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63 68 61 72  .** unicode char
25320 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 74  acters in the st
25330 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
25340 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61  int fts5IndexCha
25350 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  rlen(const char 
25360 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a  *pIn, int nIn){.
25370 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b    int nChar = 0;
25380 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
25390 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt i = 0;.  whil
253a0 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20  e( i<nIn ){.    
253b0 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68  if( (unsigned ch
253c0 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63  ar)pIn[i++]>=0xc
253d0 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  0 ){.      while
253e0 28 20 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b  ( i<nIn && (pIn[
253f0 69 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  i] & 0xc0)==0x80
25400 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) i++;.    }.  
25410 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20    nChar++;.  }. 
25420 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d   return nChar;.}
25430 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f  ../*.** Insert o
25440 72 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f  r remove data to
25450 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   or from the ind
25460 65 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  ex. Each time a 
25470 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20  document is .** 
25480 61 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f  added to or remo
25490 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  ved from the ind
254a0 65 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ex, this functio
254b0 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20  n is called one 
254c0 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73  or more.** times
254d0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ..**.** For an i
254e0 6e 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62  nsert, it must b
254f0 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
25500 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20  r each token in 
25510 74 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74  the new document
25520 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72  ..** If the oper
25530 61 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74  ation is a delet
25540 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  e, it must be ca
25550 6c 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29 20  lled (at least) 
25560 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  once for each.**
25570 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e   unique token in
25580 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
25590 74 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65  th an iCol value
255a0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e   less than zero.
255b0 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67   The iPos.** arg
255c0 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64  ument is ignored
255d0 20 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a   for a delete..*
255e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
255f0 35 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46  5IndexWrite(.  F
25600 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25620 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65  * Index to write
25630 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   to */.  int iCo
25640 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
25650 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
25660 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73  mn token appears
25670 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65   in (-ve -> dele
25680 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f  te) */.  int iPo
25690 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
256a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
256b0 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69  tion of token wi
256c0 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  thin column */. 
256d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
256e0 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20  ken, int nToken 
256f0 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64   /* Token to add
25700 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72   or remove to or
25710 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29   from index */.)
25720 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
25730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25740 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
25750 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69  terate through i
25760 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndexes */.  int 
25770 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
25780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25790 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
257a0 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
257b0 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
257c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
257d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
257e0 0a 20 20 61 73 73 65 72 74 28 20 28 69 43 6f 6c  .  assert( (iCol
257f0 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c 65 74 65 20  <0)==p->bDelete 
25800 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  );..  /* Add the
25810 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 6d 61   entry to the ma
25820 69 6e 20 74 65 72 6d 73 20 69 6e 64 65 78 2e 20  in terms index. 
25830 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
25840 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a  3Fts5HashWrite(.
25850 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68 2c 20        p->pHash, 
25860 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20  p->iWriteRowid, 
25870 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35  iCol, iPos, FTS5
25880 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c 20 70 54  _MAIN_PREFIX, pT
25890 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29  oken, nToken.  )
258a0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
258b0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
258c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
258d0 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  K; i++){.    con
258e0 73 74 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 70  st int nChar = p
258f0 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
25900 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  i];.    int nByt
25910 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  e = sqlite3Fts5I
25920 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
25930 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f  elen(pToken, nTo
25940 6b 65 6e 2c 20 6e 43 68 61 72 29 3b 0a 20 20 20  ken, nChar);.   
25950 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20   if( nByte ){.  
25960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25970 46 74 73 35 48 61 73 68 57 72 69 74 65 28 70 2d  Fts5HashWrite(p-
25980 3e 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  >pHash, .       
25990 20 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69     p->iWriteRowi
259a0 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 28  d, iCol, iPos, (
259b0 63 68 61 72 29 28 46 54 53 35 5f 4d 41 49 4e 5f  char)(FTS5_MAIN_
259c0 50 52 45 46 49 58 2b 69 2b 31 29 2c 20 70 54 6f  PREFIX+i+1), pTo
259d0 6b 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  ken,.          n
259e0 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Byte.      );.  
259f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
25a00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
25a10 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74  pen a new iterat
25a20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  or to iterate th
25a30 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69 64 20 74  ough all rowid t
25a40 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a  hat match the .*
25a50 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65  * specified toke
25a60 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69  n or token prefi
25a70 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
25a80 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
25a90 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ab0 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
25ac0 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f  to query */.  co
25ad0 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
25ae0 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a  , int nToken, /*
25af0 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69   Token (or prefi
25b00 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  x) to query for 
25b10 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
25b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b30 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
25b40 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
25b50 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
25b60 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
25b70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25b80 4d 61 74 63 68 20 74 68 65 73 65 20 63 6f 6c 75  Match these colu
25b90 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74  mns only */.  Ft
25ba0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70  s5IndexIter **pp
25bb0 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Iter          /*
25bc0 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74   OUT: New iterat
25bd0 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  or object */.){.
25be0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
25bf0 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
25c00 69 67 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49  ig;.  Fts5IndexI
25c10 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ter *pRet = 0;. 
25c20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
25c30 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20   Fts5Buffer buf 
25c40 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20  = {0, 0, 0};..  
25c50 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f  /* If the QUERY_
25c60 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74  SCAN flag is set
25c70 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67  , all other flag
25c80 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e  s must be clear.
25c90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
25ca0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
25cb0 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20  _QUERY_SCAN)==0 
25cc0 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e  || flags==FTS5IN
25cd0 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 29  DEX_QUERY_SCAN )
25ce0 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
25cf0 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
25d00 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f  p->rc, &buf, nTo
25d10 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20  ken+1)==0 ){.   
25d20 20 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31   memcpy(&buf.p[1
25d30 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  ], pToken, nToke
25d40 6e 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  n);..#ifdef SQLI
25d50 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
25d60 49 66 20 74 68 65 20 51 55 45 52 59 5f 54 45 53  If the QUERY_TES
25d70 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20 77 61 73  T_NOIDX flag was
25d80 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
25d90 20 74 68 69 73 20 6d 75 73 74 20 62 65 20 61 0a   this must be a.
25da0 20 20 20 20 2a 2a 20 70 72 65 66 69 78 2d 71 75      ** prefix-qu
25db0 65 72 79 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ery. Instead of 
25dc0 75 73 69 6e 67 20 61 20 70 72 65 66 69 78 2d 69  using a prefix-i
25dd0 6e 64 65 78 20 28 69 66 20 6f 6e 65 20 65 78 69  ndex (if one exi
25de0 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a 20 65 76  sts), .    ** ev
25df0 61 6c 75 61 74 65 20 74 68 65 20 70 72 65 66 69  aluate the prefi
25e00 78 20 71 75 65 72 79 20 75 73 69 6e 67 20 74 68  x query using th
25e10 65 20 6d 61 69 6e 20 46 54 53 20 69 6e 64 65 78  e main FTS index
25e20 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20  . This is used. 
25e30 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74 65 72 6e     ** for intern
25e40 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
25e50 6e 67 20 62 79 20 74 68 65 20 69 6e 74 65 67 72  ng by the integr
25e60 69 74 79 2d 63 68 65 63 6b 20 69 6e 20 64 65 62  ity-check in deb
25e70 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  ug .    ** mode 
25e80 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  only.  */.    if
25e90 28 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66  ( pConfig->bPref
25ea0 69 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66  ixIndex==0 || (f
25eb0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
25ec0 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44  _QUERY_TEST_NOID
25ed0 58 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  X) ){.      asse
25ee0 72 74 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  rt( flags & FTS5
25ef0 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
25f00 49 58 20 29 3b 0a 20 20 20 20 20 20 69 49 64 78  IX );.      iIdx
25f10 20 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50   = 1+pConfig->nP
25f20 72 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65  refix;.    }else
25f30 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
25f40 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
25f50 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29  X_QUERY_PREFIX )
25f60 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 68 61  {.      int nCha
25f70 72 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61  r = fts5IndexCha
25f80 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f  rlen(pToken, nTo
25f90 6b 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ken);.      for(
25fa0 69 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43  iIdx=1; iIdx<=pC
25fb0 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
25fc0 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iIdx++){.       
25fd0 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50   if( pConfig->aP
25fe0 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e  refix[iIdx-1]==n
25ff0 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  Char ) break;.  
26000 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
26010 20 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66   if( iIdx<=pConf
26020 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20  ig->nPrefix ){. 
26030 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
26040 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74  re *pStruct = ft
26050 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
26060 70 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b  p);.      buf.p[
26070 30 5d 20 3d 20 28 75 38 29 28 46 54 53 35 5f 4d  0] = (u8)(FTS5_M
26080 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64  AIN_PREFIX + iId
26090 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  x);.      if( pS
260a0 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20  truct ){.       
260b0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
260c0 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31 2c  w(p, pStruct, 1,
260d0 20 66 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20 6e   flags, buf.p, n
260e0 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20  Token+1, -1, 0, 
260f0 26 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  &pRet);.        
26100 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
26110 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
26120 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26130 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 73  {.      int bDes
26140 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53  c = (flags & FTS
26150 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
26160 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75 66  C)!=0;.      buf
26170 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41 49  .p[0] = FTS5_MAI
26180 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20 20  N_PREFIX;.      
26190 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49  fts5SetupPrefixI
261a0 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62 75  ter(p, bDesc, bu
261b0 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 70  f.p, nToken+1, p
261c0 43 6f 6c 73 65 74 2c 20 26 70 52 65 74 29 3b 0a  Colset, &pRet);.
261d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
261e0 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
261f0 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
26200 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  se(pRet);.      
26210 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
26220 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
26230 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  p);.    }.    *p
26240 70 49 74 65 72 20 3d 20 70 52 65 74 3b 0a 20 20  pIter = pRet;.  
26250 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
26260 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20  ferFree(&buf);. 
26270 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35   }.  return fts5
26280 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
26290 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
262a0 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72  true if the iter
262b0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
262c0 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
262d0 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 69   is at EOF..*/.i
262e0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
262f0 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49  erEof(Fts5IndexI
26300 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61  ter *pIter){.  a
26310 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49  ssert( pIter->pI
26320 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  ndex->rc==SQLITE
26330 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _OK );.  return 
26340 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a  pIter->bEof;.}..
26350 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
26360 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
26370 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  rowid. .*/.int s
26380 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
26390 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  xt(Fts5IndexIter
263a0 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
263b0 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
263c0 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
263d0 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49   );.  fts5MultiI
263e0 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70  terNext(pIter->p
263f0 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30 2c  Index, pIter, 0,
26400 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74   0);.  return ft
26410 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
26420 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
26430 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
26440 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
26450 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65   term/rowid. Use
26460 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f 63  d by the fts5voc
26470 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e  ab module..*/.in
26480 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
26490 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e  rNextScan(Fts5In
264a0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
264b0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20  .  Fts5Index *p 
264c0 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b  = pIter->pIndex;
264d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
264e0 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
264f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66  QLITE_OK );..  f
26500 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
26510 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
26520 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
26530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26540 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
26550 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
26560 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
26570 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
26580 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
26590 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70   && pSeg->term.p
265a0 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50  [0]!=FTS5_MAIN_P
265b0 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66  REFIX ){.      f
265c0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
265d0 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  Seg->pLeaf);.   
265e0 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d     pSeg->pLeaf =
265f0 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   0;.      pIter-
26600 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  >bEof = 1;.    }
26610 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66  .  }..  return f
26620 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
26630 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
26640 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
26650 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
26660 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63  g rowid that occ
26670 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20  urs at or after 
26680 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64  iMatch. The.** d
26690 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74  efinition of "at
266a0 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e   or after" depen
266b0 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ds on whether th
266c0 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72  is iterator iter
266d0 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  ates.** in ascen
266e0 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69  ding or descendi
266f0 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a  ng rowid order..
26700 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
26710 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46  s5IterNextFrom(F
26720 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
26730 74 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29  ter, i64 iMatch)
26740 7b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  {.  fts5MultiIte
26750 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d  rNextFrom(pIter-
26760 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20  >pIndex, pIter, 
26770 69 4d 61 74 63 68 29 3b 0a 20 20 72 65 74 75 72  iMatch);.  retur
26780 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
26790 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
267a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
267b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
267c0 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  wid..*/.i64 sqli
267d0 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64  te3Fts5IterRowid
267e0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
267f0 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
26800 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
26810 77 69 64 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  wid(pIter);.}../
26820 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
26830 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f  current term..*/
26840 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
26850 69 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d  ite3Fts5IterTerm
26860 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
26870 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b  pIter, int *pn){
26880 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
26890 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
268a0 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75 6c  st char*)fts5Mul
268b0 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
268c0 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e  , &n);.  *pn = n
268d0 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b  -1;.  return &z[
268e0 31 5d 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69  1];.}...static i
268f0 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72  nt fts5IndexExtr
26900 61 63 74 43 6f 6c 73 65 74 20 28 0a 20 20 46 74  actColset (.  Ft
26910 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
26920 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
26930 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65   Colset to filte
26940 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  r on */.  const 
26950 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50  u8 *pPos, int nP
26960 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  os,       /* Pos
26970 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
26980 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
269b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
269c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
269d0 6e 74 20 69 3b 0a 0a 20 20 66 74 73 35 42 75 66  nt i;..  fts5Buf
269e0 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
269f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
26a00 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  set->nCol; i++){
26a10 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
26a20 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20  Sub = pPos;.    
26a30 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35 49  int nSub = fts5I
26a40 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26  ndexExtractCol(&
26a50 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c  pSub, nPos, pCol
26a60 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a  set->aiCol[i]);.
26a70 20 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b 0a      if( nSub ){.
26a80 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
26a90 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20  AppendBlob(&rc, 
26aa0 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62  pBuf, nSub, pSub
26ab0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
26ac0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
26ad0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
26ae0 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
26af0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 6f   containing a co
26b00 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  py of the positi
26b10 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 74  on list for.** t
26b20 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
26b30 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  . Output variabl
26b40 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f 20  e *pn is set to 
26b50 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
26b60 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62 79  buffer .** in by
26b70 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  tes before retur
26b80 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ning..**.** The 
26b90 72 65 74 75 72 6e 65 64 20 70 6f 73 69 74 69 6f  returned positio
26ba0 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20  n list does not 
26bb0 69 6e 63 6c 75 64 65 20 74 68 65 20 22 6e 75 6d  include the "num
26bc0 62 65 72 20 6f 66 20 62 79 74 65 73 22 20 76 61  ber of bytes" va
26bd0 72 69 6e 74 0a 2a 2a 20 66 69 65 6c 64 20 74 68  rint.** field th
26be0 61 74 20 73 74 61 72 74 73 20 74 68 65 20 70 6f  at starts the po
26bf0 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20 64  sition list on d
26c00 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
26c10 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
26c20 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 49  st(.  Fts5IndexI
26c30 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 46  ter *pIter, .  F
26c40 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
26c50 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  et,            /
26c60 2a 20 43 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 20  * Column filter 
26c70 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63  (or NULL) */.  c
26c80 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 20 20  onst u8 **pp,   
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ca0 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  * OUT: Pointer t
26cb0 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  o position-list 
26cc0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  data */.  int *p
26cd0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
26ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26cf0 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74 69  : Size of positi
26d00 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79 74 65 73  on-list in bytes
26d10 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 52 6f 77   */.  i64 *piRow
26d20 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
26d30 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 75        /* OUT: Cu
26d40 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 29  rrent rowid */.)
26d50 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
26d60 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
26d70 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
26d80 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
26d90 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d  .  int eDetail =
26da0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
26db0 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
26dc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
26dd0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
26de0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a  SQLITE_OK );.  *
26df0 70 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  piRowid = pSeg->
26e00 69 52 6f 77 69 64 3b 0a 20 20 69 66 28 20 65 44  iRowid;.  if( eD
26e10 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
26e20 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 2a  IL_NONE ){.    *
26e30 70 6e 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b  pn = pSeg->nPos;
26e40 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 65  .  }else.  if( e
26e50 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
26e60 41 49 4c 5f 46 55 4c 4c 20 0a 20 20 20 26 26 20  AIL_FULL .   && 
26e70 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
26e80 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53  t+pSeg->nPos<=pS
26e90 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  eg->pLeaf->szLea
26ea0 66 20 0a 20 20 29 7b 0a 20 20 20 20 75 38 20 2a  f .  ){.    u8 *
26eb0 70 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70 4c  pPos = &pSeg->pL
26ec0 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65  eaf->p[pSeg->iLe
26ed0 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69  afOffset];.    i
26ee0 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c  f( pColset==0 ||
26ef0 20 70 49 74 65 72 2d 3e 62 46 69 6c 74 65 72 65   pIter->bFiltere
26f00 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 20 3d  d ){.      *pn =
26f10 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20   pSeg->nPos;.   
26f20 20 20 20 2a 70 70 20 3d 20 70 50 6f 73 3b 0a 20     *pp = pPos;. 
26f30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f     }else if( pCo
26f40 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b  lset->nCol==1 ){
26f50 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 50 6f  .      *pp = pPo
26f60 73 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 66  s;.      *pn = f
26f70 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
26f80 6f 6c 28 70 70 2c 20 70 53 65 67 2d 3e 6e 50 6f  ol(pp, pSeg->nPo
26f90 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  s, pColset->aiCo
26fa0 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  l[0]);.    }else
26fb0 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
26fc0 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
26fd0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66  oslist);.      f
26fe0 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
26ff0 6f 6c 73 65 74 28 70 43 6f 6c 73 65 74 2c 20 70  olset(pColset, p
27000 50 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c  Pos, pSeg->nPos,
27010 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
27020 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  );.      *pp = p
27030 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
27040 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 70 49 74  .      *pn = pIt
27050 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20  er->poslist.n;. 
27060 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
27070 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
27080 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
27090 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74  );.    fts5Segit
270a0 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d  erPoslist(pIter-
270b0 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70  >pIndex, pSeg, p
270c0 43 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e  Colset, &pIter->
270d0 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 69 66  poslist);.    if
270e0 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
270f0 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20  DETAIL_FULL ){. 
27100 20 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72       *pp = pIter
27110 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
27120 20 7d 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49 74   }.    *pn = pIt
27130 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20  er->poslist.n;. 
27140 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35   }.  return fts5
27150 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65  IndexReturn(pIte
27160 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 69  r->pIndex);.}..i
27170 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
27180 65 72 43 6f 6c 6c 69 73 74 28 0a 20 20 46 74 73  erCollist(.  Fts
27190 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
271a0 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  r, .  const u8 *
271b0 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
271c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
271d0 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f  inter to positio
271e0 6e 2d 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20  n-list data */. 
271f0 20 69 6e 74 20 2a 70 6e 20 20 20 20 20 20 20 20   int *pn        
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
27220 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69   position-list i
27230 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
27240 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
27250 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Index->pConfig->
27260 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
27270 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a  TAIL_COLUMNS );.
27280 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e 70    *pp = pIter->p
27290 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 2a 70 6e 20  oslist.p;.  *pn 
272a0 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
272b0 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .n;.  return SQL
272c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
272d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
272e0 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
272f0 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
27300 69 73 74 28 29 2c 20 65 78 63 65 70 74 20 74 68  ist(), except th
27310 61 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65 73 20  at it.** copies 
27320 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
27330 74 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  t into the buffe
27340 72 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68  r supplied as th
27350 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67  e second .** arg
27360 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
27370 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
27380 6c 69 73 74 42 75 66 66 65 72 28 46 74 73 35 49  listBuffer(Fts5I
27390 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
273a0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
273b0 66 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  f){.  Fts5Index 
273c0 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64  *p = pIter->pInd
273d0 65 78 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65  ex;.  Fts5SegIte
273e0 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
273f0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
27400 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
27410 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ];.  assert( p->
27420 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
27430 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
27440 6f 28 70 42 75 66 29 3b 0a 20 20 66 74 73 35 53  o(pBuf);.  fts5S
27450 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c  egiterPoslist(p,
27460 20 70 53 65 67 2c 20 30 2c 20 70 42 75 66 29 3b   pSeg, 0, pBuf);
27470 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
27480 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
27490 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
274a0 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20  iterator opened 
274b0 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
274c0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ll to sqlite3Fts
274d0 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a  5IndexQuery()..*
274e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
274f0 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35  s5IterClose(Fts5
27500 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
27510 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
27520 7b 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20  {.    Fts5Index 
27530 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d  *pIndex = pIter-
27540 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73  >pIndex;.    fts
27550 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
27560 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
27570 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c  ter);.    fts5Cl
27580 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78  oseReader(pIndex
27590 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
275a0 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20  Read and decode 
275b0 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
275c0 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64  ecord from the d
275d0 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  atabase. .**.** 
275e0 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65  Parameter anSize
275f0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
27600 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20  n array of size 
27610 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c  nCol, where nCol
27620 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   is.** the numbe
27630 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65  r of user define
27640 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
27650 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   FTS table..*/.i
27660 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
27670 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
27680 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
27690 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e   *pnRow, i64 *an
276a0 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f  Size){.  int nCo
276b0 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
276c0 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61  nCol;.  Fts5Data
276d0 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52   *pData;..  *pnR
276e0 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ow = 0;.  memset
276f0 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65  (anSize, 0, size
27700 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b  of(i64) * nCol);
27710 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
27720 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
27730 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b  AVERAGES_ROWID);
27740 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
27750 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
27760 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ->nn ){.    int 
27770 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
27780 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74  Col;.    i += ft
27790 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
277a0 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29  ta->p[i], (u64*)
277b0 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28  pnRow);.    for(
277c0 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d  iCol=0; i<pData-
277d0 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c  >nn && iCol<nCol
277e0 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
277f0 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
27800 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d  int(&pData->p[i]
27810 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b  , (u64*)&anSize[
27820 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  iCol]);.    }.  
27830 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  }..  fts5DataRel
27840 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72  ease(pData);.  r
27850 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
27860 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
27870 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
27880 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73  urrent "averages
27890 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68  " record with th
278a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
278b0 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70  e buffer .** sup
278c0 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63  plied as the sec
278d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
278e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
278f0 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
27900 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63  (Fts5Index *p, c
27910 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
27920 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73  int nData){.  as
27930 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
27940 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
27950 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
27960 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
27970 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  , pData, nData);
27980 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
27990 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
279a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
279b0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
279c0 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f  f blocks this mo
279d0 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72  dule has read fr
279e0 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  om the %_data.**
279f0 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20   table since it 
27a00 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  was created..*/.
27a10 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
27a20 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e  ndexReads(Fts5In
27a30 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  dex *p){.  retur
27a40 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f  n p->nRead;.}../
27a50 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d  *.** Set the 32-
27a60 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  bit cookie value
27a70 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
27a80 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75  tart of all stru
27a90 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64  cture .** record
27aa0 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  s to the value p
27ab0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
27ac0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
27ad0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
27ae0 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
27af0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
27b00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
27b10 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
27b20 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
27b30 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f  3Fts5IndexSetCoo
27b40 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  kie(Fts5Index *p
27b50 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69  , int iNew){.  i
27b60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
27b90 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
27ba0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
27bb0 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20  >pConfig;    /* 
27bc0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62  Configuration ob
27bd0 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f  ject */.  u8 aCo
27be0 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20  okie[4];        
27bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27c00 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65  * Binary represe
27c10 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20  ntation of iNew 
27c20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
27c30 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20  b *pBlob = 0;.. 
27c40 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
27c50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
27c60 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
27c70 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a  aCookie, iNew);.
27c80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
27c90 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
27ca0 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  g->db, pConfig->
27cb0 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
27cc0 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22  , .      "block"
27cd0 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
27ce0 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f  _ROWID, 1, &pBlo
27cf0 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  b.  );.  if( rc=
27d00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27d10 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77    sqlite3_blob_w
27d20 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f  rite(pBlob, aCoo
27d30 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  kie, 4, 0);.    
27d40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
27d50 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a  b_close(pBlob);.
27d60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
27d70 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
27d80 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e  Fts5IndexLoadCon
27d90 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70  fig(Fts5Index *p
27da0 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
27db0 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70  re *pStruct;.  p
27dc0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
27dd0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
27de0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
27df0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
27e00 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
27e10 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
27e20 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
27e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
27e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27eb0 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
27ec0 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
27ed0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
27ee0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
27ef0 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63  y-check .** func
27f00 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f  tionality..*/../
27f10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69  *.** Return a si
27f20 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61  mple checksum va
27f30 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  lue based on the
27f40 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75   arguments..*/.u
27f50 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  64 sqlite3Fts5In
27f60 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20  dexEntryCksum(. 
27f70 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
27f80 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74  int iCol, .  int
27f90 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49   iPos, .  int iI
27fa0 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
27fb0 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e   *pTerm,.  int n
27fc0 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Term.){.  int i;
27fd0 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f  .  u64 ret = iRo
27fe0 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  wid;.  ret += (r
27ff0 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20  et<<3) + iCol;. 
28000 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
28010 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69   + iPos;.  if( i
28020 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20  Idx>=0 ) ret += 
28030 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35  (ret<<3) + (FTS5
28040 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
28050 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Idx);.  for(i=0;
28060 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72   i<nTerm; i++) r
28070 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
28080 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74   pTerm[i];.  ret
28090 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64  urn ret;.}..#ifd
280a0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
280b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
280c0 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e  ion is purely an
280d0 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
280e0 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
280f0 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
28100 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
28110 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
28120 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
28130 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
28140 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74  Instead, it test
28150 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  s that the same 
28160 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69  set of pgno/rowi
28170 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  d combinations a
28180 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72  re .** visited r
28190 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
281a0 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74  ther the doclist
281b0 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65  -index identifie
281c0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a  d by parameters.
281d0 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20  ** iSegid/iLeaf 
281e0 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66  is iterated in f
281f0 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72  orwards or rever
28200 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  se order..*/.sta
28210 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
28220 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20  tDlidxReverse(. 
28230 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
28240 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20    int iSegid,   
28250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28260 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
28270 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a  to load from */.
28280 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20    int iLeaf     
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282a0 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73    /* Load doclis
282b0 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73  t-index for this
282c0 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74   leaf */.){.  Ft
282d0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
282e0 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63  idx = 0;.  u64 c
282f0 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36  ksum1 = 13;.  u6
28300 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a  4 cksum2 = 13;..
28310 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
28320 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
28330 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65  , 0, iSegid, iLe
28340 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  af);.      fts5D
28350 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
28360 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
28370 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
28380 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20  xt(p, pDlidx).  
28390 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
283a0 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  d = fts5DlidxIte
283b0 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a  rRowid(pDlidx);.
283c0 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66      int pgno = f
283d0 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
283e0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73  (pDlidx);.    as
283f0 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66  sert( pgno>iLeaf
28400 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b   );.    cksum1 +
28410 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
28420 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
28430 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
28440 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
28450 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f  Dlidx = 0;..  fo
28460 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
28470 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c  dxIterInit(p, 1,
28480 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b   iSegid, iLeaf);
28490 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
284a0 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
284b0 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  x)==0;.      fts
284c0 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70  5DlidxIterPrev(p
284d0 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  , pDlidx).  ){. 
284e0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
284f0 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
28500 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  id(pDlidx);.    
28510 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44  int pgno = fts5D
28520 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
28530 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74  idx);.    assert
28540 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  ( fts5DlidxIterP
28550 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61  gno(pDlidx)>iLea
28560 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20  f );.    cksum2 
28570 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
28580 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
28590 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
285a0 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
285b0 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69  pDlidx = 0;..  i
285c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
285d0 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63  _OK && cksum1!=c
285e0 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
285f0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a  FTS5_CORRUPT;.}.
28600 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
28610 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74  QueryCksum(.  Ft
28620 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28640 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65   Fts5 index obje
28650 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
28660 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
28670 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
28680 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79      /* Index key
28690 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
286a0 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e     /* Size of in
286d0 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73  dex key in bytes
286e0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
28710 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72  or Fts5IndexQuer
28720 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73  y */.  u64 *pCks
28730 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  um              
28740 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
28750 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  : Checksum value
28760 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65   */.){.  int eDe
28770 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
28780 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36  g->eDetail;.  u6
28790 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75  4 cksum = *pCksu
287a0 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  m;.  Fts5IndexIt
287b0 65 72 20 2a 70 49 64 78 49 74 65 72 20 3d 20 30  er *pIdxIter = 0
287c0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
287d0 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  uf = {0, 0, 0};.
287e0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
287f0 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
28800 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c  (p, z, n, flags,
28810 20 30 2c 20 26 70 49 64 78 49 74 65 72 29 3b 0a   0, &pIdxIter);.
28820 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
28830 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71  LITE_OK && 0==sq
28840 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66  lite3Fts5IterEof
28850 28 70 49 64 78 49 74 65 72 29 20 29 7b 0a 20 20  (pIdxIter) ){.  
28860 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71    i64 rowid = sq
28870 6c 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77  lite3Fts5IterRow
28880 69 64 28 70 49 64 78 49 74 65 72 29 3b 0a 0a 20  id(pIdxIter);.. 
28890 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
288a0 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
288b0 20 29 7b 0a 20 20 20 20 20 20 63 6b 73 75 6d 20   ){.      cksum 
288c0 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
288d0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f  dexEntryCksum(ro
288e0 77 69 64 2c 20 30 2c 20 30 2c 20 69 49 64 78 2c  wid, 0, 0, iIdx,
288f0 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73   z, n);.    }els
28900 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
28910 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
28920 6c 69 73 74 42 75 66 66 65 72 28 70 49 64 78 49  listBuffer(pIdxI
28930 74 65 72 2c 20 26 62 75 66 29 3b 0a 20 20 20 20  ter, &buf);.    
28940 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28950 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 46  _OK ){.        F
28960 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
28970 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20   sReader;.      
28980 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73    for(sqlite3Fts
28990 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
289a0 69 74 28 62 75 66 2e 70 2c 20 62 75 66 2e 6e 2c  it(buf.p, buf.n,
289b0 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20   &sReader);.    
289c0 20 20 20 20 20 20 20 20 73 52 65 61 64 65 72 2e          sReader.
289d0 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20  bEof==0;.       
289e0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
289f0 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
28a00 74 28 26 73 52 65 61 64 65 72 29 0a 20 20 20 20  t(&sReader).    
28a10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
28a20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35   int iCol = FTS5
28a30 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61  _POS2COLUMN(sRea
28a40 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20  der.iPos);.     
28a50 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
28a60 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28  FTS5_POS2OFFSET(
28a70 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20  sReader.iPos);. 
28a80 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 5e           cksum ^
28a90 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
28aa0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77  exEntryCksum(row
28ab0 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20  id, iCol, iOff, 
28ac0 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  iIdx, z, n);.   
28ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28ae0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
28af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28b00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28b10 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 64  Fts5IterNext(pId
28b20 78 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  xIter);.    }.  
28b30 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 49  }.  sqlite3Fts5I
28b40 74 65 72 43 6c 6f 73 65 28 70 49 64 78 49 74 65  terClose(pIdxIte
28b50 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  r);.  fts5Buffer
28b60 46 72 65 65 28 26 62 75 66 29 3b 0a 0a 20 20 2a  Free(&buf);..  *
28b70 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a  pCksum = cksum;.
28b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28b90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
28ba0 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75 72  tion is also pur
28bb0 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  ely an internal 
28bc0 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f  test. It does no
28bd0 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20  t contribute to 
28be0 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e  .** FTS function
28bf0 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74  ality, or even t
28c00 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
28c10 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  ck, in any way..
28c20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
28c30 74 73 35 54 65 73 74 54 65 72 6d 28 0a 20 20 46  ts5TestTerm(.  F
28c40 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
28c50 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 72 65  Fts5Buffer *pPre
28c60 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
28c70 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d  /* Previous term
28c80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28c90 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20   *z, int n,     
28ca0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
28cb0 79 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 65  y new term to te
28cc0 73 74 20 2a 2f 0a 20 20 75 36 34 20 65 78 70 65  st */.  u64 expe
28cd0 63 74 65 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b  cted,.  u64 *pCk
28ce0 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  sum.){.  int rc 
28cf0 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
28d00 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Prev->n==0 ){.  
28d10 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
28d20 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28  &rc, pPrev, n, (
28d30 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20  const u8*)z);.  
28d40 7d 65 6c 73 65 0a 20 20 69 66 28 20 72 63 3d 3d  }else.  if( rc==
28d50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50  SQLITE_OK && (pP
28d60 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d  rev->n!=n || mem
28d70 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c  cmp(pPrev->p, z,
28d80 20 6e 29 29 20 29 7b 0a 20 20 20 20 75 36 34 20   n)) ){.    u64 
28d90 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d  cksum3 = *pCksum
28da0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
28db0 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74   *zTerm = (const
28dc0 20 63 68 61 72 2a 29 26 70 50 72 65 76 2d 3e 70   char*)&pPrev->p
28dd0 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61  [1];  /* term sa
28de0 6e 73 20 70 72 65 66 69 78 2d 62 79 74 65 20 2a  ns prefix-byte *
28df0 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20  /.    int nTerm 
28e00 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20  = pPrev->n-1;   
28e10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
28e20 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74   of zTerm in byt
28e30 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  es */.    int iI
28e40 64 78 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30  dx = (pPrev->p[0
28e50 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] - FTS5_MAIN_PR
28e60 45 46 49 58 29 3b 0a 20 20 20 20 69 6e 74 20 66  EFIX);.    int f
28e70 6c 61 67 73 20 3d 20 28 69 49 64 78 3d 3d 30 20  lags = (iIdx==0 
28e80 3f 20 30 20 3a 20 46 54 53 35 49 4e 44 45 58 5f  ? 0 : FTS5INDEX_
28e90 51 55 45 52 59 5f 50 52 45 46 49 58 29 3b 0a 20  QUERY_PREFIX);. 
28ea0 20 20 20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a     u64 ck1 = 0;.
28eb0 20 20 20 20 75 36 34 20 63 6b 32 20 3d 20 30 3b      u64 ck2 = 0;
28ec0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
28ed0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
28ee0 72 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43  returned for ASC
28ef0 20 61 6e 64 20 44 45 53 43 20 71 75 65 72 69 65   and DESC querie
28f00 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  s are.    ** the
28f10 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63   same. If not, c
28f20 61 6c 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74  all this corrupt
28f30 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20  ion.  */.    rc 
28f40 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
28f50 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
28f60 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26   nTerm, flags, &
28f70 63 6b 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ck1);.    if( rc
28f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28f90 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
28fa0 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
28fb0 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 72  RY_DESC;.      r
28fc0 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73  c = fts5QueryCks
28fd0 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72  um(p, iIdx, zTer
28fe0 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b  m, nTerm, f, &ck
28ff0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  2);.    }.    if
29000 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29010 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63  && ck1!=ck2 ) rc
29020 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
29030 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
29040 20 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65   is a prefix que
29050 72 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ry, check that t
29060 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72  he results retur
29070 6e 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 2a  ned if the.    *
29080 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 64  * the index is d
29090 69 73 61 62 6c 65 64 20 61 72 65 20 74 68 65 20  isabled are the 
290a0 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53  same. In both AS
290b0 43 20 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72  C and DESC order
290c0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
290d0 20 54 68 69 73 20 63 68 65 63 6b 20 6d 61 79 20   This check may 
290e0 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
290f0 64 20 69 66 20 74 68 65 20 68 61 73 68 20 74 61  d if the hash ta
29100 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 54 68  ble is empty. Th
29110 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 63  is.    ** is bec
29120 61 75 73 65 20 74 68 65 20 68 61 73 68 20 74 61  ause the hash ta
29130 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ble only support
29140 73 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20  s a single scan 
29150 71 75 65 72 79 20 61 74 0a 20 20 20 20 2a 2a 20  query at.    ** 
29160 61 20 74 69 6d 65 2c 20 61 6e 64 20 74 68 65 20  a time, and the 
29170 6d 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20  multi-iter loop 
29180 66 72 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20  from which this 
29190 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
291a0 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  ed.    ** is alr
291b0 65 61 64 79 20 70 65 72 66 6f 72 6d 69 6e 67 20  eady performing 
291c0 73 75 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a  such a scan. */.
291d0 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64      if( p->nPend
291e0 69 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ingData==0 ){.  
291f0 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26      if( iIdx>0 &
29200 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
29210 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
29220 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44   = flags|FTS5IND
29230 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  EX_QUERY_TEST_NO
29240 49 44 58 3b 0a 20 20 20 20 20 20 20 20 63 6b 32  IDX;.        ck2
29250 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
29260 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
29270 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
29280 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32  , nTerm, f, &ck2
29290 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
292a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
292b0 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
292c0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
292d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
292e0 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
292f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29300 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
29310 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
29320 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35  _TEST_NOIDX|FTS5
29330 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
29340 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20  ;.        ck2 = 
29350 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
29360 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
29370 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
29380 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
29390 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
293a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
293b0 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
293c0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
293d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b   }.    }..    ck
293e0 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20  sum3 ^= ck1;.   
293f0 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
29400 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63  rc, pPrev, n, (c
29410 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20  onst u8*)z);..  
29420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29430 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d 65  _OK && cksum3!=e
29440 78 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20 20  xpected ){.     
29450 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
29460 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  PT;.    }.    *p
29470 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a  Cksum = cksum3;.
29480 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63    }.  p->rc = rc
29490 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65  ;.}. .#else.# de
294a0 66 69 6e 65 20 66 74 73 35 54 65 73 74 44 6c 69  fine fts5TestDli
294b0 64 78 52 65 76 65 72 73 65 28 78 2c 79 2c 7a 29  dxReverse(x,y,z)
294c0 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65  .# define fts5Te
294d0 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79  stTerm(u,v,w,x,y
294e0 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
294f0 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a  * Check that:.**
29500 0a 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65 61  .**   1) All lea
29510 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77  ves of pSeg betw
29520 65 65 6e 20 69 46 69 72 73 74 20 61 6e 64 20 69  een iFirst and i
29530 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29  Last (inclusive)
29540 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20   exist and.**   
29550 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20     contain zero 
29560 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41  terms..**   2) A
29570 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65  ll leaves of pSe
29580 67 20 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77  g between iNoRow
29590 69 64 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e  id and iLast (in
295a0 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61  clusive) exist a
295b0 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  nd.**      conta
295c0 69 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a  in zero rowids..
295d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
295e0 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
295f0 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 46  yCheckEmpty(.  F
29600 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
29610 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
29620 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f  ent *pSeg,     /
29630 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65  * Segment to che
29640 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73  ck internal cons
29650 69 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74  istency */.  int
29660 20 69 46 69 72 73 74 2c 0a 20 20 69 6e 74 20 69   iFirst,.  int i
29670 4e 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69  NoRowid,.  int i
29680 4c 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Last.){.  int i;
29690 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b  ..  /* Now check
296a0 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
296b0 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
296c0 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
296d0 6e 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29  nt leaf.  ** (a)
296e0 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63   exist and (b) c
296f0 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e  ontain no terms.
29700 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72   */.  for(i=iFir
29710 73 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  st; p->rc==SQLIT
29720 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74  E_OK && i<=iLast
29730 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
29740 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 66 74  Data *pLeaf = ft
29750 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
29760 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
29770 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69  (pSeg->iSegid, i
29780 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61  ));.    if( pLea
29790 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  f ){.      if( !
297a0 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
297b0 73 73 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72  ss(pLeaf) ) p->r
297c0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
297d0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 69  ;.      if( i>=i
297e0 4e 6f 52 6f 77 69 64 20 26 26 20 30 21 3d 66 74  NoRowid && 0!=ft
297f0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
29800 4f 66 66 28 70 4c 65 61 66 29 20 29 20 70 2d 3e  Off(pLeaf) ) p->
29810 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
29820 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  T;.    }.    fts
29830 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
29840 61 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  af);.  }.}..stat
29850 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 74 65  ic void fts5Inte
29860 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78 28  grityCheckPgidx(
29870 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
29880 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a  s5Data *pLeaf){.
29890 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d    int iTermOff =
298a0 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20   0;.  int ii;.. 
298b0 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 31   Fts5Buffer buf1
298c0 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74   = {0,0,0};.  Ft
298d0 73 35 42 75 66 66 65 72 20 62 75 66 32 20 3d 20  s5Buffer buf2 = 
298e0 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d  {0,0,0};..  ii =
298f0 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a   pLeaf->szLeaf;.
29900 20 20 77 68 69 6c 65 28 20 69 69 3c 70 4c 65 61    while( ii<pLea
29910 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d  f->nn && p->rc==
29920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29930 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e   int res;.    in
29940 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20  t iOff;.    int 
29950 6e 49 6e 63 72 3b 0a 0a 20 20 20 20 69 69 20 2b  nIncr;..    ii +
29960 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
29970 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c  2(&pLeaf->p[ii],
29980 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69 54 65   nIncr);.    iTe
29990 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a  rmOff += nIncr;.
299a0 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d      iOff = iTerm
299b0 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f  Off;..    if( iO
299c0 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ff>=pLeaf->szLea
299d0 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  f ){.      p->rc
299e0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
299f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
29a00 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20 29  TermOff==nIncr )
29a10 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
29a20 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  e;.      iOff +=
29a30 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
29a40 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
29a50 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
29a60 69 66 28 20 28 69 4f 66 66 2b 6e 42 79 74 65 29  if( (iOff+nByte)
29a70 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
29a80 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
29a90 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
29aa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29ab0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
29ac0 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31  et(&p->rc, &buf1
29ad0 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d  , nByte, &pLeaf-
29ae0 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  >p[iOff]);.     
29af0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
29b00 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 2c 20 6e      int nKeep, n
29b10 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66  Byte;.      iOff
29b20 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
29b30 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
29b40 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
29b50 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
29b60 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
29b70 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  f->p[iOff], nByt
29b80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4b  e);.      if( nK
29b90 65 65 70 3e 62 75 66 31 2e 6e 20 7c 7c 20 28 69  eep>buf1.n || (i
29ba0 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66  Off+nByte)>pLeaf
29bb0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
29bc0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
29bd0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
29be0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
29bf0 75 66 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20  uf1.n = nKeep;. 
29c00 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
29c10 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
29c20 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65  rc, &buf1, nByte
29c30 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  , &pLeaf->p[iOff
29c40 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ]);.      }..   
29c50 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
29c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29c70 20 20 20 72 65 73 20 3d 20 66 74 73 35 42 75 66     res = fts5Buf
29c80 66 65 72 43 6f 6d 70 61 72 65 28 26 62 75 66 31  ferCompare(&buf1
29c90 2c 20 26 62 75 66 32 29 3b 0a 20 20 20 20 20 20  , &buf2);.      
29ca0 20 20 69 66 28 20 72 65 73 3c 3d 30 20 29 20 70    if( res<=0 ) p
29cb0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
29cc0 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
29cd0 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
29ce0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rSet(&p->rc, &bu
29cf0 66 32 2c 20 62 75 66 31 2e 6e 2c 20 62 75 66 31  f2, buf1.n, buf1
29d00 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  .p);.  }..  fts5
29d10 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 31  BufferFree(&buf1
29d20 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
29d30 72 65 65 28 26 62 75 66 32 29 3b 0a 7d 0a 0a 73  ree(&buf2);.}..s
29d40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
29d50 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
29d60 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73  ckSegment(.  Fts
29d70 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d90 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
29da0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
29db0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
29dc0 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg      /* Segm
29dd0 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74  ent to check int
29de0 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63  ernal consistenc
29df0 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f  y */.){.  Fts5Co
29e00 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
29e10 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71  p->pConfig;.  sq
29e20 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
29e30 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 32  t = 0;.  int rc2
29e40 3b 0a 20 20 69 6e 74 20 69 49 64 78 50 72 65 76  ;.  int iIdxPrev
29e50 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Leaf = pSeg->pgn
29e60 6f 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20  oFirst-1;.  int 
29e70 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d  iDlidxPrevLeaf =
29e80 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b   pSeg->pgnoLast;
29e90 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67  ..  if( pSeg->pg
29ea0 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20 72 65 74  noFirst==0 ) ret
29eb0 75 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65  urn;..  fts5Inde
29ec0 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
29ed0 26 70 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f  &pStmt, sqlite3_
29ee0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22  mprintf(.      "
29ef0 53 45 4c 45 43 54 20 73 65 67 69 64 2c 20 74 65  SELECT segid, te
29f00 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28  rm, (pgno>>1), (
29f10 70 67 6e 6f 26 31 29 20 46 52 4f 4d 20 25 51 2e  pgno&1) FROM %Q.
29f20 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73  '%q_idx' WHERE s
29f30 65 67 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20  egid=%d",.      
29f40 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
29f50 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53  onfig->zName, pS
29f60 65 67 2d 3e 69 53 65 67 69 64 0a 20 20 29 29 3b  eg->iSegid.  ));
29f70 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74  ..  /* Iterate t
29f80 68 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65  hrough the b-tre
29f90 65 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f  e hierarchy.  */
29fa0 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
29fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
29fc0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
29fd0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
29fe0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20  .    i64 iRow;  
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a000 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
2a010 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20  this leaf */.   
2a020 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
2a030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2a040 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73 20  * Data for this 
2a050 6c 65 61 66 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  leaf */..    int
2a060 20 6e 49 64 78 54 65 72 6d 20 3d 20 73 71 6c 69   nIdxTerm = sqli
2a070 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
2a080 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
2a090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
2a0a0 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68  Term = (const ch
2a0b0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
2a0c0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
2a0d0 29 3b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 4c  );.    int iIdxL
2a0e0 65 61 66 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  eaf = sqlite3_co
2a0f0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
2a100 32 29 3b 0a 20 20 20 20 69 6e 74 20 62 49 64 78  2);.    int bIdx
2a110 44 6c 69 64 78 20 3d 20 73 71 6c 69 74 65 33 5f  Dlidx = sqlite3_
2a120 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2a130 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 3);..    /* If
2a140 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65   the leaf in que
2a150 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  stion has alread
2a160 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66  y been trimmed f
2a170 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c  rom the segment,
2a180 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20   .    ** ignore 
2a190 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72  this b-tree entr
2a1a0 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f  y. Otherwise, lo
2a1b0 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  ad it into memor
2a1c0 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 49  y. */.    if( iI
2a1d0 64 78 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e  dxLeaf<pSeg->pgn
2a1e0 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e 75  oFirst ) continu
2a1f0 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46 54  e;.    iRow = FT
2a200 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2a210 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69  (pSeg->iSegid, i
2a220 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c  IdxLeaf);.    pL
2a230 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
2a240 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20  ad(p, iRow);.   
2a250 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
2a260 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43  break;..    /* C
2a270 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65  heck that the le
2a280 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  af contains at l
2a290 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61  east one term, a
2a2a0 6e 64 20 74 68 61 74 20 69 74 20 69 73 20 65 71  nd that it is eq
2a2b0 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72  ual.    ** to or
2a2c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2a2d0 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49   split-key in zI
2a2e0 64 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68  dxTerm.  Also ch
2a2f0 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 72  eck that if ther
2a300 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f  e.    ** is also
2a310 20 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65 72   a rowid pointer
2a320 20 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61 66   within the leaf
2a330 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 69 74   page header, it
2a340 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20 20   points to a.   
2a350 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66   ** location bef
2a360 6f 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20 2a  ore the term.  *
2a370 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d  /.    if( pLeaf-
2a380 3e 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  >nn<=pLeaf->szLe
2a390 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  af ){.      p->r
2a3a0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2a3b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a3c0 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20     int iOff;    
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a3e0 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
2a3f0 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a  t term on leaf *
2a400 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77  /.      int iRow
2a410 69 64 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  idOff;          
2a420 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2a430 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
2a440 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  leaf */.      in
2a450 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
2a460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2a470 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61  e of term on lea
2a480 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  f in bytes */.  
2a490 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20      int res;    
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  /* Comparison of
2a4c0 20 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d   term and split-
2a4d0 6b 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f  key */..      iO
2a4e0 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
2a4f0 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29  stTermOff(pLeaf)
2a500 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66  ;.      iRowidOf
2a510 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
2a520 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
2a530 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77  ;.      if( iRow
2a540 69 64 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a 20  idOff>=iOff ){. 
2a550 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
2a560 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2a570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a580 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2a590 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
2a5a0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d  ->p[iOff], nTerm
2a5b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  );.        res =
2a5c0 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e   memcmp(&pLeaf->
2a5d0 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65 72  p[iOff], zIdxTer
2a5e0 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e 49  m, MIN(nTerm, nI
2a5f0 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20  dxTerm));.      
2a600 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
2a610 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49 64  es = nTerm - nId
2a620 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  xTerm;.        i
2a630 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72 63  f( res<0 ) p->rc
2a640 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2a650 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2a660 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68 65  fts5IntegrityChe
2a670 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65 61 66  ckPgidx(p, pLeaf
2a680 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
2a690 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
2a6a0 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  af);.    if( p->
2a6b0 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  rc ) break;..   
2a6c0 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68   /* Now check th
2a6d0 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70  at the iter.nEmp
2a6e0 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  ty leaves follow
2a6f0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
2a700 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20  leaf.    ** (a) 
2a710 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f  exist and (b) co
2a720 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20  ntain no terms. 
2a730 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  */.    fts5Index
2a740 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d  IntegrityCheckEm
2a750 70 74 79 28 0a 20 20 20 20 20 20 20 20 70 2c 20  pty(.        p, 
2a760 70 53 65 67 2c 20 69 49 64 78 50 72 65 76 4c 65  pSeg, iIdxPrevLe
2a770 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72 65 76  af+1, iDlidxPrev
2a780 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65 61 66  Leaf+1, iIdxLeaf
2a790 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  -1.    );.    if
2a7a0 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
2a7b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2a7c0 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
2a7d0 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74  ndex, check that
2a7e0 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e   it looks right.
2a7f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 64 78   */.    if( bIdx
2a800 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46  Dlidx ){.      F
2a810 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
2a820 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f  lidx = 0;  /* Fo
2a830 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
2a840 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ugh doclist inde
2a850 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  x */.      int i
2a860 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c  PrevLeaf = iIdxL
2a870 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  eaf;.      int i
2a880 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53  Segid = pSeg->iS
2a890 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  egid;.      int 
2a8a0 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  iPg = 0;.      i
2a8b0 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20  64 iKey;..      
2a8c0 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
2a8d0 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
2a8e0 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c  0, iSegid, iIdxL
2a8f0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
2a900 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
2a910 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
2a920 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c            fts5Dl
2a930 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70  idxIterNext(p, p
2a940 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29 7b 0a  Dlidx).      ){.
2a950 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2a960 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73  k any rowid-less
2a970 20 70 61 67 65 73 20 74 68 61 74 20 6f 63 63 75   pages that occu
2a980 72 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  r before the cur
2a990 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20  rent leaf. */.  
2a9a0 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50        for(iPg=iP
2a9b0 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66  revLeaf+1; iPg<f
2a9c0 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2a9d0 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29  (pDlidx); iPg++)
2a9e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 79  {.          iKey
2a9f0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
2aa00 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 50  ROWID(iSegid, iP
2aa10 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  g);.          pL
2aa20 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
2aa30 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
2aa40 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
2aa50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2aa60 69 66 28 20 66 74 73 35 4c 65 61 66 46 69 72 73  if( fts5LeafFirs
2aa70 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
2aa80 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  !=0 ) p->rc = FT
2aa90 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2aaa0 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
2aab0 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
2aac0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2aad0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50      }.        iP
2aae0 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35 44 6c  revLeaf = fts5Dl
2aaf0 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
2ab00 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  dx);..        /*
2ab10 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2ab20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69 63 61  leaf page indica
2ab30 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61  ted by the itera
2ab40 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a  tor really does.
2ab50 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
2ab60 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75 67  in the rowid sug
2ab70 67 65 73 74 65 64 20 62 79 20 74 68 65 20 73 61  gested by the sa
2ab80 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  me. */.        i
2ab90 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Key = FTS5_SEGME
2aba0 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
2abb0 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20 20   iPrevLeaf);.   
2abc0 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
2abd0 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65  5DataRead(p, iKe
2abe0 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
2abf0 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
2ac00 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20     i64 iRowid;. 
2ac10 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f           int iRo
2ac20 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61  widOff = fts5Lea
2ac30 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
2ac40 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
2ac50 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
2ac60 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  K(pLeaf);.      
2ac70 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
2ac80 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  f>=pLeaf->szLeaf
2ac90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2aca0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2acb0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
2acc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2acd0 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
2ace0 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69  (&pLeaf->p[iRowi
2acf0 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52  dOff], (u64*)&iR
2ad00 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
2ad10 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66     if( iRowid!=f
2ad20 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
2ad30 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72  d(pDlidx) ) p->r
2ad40 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2ad50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2ad60 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
2ad70 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
2ad80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ad90 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50  }..      iDlidxP
2ada0 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a 20  revLeaf = iPg;. 
2adb0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2adc0 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
2add0 20 20 20 20 20 20 66 74 73 35 54 65 73 74 44 6c        fts5TestDl
2ade0 69 64 78 52 65 76 65 72 73 65 28 70 2c 20 69 53  idxReverse(p, iS
2adf0 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b  egid, iIdxLeaf);
2ae00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ae10 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66    iDlidxPrevLeaf
2ae20 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
2ae30 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  t;.      /* TODO
2ae40 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20 69 73  : Check there is
2ae50 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64 65   no doclist inde
2ae60 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  x */.    }..    
2ae70 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69  iIdxPrevLeaf = i
2ae80 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20  IdxLeaf;.  }..  
2ae90 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
2aea0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2aeb0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2aec0 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
2aed0 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 20  rc2;..  /* Page 
2aee0 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20  iter.iLeaf must 
2aef0 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67 68 74  now be the right
2af00 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69  most leaf-page i
2af10 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f  n the segment */
2af20 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e  .#if 0.  if( p->
2af30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2af40 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65   iter.iLeaf!=pSe
2af50 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
2af60 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2af70 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65 6e  CORRUPT;.  }.#en
2af80 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75  dif.}.../*.** Ru
2af90 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  n internal check
2afa0 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
2afb0 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28   the FTS index (
2afc0 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  a) is internally
2afd0 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20   .** consistent 
2afe0 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73  and (b) contains
2aff0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69   entries for whi
2b000 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68  ch the XOR of th
2b010 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61  e checksums.** a
2b020 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20  s calculated by 
2b030 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2b040 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20  EntryCksum() is 
2b050 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cksum..**.** Ret
2b060 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2b070 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  PT if any of the
2b080 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
2b090 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65   fail, or if the
2b0a0 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  .** checksum doe
2b0b0 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74  s not match. Ret
2b0c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
2b0d0 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73   all checks pass
2b0e0 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f   without.** erro
2b0f0 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  r, or some other
2b100 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2b110 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72  de if another er
2b120 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a  ror (e.g. OOM).*
2b130 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
2b140 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2b150 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  xIntegrityCheck(
2b160 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36  Fts5Index *p, u6
2b170 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  4 cksum){.  int 
2b180 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f  eDetail = p->pCo
2b190 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20  nfig->eDetail;. 
2b1a0 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b   u64 cksum2 = 0;
2b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1c0 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73   /* Checksum bas
2b1d0 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f  ed on contents o
2b1e0 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46  f indexes */.  F
2b1f0 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73  ts5Buffer poslis
2b200 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f  t = {0,0,0};   /
2b210 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f  * Buffer used to
2b220 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74 20   hold a poslist 
2b230 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
2b240 65 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  er *pIter;      
2b250 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
2b260 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2b270 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a  entire index */.
2b280 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
2b290 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20  *pStruct;       
2b2a0 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
2b2b0 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ture */..#ifdef 
2b2c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
2b2d0 2a 20 55 73 65 64 20 62 79 20 65 78 74 72 61 20  * Used by extra 
2b2e0 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20 6f  internal tests o
2b2f0 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42 55  nly run if NDEBU
2b300 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
2b310 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 33   */.  u64 cksum3
2b320 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b330 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
2b340 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65  m based on conte
2b350 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a  nts of indexes *
2b360 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
2b370 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  erm = {0,0,0};  
2b380 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
2b390 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20  ed to hold most 
2b3a0 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 23  recent term */.#
2b3b0 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 4c 6f  endif.  .  /* Lo
2b3c0 61 64 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  ad the FTS index
2b3d0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2b3e0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
2b3f0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
2b400 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2b410 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
2b420 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d  des of each segm
2b430 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65  ent match the le
2b440 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53  aves */.  if( pS
2b450 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74  truct ){.    int
2b460 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
2b470 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
2b480 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
2b490 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
2b4a0 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
2b4b0 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
2b4c0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
2b4d0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
2b4e0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2b4f0 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53  ment *pSeg = &pS
2b500 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
2b510 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
2b520 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65          fts5Inde
2b530 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
2b540 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b  egment(p, pSeg);
2b550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b560 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73   }..  /* The cks
2b570 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  um argument pass
2b580 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
2b590 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75  ion is a checksu
2b5a0 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a  m calculated.  *
2b5b0 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65  * based on all e
2b5c0 78 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20  xpected entries 
2b5d0 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  in the FTS index
2b5e0 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66   (including pref
2b5f0 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e  ix index.  ** en
2b600 74 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f  tries). This blo
2b610 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61  ck checks that a
2b620 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c   checksum calcul
2b630 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
2b640 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f  e.  ** actual co
2b650 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e  ntents of FTS in
2b660 64 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c  dex is identical
2b670 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20  ..  **.  ** Two 
2b680 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
2b690 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72  same checksum ar
2b6a0 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68  e calculated. Th
2b6b0 65 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20  e first (stack. 
2b6c0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73   ** variable cks
2b6d0 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e  um2) based on en
2b6e0 74 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20  tries extracted 
2b6f0 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65  from the full-te
2b700 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68  xt index.  ** wh
2b710 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65  ile doing a line
2b720 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20  ar scan of each 
2b730 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78  individual index
2b740 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a   in turn. .  **.
2b750 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72    ** As each ter
2b760 6d 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  m visited by the
2b770 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61   linear scans, a
2b780 20 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20   separate query 
2b790 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
2b7a0 65 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72  e term is perfor
2b7b0 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63  med. cksum3 is c
2b7c0 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20  alculated based 
2b7d0 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20  on the entries. 
2b7e0 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79   ** extracted by
2b7f0 20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a   these queries..
2b800 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d    */.  for(fts5M
2b810 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
2b820 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c  Struct, 0, 0, 0,
2b830 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74 65   0, -1, 0, &pIte
2b840 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
2b850 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
2b860 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
2b870 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
2b880 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
2b890 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  .  ){.    int n;
2b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8b0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2b8c0 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a   term in bytes *
2b8d0 2f 0a 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d  /.    i64 iPos =
2b8e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2b8f0 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 72 65    /* Position re
2b900 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20  ad from poslist 
2b910 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  */.    int iOff 
2b920 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b930 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 77 69 74     /* Offset wit
2b940 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20  hin poslist */. 
2b950 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
2b960 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
2b970 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 63  id(pIter);.    c
2b980 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29  har *z = (char*)
2b990 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
2b9a0 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20  m(pIter, &n);.. 
2b9b0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2b9c0 20 61 20 6e 65 77 20 74 65 72 6d 2c 20 71 75 65   a new term, que
2b9d0 72 79 20 66 6f 72 20 69 74 2e 20 55 70 64 61 74  ry for it. Updat
2b9e0 65 20 63 6b 73 75 6d 33 20 77 69 74 68 20 74 68  e cksum3 with th
2b9f0 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20  e results. */.  
2ba00 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70    fts5TestTerm(p
2ba10 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63  , &term, z, n, c
2ba20 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b  ksum2, &cksum3);
2ba30 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
2ba40 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
2ba50 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ONE ){.      if(
2ba60 20 30 3d 3d 66 74 73 35 4d 75 6c 74 69 49 74 65   0==fts5MultiIte
2ba70 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65  rIsEmpty(p, pIte
2ba80 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6b  r) ){.        ck
2ba90 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33 46  sum2 ^= sqlite3F
2baa0 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2bab0 75 6d 28 69 52 6f 77 69 64 2c 20 30 2c 20 30 2c  um(iRowid, 0, 0,
2bac0 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20   -1, z, n);.    
2bad0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2bae0 20 20 20 20 20 70 6f 73 6c 69 73 74 2e 6e 20 3d       poslist.n =
2baf0 20 30 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65   0;.      fts5Se
2bb00 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20  giterPoslist(p, 
2bb10 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74  &pIter->aSeg[pIt
2bb20 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
2bb30 69 72 73 74 5d 2c 20 30 2c 20 26 70 6f 73 6c 69  irst], 0, &posli
2bb40 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
2bb50 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  ( 0==sqlite3Fts5
2bb60 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 70 6f  PoslistNext64(po
2bb70 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73 74  slist.p, poslist
2bb80 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f 73  .n, &iOff, &iPos
2bb90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
2bba0 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53   iCol = FTS5_POS
2bbb0 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20  2COLUMN(iPos);. 
2bbc0 20 20 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f         int iTokO
2bbd0 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46  ff = FTS5_POS2OF
2bbe0 46 53 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20  FSET(iPos);.    
2bbf0 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71      cksum2 ^= sq
2bc00 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
2bc10 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
2bc20 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20   iCol, iTokOff, 
2bc30 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  -1, z, n);.     
2bc40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
2bc50 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26  ts5TestTerm(p, &
2bc60 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75  term, 0, 0, cksu
2bc70 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20  m2, &cksum3);.. 
2bc80 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
2bc90 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ee(p, pIter);.  
2bca0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
2bcb0 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63  E_OK && cksum!=c
2bcc0 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
2bcd0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
2bce0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2bcf0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
2bd00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2bd10 42 55 47 0a 20 20 66 74 73 35 42 75 66 66 65 72  BUG.  fts5Buffer
2bd20 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65 6e  Free(&term);.#en
2bd30 64 69 66 0a 20 20 66 74 73 35 42 75 66 66 65 72  dif.  fts5Buffer
2bd40 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a  Free(&poslist);.
2bd50 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2bd60 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2bd70 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2bd80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bd90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bda0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bdb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2bdc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bdd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bde0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bdf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2be00 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
2be10 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
2be20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2be30 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2be40 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66  de() scalar.** f
2be50 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f  unction only..*/
2be60 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
2be70 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f   segment-data ro
2be80 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  wid from the %_d
2be90 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20  ata table. This 
2bea0 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74  function is.** t
2beb0 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d  he opposite of m
2bec0 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e  acro FTS5_SEGMEN
2bed0 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74  T_ROWID()..*/.st
2bee0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2bef0 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34  codeRowid(.  i64
2bf00 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bf20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74  Rowid from %_dat
2bf30 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
2bf40 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20   *piSegid,      
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bf60 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20  OUT: Segment id 
2bf70 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64  */.  int *pbDlid
2bf80 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
2bf90 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69       /* OUT: Dli
2bfa0 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74  dx flag */.  int
2bfb0 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20   *piHeight,     
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bfd0 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20  OUT: Height */. 
2bfe0 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20   int *piPgno    
2bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c000 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75   /* OUT: Page nu
2c010 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69  mber */.){.  *pi
2c020 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f  Pgno = (int)(iRo
2c030 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
2c040 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  < FTS5_DATA_PAGE
2c050 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
2c060 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
2c070 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69  A_PAGE_B;..  *pi
2c080 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69  Height = (int)(i
2c090 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2c0a0 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45   << FTS5_DATA_HE
2c0b0 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20  IGHT_B) - 1));. 
2c0c0 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2c0d0 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a  _DATA_HEIGHT_B;.
2c0e0 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69  .  *pbDlidx = (i
2c0f0 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78 30  nt)(iRowid & 0x0
2c100 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e  001);.  iRowid >
2c110 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49  >= FTS5_DATA_DLI
2c120 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20  _B;..  *piSegid 
2c130 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2c140 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
2c150 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31  5_DATA_ID_B) - 1
2c160 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ));.}..static vo
2c170 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  id fts5DebugRowi
2c180 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  d(int *pRc, Fts5
2c190 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36  Buffer *pBuf, i6
2c1a0 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69  4 iKey){.  int i
2c1b0 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
2c1c0 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20  iPgno, bDlidx;  
2c1d0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f       /* Rowid co
2c1e0 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74  mpenents */.  ft
2c1f0 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b  s5DecodeRowid(iK
2c200 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44  ey, &iSegid, &bD
2c210 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20  lidx, &iHeight, 
2c220 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  &iPgno);..  if( 
2c230 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20  iSegid==0 ){.   
2c240 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f   if( iKey==FTS5_
2c250 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
2c260 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
2c270 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2c280 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2c290 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29 3b   "{averages} ");
2c2a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c2b0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2c2c0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2c2d0 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74 72  pRc, pBuf, "{str
2c2e0 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d  ucture}");.    }
2c2f0 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20  .  }.  else{.   
2c300 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2c310 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2c320 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73 65  Rc, pBuf, "{%sse
2c330 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f  gid=%d h=%d pgno
2c340 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 62  =%d}",.        b
2c350 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22  Dlidx ? "dlidx "
2c360 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69   : "", iSegid, i
2c370 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20  Height, iPgno.  
2c380 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74    );.  }.}..stat
2c390 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
2c3a0 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  gStructure(.  in
2c3b0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c3d0 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2c3e0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2c3f0 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73  fer *pBuf,.  Fts
2c400 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b  5Structure *p.){
2c410 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65  .  int iLvl, iSe
2c420 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2c430 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
2c440 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65  rough levels, se
2c450 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72  gments */..  for
2c460 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d  (iLvl=0; iLvl<p-
2c470 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
2c480 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
2c490 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
2c4a0 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c   &p->aLevel[iLvl
2c4b0 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ];.    sqlite3Ft
2c4c0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2c4d0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2c4e0 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d  .        " {lvl=
2c4f0 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65  %d nMerge=%d nSe
2c500 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76  g=%d", iLvl, pLv
2c510 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d  l->nMerge, pLvl-
2c520 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20 20  >nSeg.    );.   
2c530 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2c540 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
2c550 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  eg++){.      Fts
2c560 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
2c570 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d  t *pSeg = &pLvl-
2c580 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  >aSeg[iSeg];.   
2c590 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2c5a0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2c5b0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b 69  (pRc, pBuf, " {i
2c5c0 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e  d=%d leaves=%d..
2c5d0 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %d}", .         
2c5e0 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70   pSeg->iSegid, p
2c5f0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20  Seg->pgnoFirst, 
2c600 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20  pSeg->pgnoLast. 
2c610 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
2c620 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2c630 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2c640 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b  pRc, pBuf, "}");
2c650 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2c660 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2c670 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2c680 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2c690 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2c6a0 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2c6b0 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20  in a serialized 
2c6c0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
2c6d0 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ject. This.** fu
2c6e0 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
2c6f0 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2c700 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2c710 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63  f the same objec
2c720 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66  t.** to the buff
2c730 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
2c740 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2c750 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
2c760 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75  d fts5DecodeStru
2c770 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
2c780 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2c790 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2c7a0 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2c7b0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2c7c0 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
2c7d0 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
2c7e0 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ob.){.  int rc; 
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c800 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2c810 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
2c820 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30  Structure *p = 0
2c830 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
2c840 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65  ecoded structure
2c850 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63   object */..  rc
2c860 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
2c870 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42  Decode(pBlob, nB
2c880 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69  lob, 0, &p);.  i
2c890 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c8a0 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
2c8b0 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2c8c0 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53   }..  fts5DebugS
2c8d0 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42  tructure(pRc, pB
2c8e0 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74  uf, p);.  fts5St
2c8f0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
2c900 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2c910 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2c920 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
2c930 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a  bugging aid..**.
2c940 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c  ** Arguments pBl
2c950 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e  ob/nBlob contain
2c960 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20 72   an "averages" r
2c970 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e 63  ecord. This func
2c980 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64 73  tion .** appends
2c990 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2c9a0 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2c9b0 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74 68   of record to th
2c9c0 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
2c9d0 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
2c9e0 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a  d argument. .*/.
2c9f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2ca00 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 0a  DecodeAverages(.
2ca10 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca30 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2ca40 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2ca50 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2ca60 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62   const u8 *pBlob
2ca70 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20  , int nBlob.){. 
2ca80 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f   int i = 0;.  co
2ca90 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63 65  nst char *zSpace
2caa0 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65 28   = "";..  while(
2cab0 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20   i<nBlob ){.    
2cac0 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20  u64 iVal;.    i 
2cad0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
2cae0 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b 69  tVarint(&pBlob[i
2caf0 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 73  ], &iVal);.    s
2cb00 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2cb10 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2cb20 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c 20  , pBuf, "%s%d", 
2cb30 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56 61  zSpace, (int)iVa
2cb40 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20 3d  l);.    zSpace =
2cb50 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   " ";.  }.}../*.
2cb60 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20  ** Buffer (a/n) 
2cb70 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
2cb80 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  ntain a list of 
2cb90 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e  serialized varin
2cba0 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68  ts. Read.** each
2cbb0 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65   varint and appe
2cbc0 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65  nd its string re
2cbd0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20  presentation to 
2cbe0 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74  buffer pBuf. Ret
2cbf0 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74  urn.** after eit
2cc00 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75  her the input bu
2cc10 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65  ffer is exhauste
2cc20 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69  d or a 0 value i
2cc30 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
2cc40 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2cc50 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2cc60 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
2cc70 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2cc80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cc90 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2cca0 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
2ccb0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
2ccc0 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
2ccd0 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
2cce0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66  0;.  while( iOff
2ccf0 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56  <n ){.    int iV
2cd00 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  al;.    iOff += 
2cd10 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2cd20 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b  &a[iOff], iVal);
2cd30 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2cd40 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2cd50 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2cd60 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a  %d", iVal);.  }.
2cd70 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d    return iOff;.}
2cd80 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72  ../*.** The star
2cd90 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e  t of buffer (a/n
2cda0 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  ) contains the s
2cdb0 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  tart of a doclis
2cdc0 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a  t. The doclist.*
2cdd0 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  * may or may not
2cde0 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74   finish within t
2cdf0 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  he buffer. This 
2ce00 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2ce10 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65   a text.** repre
2ce20 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
2ce30 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63   part of the doc
2ce40 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72 65  list that is pre
2ce50 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a  sent to buffer.*
2ce60 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54  * pBuf. .**.** T
2ce70 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2ce80 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2ce90 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
2cea0 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2ceb0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2cec0 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69   fts5DecodeDocli
2ced0 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
2cee0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
2cef0 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
2cf00 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64  n){.  i64 iDocid
2cf10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
2cf20 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30   = 0;..  if( n>0
2cf30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 73   ){.    iOff = s
2cf40 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2cf50 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69 44  int(a, (u64*)&iD
2cf60 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ocid);.    sqlit
2cf70 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2cf80 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2cf90 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2cfa0 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77  iDocid);.  }.  w
2cfb0 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a  hile( iOff<n ){.
2cfc0 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
2cfd0 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20 20    int bDel;.    
2cfe0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50  iOff += fts5GetP
2cff0 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f  oslistSize(&a[iO
2d000 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 65  ff], &nPos, &bDe
2d010 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l);.    sqlite3F
2d020 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2d030 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2d040 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20 6e   " nPos=%d%s", n
2d050 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22 22  Pos, bDel?"*":""
2d060 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
2d070 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
2d080 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b 69  (pRc, pBuf, &a[i
2d090 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66  Off], MIN(n-iOff
2d0a0 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69 66  , nPos));.    if
2d0b0 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
2d0c0 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
2d0d0 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69      iOff += sqli
2d0e0 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2d0f0 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
2d100 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
2d110 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74   iDocid += iDelt
2d120 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
2d130 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2d140 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2d150 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44  , " id=%lld", iD
2d160 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ocid);.    }.  }
2d170 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  ..  return iOff;
2d180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2d190 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  unction is part 
2d1a0 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2d1b0 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 66  de() debugging f
2d1c0 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 0a  unction. It is .
2d1d0 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  ** only ever use
2d1e0 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f  d with detail=no
2d1f0 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ne tables..**.**
2d200 20 42 75 66 66 65 72 20 28 70 44 61 74 61 2f 6e   Buffer (pData/n
2d210 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73 20 61  Data) contains a
2d220 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 65 20   doclist in the 
2d230 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79 20 64  format used by d
2d240 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74 61  etail=none.** ta
2d250 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e 63 74  bles. This funct
2d260 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75  ion appends a hu
2d270 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65 72  man-readable ver
2d280 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c 69 73  sion of that lis
2d290 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  t to.** buffer p
2d2a0 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  Buf..**.** If *p
2d2b0 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e  Rc is other than
2d2c0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2d2d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2d2e0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2d2f0 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e  .** no-op. If an
2d300 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20 65 72   OOM or other er
2d310 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
2d320 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
2d330 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65 74 20   *pRc is.** set 
2d340 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  to an SQLite err
2d350 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72  or code before r
2d360 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 66 69  eturning. The fi
2d370 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62 75 66  nal state of buf
2d380 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73 20 75  fer.** pBuf is u
2d390 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
2d3a0 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
2d3b0 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2d3c0 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69 6e 74  RowidList(.  int
2d3d0 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d3f0 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
2d400 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2d410 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
2d420 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
2d430 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78 74  r to append text
2d440 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   to */.  const u
2d450 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
2d460 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ata      /* Data
2d470 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73 74 2d   to decode list-
2d480 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d 20 2a  of-rowids from *
2d490 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30  /.){.  int i = 0
2d4a0 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d  ;.  i64 iRowid =
2d4b0 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c   0;..  while( i<
2d4c0 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63 6f 6e  nData ){.    con
2d4d0 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20 3d 20  st char *zApp = 
2d4e0 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56 61 6c  "";.    u64 iVal
2d4f0 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  ;.    i += sqlit
2d500 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2d510 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56 61 6c  &pData[i], &iVal
2d520 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 2b 3d  );.    iRowid +=
2d530 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66 28 20   iVal;..    if( 
2d540 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74 61  i<nData && pData
2d550 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20  [i]==0x00 ){.   
2d560 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66     i++;.      if
2d570 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61  ( i<nData && pDa
2d580 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20  ta[i]==0x00 ){. 
2d590 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
2d5a0 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22 3b 0a      zApp = "+";.
2d5b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d5c0 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a 22 3b       zApp = "*";
2d5d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2d5e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2d5f0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2d600 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25  f(pRc, pBuf, " %
2d610 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64 2c 20  lld%s", iRowid, 
2d620 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  zApp);.  }.}../*
2d630 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
2d640 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
2d650 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
2d660 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f  nction fts5_deco
2d670 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de()..*/.static 
2d680 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46  void fts5DecodeF
2d690 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
2d6a0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2d6b0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
2d6c0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
2d6d0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
2d6e0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2d6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d700 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
2d710 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
2d720 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
2d730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2d740 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
2d750 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f   */.){.  i64 iRo
2d760 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2d770 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2d780 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69  d for record bei
2d790 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
2d7a0 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69 67  int iSegid,iHeig
2d7b0 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b  ht,iPgno,bDlidx;
2d7c0 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65  /* Rowid compone
2d7d0 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  nts */.  const u
2d7e0 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b  8 *aBlob; int n;
2d7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f           /* Reco
2d800 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rd to decode */.
2d810 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46    u8 *a = 0;.  F
2d820 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20  ts5Buffer s;    
2d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d840 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20  * Build up text 
2d850 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a  to return here *
2d860 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2d870 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2d880 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d890 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  de */.  int nSpa
2d8a0 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 44  ce = 0;.  int eD
2d8b0 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71 6c  etailNone = (sql
2d8c0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
2d8d0 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73 73  Ctx)!=0);..  ass
2d8e0 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a  ert( nArg==2 );.
2d8f0 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20    memset(&s, 0, 
2d900 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
2d910 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20  r));.  iRowid = 
2d920 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2d930 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a  t64(apVal[0]);..
2d940 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
2d950 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
2d960 72 67 75 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29  rgument (a blob)
2d970 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65   in aBlob[]. The
2d980 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f   aBlob[].  ** co
2d990 70 79 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62  py is followed b
2d9a0 79 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  y FTS5_DATA_ZERO
2d9b0 5f 50 41 44 44 49 4e 47 20 30 78 30 30 20 62 79  _PADDING 0x00 by
2d9c0 74 65 73 2c 20 77 68 69 63 68 20 70 72 65 76 65  tes, which preve
2d9d0 6e 74 73 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  nts.  ** buffer 
2d9e0 6f 76 65 72 72 65 61 64 73 20 65 76 65 6e 20 69  overreads even i
2d9f0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
2da00 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e  corrupt.  */.  n
2da10 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2da20 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29  _bytes(apVal[1])
2da30 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69  ;.  aBlob = sqli
2da40 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
2da50 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61  pVal[1]);.  nSpa
2da60 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41  ce = n + FTS5_DA
2da70 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b  TA_ZERO_PADDING;
2da80 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69  .  a = (u8*)sqli
2da90 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
2daa0 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a  o(&rc, nSpace);.
2dab0 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74    if( a==0 ) got
2dac0 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20  o decode_out;.  
2dad0 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c  memcpy(a, aBlob,
2dae0 20 6e 29 3b 0a 0a 0a 20 20 66 74 73 35 44 65 63   n);...  fts5Dec
2daf0 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c  odeRowid(iRowid,
2db00 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64   &iSegid, &bDlid
2db10 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50  x, &iHeight, &iP
2db20 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62  gno);..  fts5Deb
2db30 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c  ugRowid(&rc, &s,
2db40 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20   iRowid);.  if( 
2db50 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74  bDlidx ){.    Ft
2db60 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20  s5Data dlidx;.  
2db70 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c    Fts5DlidxLvl l
2db80 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70  vl;..    dlidx.p
2db90 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e   = a;.    dlidx.
2dba0 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d  nn = n;..    mem
2dbb0 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a  set(&lvl, 0, siz
2dbc0 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
2dbd0 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74  ));.    lvl.pDat
2dbe0 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20  a = &dlidx;.    
2dbf0 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  lvl.iLeafPgno = 
2dc00 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28  iPgno;..    for(
2dc10 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
2dc20 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66  (&lvl); lvl.bEof
2dc30 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76  ==0; fts5DlidxLv
2dc40 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20  lNext(&lvl)){.  
2dc50 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2dc60 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2dc70 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20  f(&rc, &s, .    
2dc80 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29        " %d(%lld)
2dc90 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f  ", lvl.iLeafPgno
2dca0 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20  , lvl.iRowid.   
2dcb0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65     );.    }.  }e
2dcc0 6c 73 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d  lse if( iSegid==
2dcd0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f  0 ){.    if( iRo
2dce0 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47  wid==FTS5_AVERAG
2dcf0 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  ES_ROWID ){.    
2dd00 20 20 66 74 73 35 44 65 63 6f 64 65 41 76 65 72    fts5DecodeAver
2dd10 61 67 65 73 28 26 72 63 2c 20 26 73 2c 20 61 2c  ages(&rc, &s, a,
2dd20 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
2dd30 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65        fts5Decode
2dd40 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26  Structure(&rc, &
2dd50 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  s, a, n);.    }.
2dd60 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 74    }else if( eDet
2dd70 61 69 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46  ailNone ){.    F
2dd80 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dda0 43 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61  Current term rea
2ddb0 64 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20  d from page */. 
2ddc0 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20     int szLeaf;. 
2ddd0 20 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66     int iPgidxOff
2dde0 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35   = szLeaf = fts5
2ddf0 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20  GetU16(&a[2]);. 
2de00 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b     int iTermOff;
2de10 0a 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d  .    int nKeep =
2de20 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   0;.    int iOff
2de30 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  ;..    memset(&t
2de40 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
2de50 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
2de60 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20    /* Decode any 
2de70 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63  entries that occ
2de80 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ur before the fi
2de90 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  rst term. */.   
2dea0 20 69 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b   if( szLeaf<n ){
2deb0 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47  .      fts5FastG
2dec0 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69 50  etVarint32(a, iP
2ded0 67 69 64 78 4f 66 66 2c 20 69 54 65 72 6d 4f 66  gidxOff, iTermOf
2dee0 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
2def0 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
2df00 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20  szLeaf;.    }.  
2df10 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
2df20 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  dList(&rc, &s, &
2df30 61 5b 34 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 34  a[4], iTermOff-4
2df40 29 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20 69  );..    iOff = i
2df50 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 77 68 69  TermOff;.    whi
2df60 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20  le( iOff<szLeaf 
2df70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 70  ){.      int nAp
2df80 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pend;..      /* 
2df90 52 65 61 64 20 74 68 65 20 74 65 72 6d 20 64 61  Read the term da
2dfa0 74 61 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ta for the next 
2dfb0 74 65 72 6d 2a 2f 0a 20 20 20 20 20 20 66 74 73  term*/.      fts
2dfc0 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
2dfd0 28 61 2c 20 69 4f 66 66 2c 20 6e 41 70 70 65 6e  (a, iOff, nAppen
2dfe0 64 29 3b 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e  d);.      term.n
2dff0 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20   = nKeep;.      
2e000 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
2e010 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c  Blob(&rc, &term,
2e020 20 6e 41 70 70 65 6e 64 2c 20 26 61 5b 69 4f 66   nAppend, &a[iOf
2e030 66 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f]);.      sqlit
2e040 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2e050 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ndPrintf(.      
2e060 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74      &rc, &s, " t
2e070 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e  erm=%.*s", term.
2e080 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  n, (const char*)
2e090 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a  term.p.      );.
2e0a0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 41        iOff += nA
2e0b0 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ppend;..      /*
2e0c0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
2e0d0 65 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  e the doclist fo
2e0e0 72 20 74 68 69 73 20 74 65 72 6d 20 65 6e 64 73  r this term ends
2e0f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 50   */.      if( iP
2e100 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  gidxOff<n ){.   
2e110 20 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a       int nIncr;.
2e120 20 20 20 20 20 20 20 20 66 74 73 35 46 61 73 74          fts5Fast
2e130 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
2e140 50 67 69 64 78 4f 66 66 2c 20 6e 49 6e 63 72 29  PgidxOff, nIncr)
2e150 3b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f  ;.        iTermO
2e160 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20  ff += nIncr;.   
2e170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e180 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c    iTermOff = szL
2e190 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eaf;.      }..  
2e1a0 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f      fts5DecodeRo
2e1b0 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c  widList(&rc, &s,
2e1c0 20 26 61 5b 69 4f 66 66 5d 2c 20 69 54 65 72 6d   &a[iOff], iTerm
2e1d0 4f 66 66 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20  Off-iOff);.     
2e1e0 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
2e1f0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
2e200 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  <szLeaf ){.     
2e210 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
2e220 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20  rint32(a, iOff, 
2e230 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeep);.      }.
2e240 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42      }..    fts5B
2e250 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29  ufferFree(&term)
2e260 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46  ;.  }else{.    F
2e270 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
2e280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e290 43 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61  Current term rea
2e2a0 64 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20  d from page */. 
2e2b0 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 20 20     int szLeaf;  
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2d0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 70 67   /* Offset of pg
2e2e0 69 64 78 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20  idx in a[] */.  
2e2f0 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 3b    int iPgidxOff;
2e300 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 50  .    int iPgidxP
2e310 72 65 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rev = 0;        
2e320 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76     /* Previous v
2e330 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 70  alue read from p
2e340 67 69 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gidx */.    int 
2e350 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
2e360 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20    int iRowidOff 
2e370 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  = 0;.    int iOf
2e380 66 3b 0a 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c  f;.    int nDocl
2e390 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  ist;..    memset
2e3a0 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&term, 0, sizeo
2e3b0 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
2e3c0 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 7b 0a  .    if( n<4 ){.
2e3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2e3e0 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
2e3f0 26 73 2c 20 37 2c 20 28 63 6f 6e 73 74 20 75 38  &s, 7, (const u8
2e400 2a 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20  *)"corrupt");.  
2e410 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f      goto decode_
2e420 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  out;.    }else{.
2e430 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20        iRowidOff 
2e440 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
2e450 30 5d 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64  0]);.      iPgid
2e460 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20  xOff = szLeaf = 
2e470 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d  fts5GetU16(&a[2]
2e480 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 67  );.      if( iPg
2e490 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  idxOff<n ){.    
2e4a0 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
2e4b0 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66  t32(&a[iPgidxOff
2e4c0 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20  ], iTermOff);.  
2e4d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2e4e0 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
2e4f0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 61 69  osition list tai
2e500 6c 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  l at the start o
2e510 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
2e520 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 21    if( iRowidOff!
2e530 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66  =0 ){.      iOff
2e540 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20   = iRowidOff;.  
2e550 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72    }else if( iTer
2e560 6d 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20  mOff!=0 ){.     
2e570 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
2e580 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e590 20 20 20 69 4f 66 66 20 3d 20 73 7a 4c 65 61 66     iOff = szLeaf
2e5a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
2e5b0 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72  DecodePoslist(&r
2e5c0 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f  c, &s, &a[4], iO
2e5d0 66 66 2d 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  ff-4);..    /* D
2e5e0 65 63 6f 64 65 20 61 6e 79 20 6d 6f 72 65 20 64  ecode any more d
2e5f0 6f 63 6c 69 73 74 20 64 61 74 61 20 74 68 61 74  oclist data that
2e600 20 61 70 70 65 61 72 73 20 6f 6e 20 74 68 65 20   appears on the 
2e610 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 0a  page before the.
2e620 20 20 20 20 2a 2a 20 66 69 72 73 74 20 74 65 72      ** first ter
2e630 6d 2e 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69  m. */.    nDocli
2e640 73 74 20 3d 20 28 69 54 65 72 6d 4f 66 66 20 3f  st = (iTermOff ?
2e650 20 69 54 65 72 6d 4f 66 66 20 3a 20 73 7a 4c 65   iTermOff : szLe
2e660 61 66 29 20 2d 20 69 4f 66 66 3b 0a 20 20 20 20  af) - iOff;.    
2e670 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
2e680 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
2e690 66 66 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ff], nDoclist);.
2e6a0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 50 67 69  .    while( iPgi
2e6b0 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20  dxOff<n ){.     
2e6c0 20 69 6e 74 20 62 46 69 72 73 74 20 3d 20 28 69   int bFirst = (i
2e6d0 50 67 69 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66  PgidxOff==szLeaf
2e6e0 29 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66  );     /* True f
2e6f0 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  or first term on
2e700 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2e710 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
2e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e730 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
2e740 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69   data */.      i
2e750 6e 74 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a  nt iEnd;.      .
2e760 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
2e770 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2e780 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
2e790 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2e7a0 69 50 67 69 64 78 50 72 65 76 20 2b 3d 20 6e 42  iPgidxPrev += nB
2e7b0 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  yte;.      iOff 
2e7c0 3d 20 69 50 67 69 64 78 50 72 65 76 3b 0a 0a 20  = iPgidxPrev;.. 
2e7d0 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f       if( iPgidxO
2e7e0 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
2e7f0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2e800 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e  &a[iPgidxOff], n
2e810 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
2e820 45 6e 64 20 3d 20 69 50 67 69 64 78 50 72 65 76  End = iPgidxPrev
2e830 20 2b 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   + nByte;.      
2e840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
2e850 45 6e 64 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  End = szLeaf;.  
2e860 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2e870 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20   bFirst==0 ){.  
2e880 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2e890 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
2e8a0 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  [iOff], nByte);.
2e8b0 20 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d          term.n =
2e8c0 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a   nByte;.      }.
2e8d0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2e8e0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
2e8f0 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  [iOff], nByte);.
2e900 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
2e910 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20  AppendBlob(&rc, 
2e920 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61  &term, nByte, &a
2e930 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 69  [iOff]);.      i
2e940 4f 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20  Off += nByte;.. 
2e950 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2e960 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2e970 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 26 72  tf(.          &r
2e980 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e  c, &s, " term=%.
2e990 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f  *s", term.n, (co
2e9a0 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70  nst char*)term.p
2e9b0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
2e9c0 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
2e9d0 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
2e9e0 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 45 6e  s, &a[iOff], iEn
2e9f0 64 2d 69 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a  d-iOff);.    }..
2ea00 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
2ea10 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20  ee(&term);.  }. 
2ea20 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20   . decode_out:. 
2ea30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
2ea40 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ea50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2ea60 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
2ea70 28 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68  (pCtx, (const ch
2ea80 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51  ar*)s.p, s.n, SQ
2ea90 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
2eaa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
2eab0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2eac0 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
2ead0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66  );.  }.  fts5Buf
2eae0 66 65 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a  ferFree(&s);.}..
2eaf0 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
2eb00 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
2eb10 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
2eb20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f  function fts5_ro
2eb30 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  wid()..*/.static
2eb40 20 76 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46   void fts5RowidF
2eb50 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
2eb60 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2eb70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
2eb80 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
2eb90 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
2eba0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2ebb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ebc0 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
2ebd0 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
2ebe0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
2ebf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2ec00 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
2ec10 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
2ec20 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28  har *zArg;.  if(
2ec30 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20   nArg==0 ){.    
2ec40 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2ec50 72 72 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75  rror(pCtx, "shou
2ec60 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69  ld be: fts5_rowi
2ec70 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29  d(subject, ....)
2ec80 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
2ec90 0a 20 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e  .    zArg = (con
2eca0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
2ecb0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
2ecc0 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30  l[0]);.    if( 0
2ecd0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
2ece0 70 28 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74  p(zArg, "segment
2ecf0 22 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ") ){.      i64 
2ed00 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e  iRowid;.      in
2ed10 74 20 73 65 67 69 64 2c 20 70 67 6e 6f 3b 0a 20  t segid, pgno;. 
2ed20 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33       if( nArg!=3
2ed30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2ed40 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2ed50 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20  (pCtx, .        
2ed60 20 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a 20      "should be: 
2ed70 66 74 73 35 5f 72 6f 77 69 64 28 27 73 65 67 6d  fts5_rowid('segm
2ed80 65 6e 74 27 2c 20 73 65 67 69 64 2c 20 70 67 6e  ent', segid, pgn
2ed90 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20  o))", -1.       
2eda0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
2edb0 0a 20 20 20 20 20 20 20 20 73 65 67 69 64 20 3d  .        segid =
2edc0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2edd0 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  nt(apVal[1]);.  
2ede0 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c        pgno = sql
2edf0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
2ee00 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20  pVal[2]);.      
2ee10 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
2ee20 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65  SEGMENT_ROWID(se
2ee30 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  gid, pgno);.    
2ee40 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2ee50 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69  lt_int64(pCtx, i
2ee60 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  Rowid);.      }.
2ee70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ee80 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2ee90 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20  error(pCtx, .   
2eea0 20 20 20 20 20 22 66 69 72 73 74 20 61 72 67 20       "first arg 
2eeb0 74 6f 20 66 74 73 35 5f 72 6f 77 69 64 28 29 20  to fts5_rowid() 
2eec0 6d 75 73 74 20 62 65 20 27 73 65 67 6d 65 6e 74  must be 'segment
2eed0 27 22 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b  '" , -1.      );
2eee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2eef0 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
2ef00 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ed as part of re
2ef10 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 46 54  gistering the FT
2ef20 53 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64  S5 module with d
2ef30 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
2ef40 63 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67  ction db. It reg
2ef50 69 73 74 65 72 73 20 73 65 76 65 72 61 6c 20 75  isters several u
2ef60 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
2ef70 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  ar functions use
2ef80 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35  ful.** with FTS5
2ef90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
2efa0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
2efb0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2efc0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2efd0 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  , some other.** 
2efe0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2eff0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  e is returned in
2f000 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stead..*/.int sq
2f010 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
2f020 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
2f030 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
2f040 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
2f050 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ion(.      db, "
2f060 66 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c  fts5_decode", 2,
2f070 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
2f080 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
2f090 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a  ion, 0, 0.  );..
2f0a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f0b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2f0c0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2f0d0 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20  unction(.       
2f0e0 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64   db, "fts5_decod
2f0f0 65 5f 6e 6f 6e 65 22 2c 20 32 2c 20 0a 20 20 20  e_none", 2, .   
2f100 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
2f110 2c 20 28 76 6f 69 64 2a 29 64 62 2c 20 66 74 73  , (void*)db, fts
2f120 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c  5DecodeFunction,
2f130 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
2f140 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
2f150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2f160 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
2f170 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
2f180 20 20 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77     db, "fts5_row
2f190 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  id", -1, SQLITE_
2f1a0 55 54 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77  UTF8, 0, fts5Row
2f1b0 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
2f1c0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65  .    );.  }.  re
2f1d0 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.