/ Hex Artifact Content
Login

Artifact 40eac312bdcb67552fe6dc2e0a4bad67d9273e3d:


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 54   leaf */..  /* T
40f0: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4100: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4110: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
4120: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
4130: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
4140: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
4150: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
4160: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
4170: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
4180: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
4190: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
41a0: 74 3b 0a 0a 20 20 69 6e 74 20 69 50 67 69 64 78  t;..  int iPgidx
41b0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
41c0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
41d0: 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f  fset in pgidx */
41e0: 0a 20 20 69 6e 74 20 69 45 6e 64 6f 66 44 6f 63  .  int iEndofDoc
41f0: 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  list;..  /* The 
4200: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e  following are on
4210: 6c 79 20 75 73 65 64 20 69 66 20 74 68 65 20 46  ly used if the F
4220: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
4230: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
4240: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
4250: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4260: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4270: 20 65 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64   entry in aRowid
4280: 4f 66 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e  Offset[] */.  in
4290: 74 20 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20  t nRowidOffset; 
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42b0: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
42c0: 6f 66 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  of aRowidOffset[
42d0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
42e0: 20 2a 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20   *aRowidOffset; 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4300: 41 72 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20  Array of offset 
4310: 74 6f 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20  to rowid fields 
4320: 2a 2f 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49  */..  Fts5DlidxI
4330: 74 65 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20  ter *pDlidx;    
4340: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
4350: 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
4360: 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61  ndex */..  /* Va
4370: 72 69 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65  riables populate
4380: 64 20 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65  d based on curre
4390: 6e 74 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46  nt entry. */.  F
43a0: 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43c0: 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  * Current term *
43d0: 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  /.  i64 iRowid; 
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
4400: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  owid */.  int nP
4410: 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
4420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4430: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4440: 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
4450: 20 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62 44   list */.  u8 bD
4460: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
4470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4480: 75 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65  ue if the delete
4490: 20 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a   flag is set */.
44a0: 20 20 2f 2f 20 75 38 20 62 43 6f 6e 74 65 6e 74    // u8 bContent
44b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
44c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
44d0: 68 61 73 20 63 6f 6e 74 65 6e 74 20 28 64 65 74  has content (det
44e0: 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 29 20 2a  ail=none mode) *
44f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  /.};../*.** Argu
4500: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
4510: 72 20 74 6f 20 61 6e 20 46 74 73 35 44 61 74 61  r to an Fts5Data
4520: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
4530: 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a 2a 20 6c  contains a .** l
4540: 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a 23 64 65  eaf page..*/.#de
4550: 66 69 6e 65 20 41 53 53 45 52 54 5f 53 5a 4c 45  fine ASSERT_SZLE
4560: 41 46 5f 4f 4b 28 78 29 20 61 73 73 65 72 74 28  AF_OK(x) assert(
4570: 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73 7a 4c 65   \.    (x)->szLe
4580: 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c 7c 20 28  af==(x)->nn || (
4590: 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66 74 73 35  x)->szLeaf==fts5
45a0: 47 65 74 55 31 36 28 26 28 78 29 2d 3e 70 5b 32  GetU16(&(x)->p[2
45b0: 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69 6e 65 20  ]) \.)..#define 
45c0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
45d0: 54 45 52 4d 20 30 78 30 31 0a 23 64 65 66 69 6e  TERM 0x01.#defin
45e0: 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  e FTS5_SEGITER_R
45f0: 45 56 45 52 53 45 20 30 78 30 32 0a 0a 2f 2a 20  EVERSE 0x02../* 
4600: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 73 20  .** Argument is 
4610: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
4620: 46 74 73 35 44 61 74 61 20 73 74 72 75 63 74 75  Fts5Data structu
4630: 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
4640: 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 2e   a leaf.** page.
4650: 20 54 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c   This macro eval
4660: 75 61 74 65 73 20 74 6f 20 74 72 75 65 20 69 66  uates to true if
4670: 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69   the leaf contai
4680: 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 0a  ns no terms, or.
4690: 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 63  ** false if it c
46a0: 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
46b0: 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64   one term..*/.#d
46c0: 65 66 69 6e 65 20 66 74 73 35 4c 65 61 66 49 73  efine fts5LeafIs
46d0: 54 65 72 6d 6c 65 73 73 28 78 29 20 28 28 78 29  Termless(x) ((x)
46e0: 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28 78 29 2d  ->szLeaf >= (x)-
46f0: 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65 20 66 74  >nn)..#define ft
4700: 73 35 4c 65 61 66 54 65 72 6d 4f 66 66 28 78 2c  s5LeafTermOff(x,
4710: 20 69 29 20 28 66 74 73 35 47 65 74 55 31 36 28   i) (fts5GetU16(
4720: 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c  &(x)->p[(x)->szL
4730: 65 61 66 20 2b 20 28 69 29 2a 32 5d 29 29 0a 0a  eaf + (i)*2]))..
4740: 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61 66  #define fts5Leaf
4750: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 78 29  FirstRowidOff(x)
4760: 20 28 66 74 73 35 47 65 74 55 31 36 28 28 78 29   (fts5GetU16((x)
4770: 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  ->p))../*.** Obj
4780: 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e  ect for iteratin
4790: 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65  g through the me
47a0: 72 67 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20  rged results of 
47b0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  one or more segm
47c0: 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e  ents,.** visitin
47d0: 67 20 65 61 63 68 20 74 65 72 6d 2f 72 6f 77 69  g each term/rowi
47e0: 64 20 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65  d pair in the me
47f0: 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  rged data..**.**
4800: 20 6e 53 65 67 20 69 73 20 61 6c 77 61 79 73 20   nSeg is always 
4810: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67  a power of two g
4820: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
4830: 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62  qual to the numb
4840: 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74  er of.** segment
4850: 73 20 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65  s that this obje
4860: 63 74 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61  ct is merging da
4870: 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68  ta from. Both th
4880: 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20  e aSeg[] and.** 
4890: 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20  aFirst[] arrays 
48a0: 61 72 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65  are sized at nSe
48b0: 67 20 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61  g entries. The a
48c0: 53 65 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70  Seg[] array is p
48d0: 61 64 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65  added.** with ze
48e0: 72 6f 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74  roed objects - t
48f0: 68 65 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  hese are handled
4900: 20 61 73 20 69 66 20 74 68 65 79 20 77 65 72 65   as if they were
4910: 20 69 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65   iterators opene
4920: 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65  d.** on empty se
4930: 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  gments..**.** Th
4940: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
4950: 70 61 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20  paring segments 
4960: 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67  aSeg[N] and aSeg
4970: 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69  [N+1], where N i
4980: 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d  s an.** even num
4990: 62 65 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69  ber, is stored i
49a0: 6e 20 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e  n aFirst[(nSeg+N
49b0: 29 2f 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c  )/2]. The "resul
49c0: 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f  t" of the .** co
49d0: 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73  mparison in this
49e0: 20 63 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20   context is the 
49f0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69 74 65  index of the ite
4a00: 72 61 74 6f 72 20 74 68 61 74 20 63 75 72 72 65  rator that curre
4a10: 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ntly.** points t
4a20: 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65  o the smaller te
4a30: 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61  rm/rowid combina
4a40: 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20  tion. Iterators 
4a50: 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f  at EOF are.** co
4a60: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 67  nsidered to be g
4a70: 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
4a80: 6f 74 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e  other iterators.
4a90: 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d  .**.** aFirst[1]
4aa0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
4ab0: 64 65 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66  dex in aSeg[] of
4ac0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68   the iterator th
4ad0: 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  at points to.** 
4ae0: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
4af0: 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74   overall. aFirst
4b00: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a  [0] is unused. .
4b10: 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74 3a 0a 2a  **.** poslist:.*
4b20: 2a 20 20 20 55 73 65 64 20 62 79 20 73 71 6c 69  *   Used by sqli
4b30: 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
4b40: 73 74 28 29 20 77 68 65 6e 20 74 68 65 20 70 6f  st() when the po
4b50: 73 6c 69 73 74 20 6e 65 65 64 73 20 74 6f 20 62  slist needs to b
4b60: 65 20 62 75 66 66 65 72 65 64 2e 0a 2a 2a 20 20  e buffered..**  
4b70: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   There is no way
4b80: 20 74 6f 20 74 65 6c 6c 20 69 66 20 74 68 69 73   to tell if this
4b90: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
4ba0: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20   not..*/.struct 
4bb0: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b 0a  Fts5IndexIter {.
4bc0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e    Fts5Index *pIn
4bd0: 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
4be0: 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20    /* Index that 
4bf0: 6f 77 6e 73 20 74 68 69 73 20 69 74 65 72 61 74  owns this iterat
4c00: 6f 72 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  or */.  Fts5Stru
4c10: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20  cture *pStruct; 
4c20: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4c30: 61 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ase structure fo
4c40: 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  r this iterator 
4c50: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
4c60: 70 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20  poslist;        
4c70: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
4c80: 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e  ontaining curren
4c90: 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 0a 20 20  t poslist */..  
4ca0: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4cd0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4ce0: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d00: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4d10: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4d20: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4d30: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4d40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4d50: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4d60: 74 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 62 45  tries */.  u8 bE
4d70: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
4d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4d90: 75 65 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 75  ue at EOF */.  u
4da0: 38 20 62 46 69 6c 74 65 72 65 64 3b 20 20 20 20  8 bFiltered;    
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4dc0: 2a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  * True if column
4dd0: 2d 66 69 6c 74 65 72 20 61 6c 72 65 61 64 79 20  -filter already 
4de0: 61 70 70 6c 69 65 64 20 2a 2f 0a 0a 20 20 69 36  applied */..  i6
4df0: 34 20 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20  4 iSwitchRowid; 
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4e10: 20 46 69 72 73 74 65 73 74 20 72 6f 77 69 64 20   Firstest rowid 
4e20: 6f 66 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46  of other than aF
4e30: 69 72 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73  irst[1] */.  Fts
4e40: 35 43 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74  5CResult *aFirst
4e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4e60: 43 75 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74  Current merge st
4e70: 61 74 65 20 28 73 65 65 20 61 62 6f 76 65 29 20  ate (see above) 
4e80: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
4e90: 20 61 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20   aSeg[1];       
4ea0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
4eb0: 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
4ec0: 72 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  rs */.};.../*.**
4ed0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
4ee0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  the following ty
4ef0: 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  pe is used to it
4f00: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
4f10: 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
4f20: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
4f30: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70   record..**.** p
4f40: 44 61 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72  Data:.**   Recor
4f50: 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  d containing the
4f60: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64   doclist-index d
4f70: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a  ata..**.** bEof:
4f80: 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75  .**   Set to tru
4f90: 65 20 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20  e once iterator 
4fa0: 68 61 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e  has reached EOF.
4fb0: 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20  .**.** iOff:.** 
4fc0: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
4fd0: 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68  rent offset with
4fe0: 69 6e 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e  in record pData.
4ff0: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44  .*/.struct Fts5D
5000: 6c 69 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35  lidxLvl {.  Fts5
5010: 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20  Data *pData;    
5020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5030: 61 20 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61  a for current pa
5040: 67 65 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c  ge of this level
5050: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
5080: 66 66 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61  ffset into pData
5090: 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20   */.  int bEof; 
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c      /* At EOF al
50c0: 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69  ready */.  int i
50d0: 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20  FirstOff;       
50e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
50f0: 20 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72   by reverse iter
5100: 61 74 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  ators */..  /* O
5110: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
5120: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
5130: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
5140: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
5150: 72 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61  r of current lea
5160: 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20  f page */.  i64 
5170: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
5180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5190: 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66  st rowid on leaf
51a0: 20 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b   iLeafPgno */.};
51b0: 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64  .struct Fts5Dlid
51c0: 78 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c  xIter {.  int nL
51d0: 76 6c 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  vl;.  int iSegid
51e0: 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c  ;.  Fts5DlidxLvl
51f0: 20 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74   aLvl[1];.};..st
5200: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 75  atic void fts5Pu
5210: 74 55 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75  tU16(u8 *aOut, u
5220: 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74  16 iVal){.  aOut
5230: 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b  [0] = (iVal>>8);
5240: 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56  .  aOut[1] = (iV
5250: 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61  al&0xFF);.}..sta
5260: 74 69 63 20 75 31 36 20 66 74 73 35 47 65 74 55  tic u16 fts5GetU
5270: 31 36 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e  16(const u8 *aIn
5280: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31  ){.  return ((u1
5290: 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b  6)aIn[0] << 8) +
52a0: 20 61 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a   aIn[1];.} ../*.
52b0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
52c0: 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72 20  return a buffer 
52d0: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
52e0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
52f0: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
5300: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
5310: 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ed, return NULL 
5320: 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72 6f  and set the erro
5330: 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65  r code in.** the
5340: 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
5350: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
5360: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
5370: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
5380: 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74  fts5IdxMalloc(Ft
5390: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
53a0: 6e 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e  nByte){.  return
53b0: 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c   sqlite3Fts5Mall
53c0: 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e  ocZero(&p->rc, n
53d0: 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Byte);.}../*.** 
53e0: 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74  Compare the cont
53f0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66  ents of the pLef
5400: 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74 68  t buffer with th
5410: 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20  e pRight/nRight 
5420: 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  blob..**.** Retu
5430: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
5440: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
5450: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
5460: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
5470: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
5480: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
5490: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
54a0: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
54b0: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
54c0: 2a 70 52 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65  *pRight.*/.#ifde
54d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
54e0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75  tatic int fts5Bu
54f0: 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28  fferCompareBlob(
5500: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
5510: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
5520: 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20     /* Left hand 
5530: 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  side of comparis
5540: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  on */.  const u8
5550: 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52   *pRight, int nR
5560: 69 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74  ight    /* Right
5570: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f   hand side of co
5580: 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20  mparison */.){. 
5590: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
55a0: 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74  pLeft->n, nRight
55b0: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
55c0: 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20  emcmp(pLeft->p, 
55d0: 70 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20  pRight, nCmp);. 
55e0: 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20   return (res==0 
55f0: 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52  ? (pLeft->n - nR
5600: 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a  ight) : res);.}.
5610: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
5620: 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
5630: 74 73 20 6f 66 20 74 68 65 20 74 77 6f 20 62 75  ts of the two bu
5640: 66 66 65 72 73 20 75 73 69 6e 67 20 6d 65 6d 63  ffers using memc
5650: 6d 70 28 29 2e 20 49 66 20 6f 6e 65 20 62 75 66  mp(). If one buf
5660: 66 65 72 0a 2a 2a 20 69 73 20 61 20 70 72 65 66  fer.** is a pref
5670: 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c  ix of the other,
5680: 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65   it is considere
5690: 64 20 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a  d the lesser..**
56a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69  .** Return -ve i
56b0: 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c  f pLeft is small
56c0: 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20  er than pRight, 
56d0: 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71  0 if they are eq
56e0: 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66  ual or.** +ve if
56f0: 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c   pRight is small
5700: 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49  er than pLeft. I
5710: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a  n other words:.*
5720: 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a  *.**     res = *
5730: 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a  pLeft - *pRight.
5740: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
5750: 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
5760: 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66  Fts5Buffer *pLef
5770: 74 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  t, Fts5Buffer *p
5780: 52 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43  Right){.  int nC
5790: 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e  mp = MIN(pLeft->
57a0: 6e 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20  n, pRight->n);. 
57b0: 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d   int res = memcm
57c0: 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67  p(pLeft->p, pRig
57d0: 68 74 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20  ht->p, nCmp);.  
57e0: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f  return (res==0 ?
57f0: 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69   (pLeft->n - pRi
5800: 67 68 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a  ght->n) : res);.
5810: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
5820: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
5830: 74 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72  t fts5BlobCompar
5840: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  e(.  const u8 *p
5850: 4c 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c  Left, int nLeft,
5860: 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52   .  const u8 *pR
5870: 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74  ight, int nRight
5880: 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d  .){.  int nCmp =
5890: 20 4d 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67   MIN(nLeft, nRig
58a0: 68 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  ht);.  int res =
58b0: 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70   memcmp(pLeft, p
58c0: 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20  Right, nCmp);.  
58d0: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f  return (res==0 ?
58e0: 20 28 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74   (nLeft - nRight
58f0: 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64  ) : res);.}.#end
5900: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  if..static int f
5910: 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
5920: 4f 66 66 28 46 74 73 35 44 61 74 61 20 2a 70 4c  Off(Fts5Data *pL
5930: 65 61 66 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b  eaf){.  int ret;
5940: 0a 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  .  fts5GetVarint
5950: 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65  32(&pLeaf->p[pLe
5960: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 72 65 74  af->szLeaf], ret
5970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  );.  return ret;
5980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
5990: 74 68 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c  the read-only bl
59a0: 6f 62 20 68 61 6e 64 6c 65 2c 20 69 66 20 69 74  ob handle, if it
59b0: 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61   is open..*/.sta
59c0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 6c 6f  tic void fts5Clo
59d0: 73 65 52 65 61 64 65 72 28 46 74 73 35 49 6e 64  seReader(Fts5Ind
59e0: 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ex *p){.  if( p-
59f0: 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  >pReader ){.    
5a00: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52  sqlite3_blob *pR
5a10: 65 61 64 65 72 20 3d 20 70 2d 3e 70 52 65 61 64  eader = p->pRead
5a20: 65 72 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64  er;.    p->pRead
5a30: 65 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  er = 0;.    sqli
5a40: 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
5a50: 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  Reader);.  }.}..
5a60: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
5a70: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
5a80: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
5a90: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
5aa0: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
5ab0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
5ac0: 6e 20 65 72 72 6f 72 20 6c 65 66 74 20 69 6e 20  n error left in 
5ad0: 74 68 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65  the .** Fts5Inde
5ae0: 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  x object..*/.sta
5af0: 74 69 63 20 46 74 73 35 44 61 74 61 20 2a 66 74  tic Fts5Data *ft
5b00: 73 35 44 61 74 61 52 65 61 64 28 46 74 73 35 49  s5DataRead(Fts5I
5b10: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f  ndex *p, i64 iRo
5b20: 77 69 64 29 7b 0a 20 20 46 74 73 35 44 61 74 61  wid){.  Fts5Data
5b30: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
5b40: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
5b50: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
5b60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
5b70: 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65     if( p->pReade
5b80: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  r ){.      /* Th
5b90: 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75  is call may retu
5ba0: 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  rn SQLITE_ABORT 
5bb0: 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
5bc0: 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20  n a savepoint.  
5bd0: 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
5be0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
5bf0: 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20  t used. In this 
5c00: 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20  case a new blob 
5c10: 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20  handle.      ** 
5c20: 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  is required.  */
5c30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
5c40: 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e  lob *pBlob = p->
5c50: 70 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 70  pReader;.      p
5c60: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
5c70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5c80: 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42  3_blob_reopen(pB
5c90: 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  lob, iRowid);.  
5ca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
5cb0: 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
5cc0: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5cd0: 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66 28  pBlob;.      if(
5ce0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5cf0: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 6c  {.        fts5Cl
5d00: 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
5d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5d20: 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  rc==SQLITE_ABORT
5d30: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
5d40: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5d50: 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e   If the blob han
5d60: 64 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  dle is not open 
5d70: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f  at this point, o
5d80: 70 65 6e 20 69 74 20 61 6e 64 20 73 65 65 6b 20  pen it and seek 
5d90: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  .    ** to the r
5da0: 65 71 75 65 73 74 65 64 20 65 6e 74 72 79 2e 20  equested entry. 
5db0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
5dc0: 52 65 61 64 65 72 3d 3d 30 20 26 26 20 72 63 3d  Reader==0 && rc=
5dd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5de0: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
5df0: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
5e00: 6e 66 69 67 3b 0a 20 20 20 20 20 20 72 63 20 3d  nfig;.      rc =
5e10: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
5e20: 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  en(pConfig->db, 
5e30: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
5e40: 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74  ig->zDb, p->zDat
5e50: 61 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69  aTbl, "block", i
5e60: 52 6f 77 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52  Rowid, 0, &p->pR
5e70: 65 61 64 65 72 0a 20 20 20 20 20 20 29 3b 0a 20  eader.      );. 
5e80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
5e90: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 71  either of the sq
5ea0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
5eb0: 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f  ) or sqlite3_blo
5ec0: 62 5f 72 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73  b_reopen() calls
5ed0: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 72 65  .    ** above re
5ee0: 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 45 52  turned SQLITE_ER
5ef0: 52 4f 52 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ROR, return SQLI
5f00: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 20  TE_CORRUPT_VTAB 
5f10: 69 6e 73 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20  instead..    ** 
5f20: 41 6c 6c 20 74 68 65 20 72 65 61 73 6f 6e 73 20  All the reasons 
5f30: 74 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  those functions 
5f40: 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c  might return SQL
5f50: 49 54 45 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73  ITE_ERROR - miss
5f60: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ing.    ** table
5f70: 2c 20 6d 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e  , missing row, n
5f80: 6f 6e 2d 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20  on-blob/text in 
5f90: 62 6c 6f 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69  block column - i
5fa0: 6e 64 69 63 61 74 65 20 0a 20 20 20 20 2a 2a 20  ndicate .    ** 
5fb0: 62 61 63 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f  backing store co
5fc0: 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
5fd0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5fe0: 5f 45 52 52 4f 52 20 29 20 72 63 20 3d 20 46 54  _ERROR ) rc = FT
5ff0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20  S5_CORRUPT;..   
6000: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6010: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  OK ){.      u8 *
6020: 61 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  aOut = 0;       
6030: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
6040: 62 6c 6f 62 20 64 61 74 61 20 69 6e 74 6f 20 74  blob data into t
6050: 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  his buffer */.  
6060: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
6070: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
6080: 65 73 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a  es(p->pReader);.
6090: 20 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63        int nAlloc
60a0: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61   = sizeof(Fts5Da
60b0: 74 61 29 20 2b 20 6e 42 79 74 65 20 2b 20 46 54  ta) + nByte + FT
60c0: 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b  S5_DATA_PADDING;
60d0: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 28 46  .      pRet = (F
60e0: 74 73 35 44 61 74 61 2a 29 73 71 6c 69 74 65 33  ts5Data*)sqlite3
60f0: 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b  _malloc(nAlloc);
6100: 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20  .      if( pRet 
6110: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  ){.        pRet-
6120: 3e 6e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  >nn = nByte;.   
6130: 20 20 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74       aOut = pRet
6140: 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74  ->p = (u8*)&pRet
6150: 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [1];.      }else
6160: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
6170: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6180: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6190: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
61a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
61b0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
61c0: 70 2d 3e 70 52 65 61 64 65 72 2c 20 61 4f 75 74  p->pReader, aOut
61d0: 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20  , nByte, 0);.   
61e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
61f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6200: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6210: 66 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20  free(pRet);.    
6220: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
6230: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6240: 20 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78     /* TODO1: Fix
6250: 20 74 68 69 73 20 2a 2f 0a 20 20 20 20 20 20 20   this */.       
6260: 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20   pRet->szLeaf = 
6270: 66 74 73 35 47 65 74 55 31 36 28 26 70 52 65 74  fts5GetU16(&pRet
6280: 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ->p[2]);.      }
6290: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63  .    }.    p->rc
62a0: 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52   = rc;.    p->nR
62b0: 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73  ead++;.  }..  as
62c0: 73 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d  sert( (pRet==0)=
62d0: 3d 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  =(p->rc!=SQLITE_
62e0: 4f 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OK) );.  return 
62f0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
6300: 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
6310: 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72  ce to data recor
6320: 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  d returned by an
6330: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
6340: 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61 64  .** fts5DataRead
6350: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
6360: 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  id fts5DataRelea
6370: 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61  se(Fts5Data *pDa
6380: 74 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ta){.  sqlite3_f
6390: 72 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73  ree(pData);.}..s
63a0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
63b0: 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a  dexPrepareStmt(.
63c0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
63d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
63e0: 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20  *ppStmt,.  char 
63f0: 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70  *zSql.){.  if( p
6400: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
6410: 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20  ){.    if( zSql 
6420: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
6430: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6440: 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  _v2(p->pConfig->
6450: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70  db, zSql, -1, pp
6460: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Stmt, 0);.    }e
6470: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  lse{.      p->rc
6480: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
64a0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
64b0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
64c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52  .}.../*.** INSER
64d0: 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72  T OR REPLACE a r
64e0: 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25  ecord into the %
64f0: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  _data table..*/.
6500: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6510: 44 61 74 61 57 72 69 74 65 28 46 74 73 35 49 6e  DataWrite(Fts5In
6520: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
6530: 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  id, const u8 *pD
6540: 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b  ata, int nData){
6550: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
6560: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6570: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69  ;..  if( p->pWri
6580: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74  ter==0 ){.    Ft
6590: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
65a0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
65b0: 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65      fts5IndexPre
65c0: 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e  pareStmt(p, &p->
65d0: 70 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33  pWriter, sqlite3
65e0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
65f0: 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54      "REPLACE INT
6600: 4f 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27  O '%q'.'%q_data'
6610: 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55  (id, block) VALU
6620: 45 53 28 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20  ES(?,?)", .     
6630: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
6640: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
6650: 65 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66  e.    ));.    if
6660: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
6670: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
6680: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
6690: 57 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77 69  Writer, 1, iRowi
66a0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  d);.  sqlite3_bi
66b0: 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74  nd_blob(p->pWrit
66c0: 65 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e 44  er, 2, pData, nD
66d0: 61 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ata, SQLITE_STAT
66e0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  IC);.  sqlite3_s
66f0: 74 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  tep(p->pWriter);
6700: 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
6710: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72 69  e3_reset(p->pWri
6720: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ter);.}../*.** E
6730: 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f  xecute the follo
6740: 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20  wing SQL:.**.** 
6750: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
6760: 25 5f 64 61 74 61 20 57 48 45 52 45 20 69 64 20  %_data WHERE id 
6770: 42 45 54 57 45 45 4e 20 24 69 46 69 72 73 74 20  BETWEEN $iFirst 
6780: 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74  AND $iLast.*/.st
6790: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
67a0: 74 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e 64  taDelete(Fts5Ind
67b0: 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72 73  ex *p, i64 iFirs
67c0: 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a 20  t, i64 iLast){. 
67d0: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
67e0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a  TE_OK ) return;.
67f0: 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65 74  .  if( p->pDelet
6800: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  er==0 ){.    int
6810: 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e   rc;.    Fts5Con
6820: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
6830: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63  ->pConfig;.    c
6840: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
6850: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
6860: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
6870: 4d 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27  M '%q'.'%q_data'
6880: 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44   WHERE id>=? AND
6890: 20 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20   id<=?", .      
68a0: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
68b0: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
68c0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
68d0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
68e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
68f0: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
6900: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6910: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f  3_prepare_v2(pCo
6920: 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  nfig->db, zSql, 
6930: 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72  -1, &p->pDeleter
6940: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6950: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
6960: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
6970: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6980: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
6990: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
69a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
69b0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
69c0: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  ->pDeleter, 1, i
69d0: 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  First);.  sqlite
69e0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
69f0: 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61  pDeleter, 2, iLa
6a00: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
6a10: 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  tep(p->pDeleter)
6a20: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
6a30: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65  te3_reset(p->pDe
6a40: 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  leter);.}../*.**
6a50: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f   Remove all reco
6a60: 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  rds associated w
6a70: 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67  ith segment iSeg
6a80: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  id..*/.static vo
6a90: 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76  id fts5DataRemov
6aa0: 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64  eSegment(Fts5Ind
6ab0: 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69  ex *p, int iSegi
6ac0: 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74  d){.  i64 iFirst
6ad0: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
6ae0: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 29  ROWID(iSegid, 0)
6af0: 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
6b00: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6b10: 49 44 28 69 53 65 67 69 64 2b 31 2c 20 30 29 2d  ID(iSegid+1, 0)-
6b20: 31 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c  1;.  fts5DataDel
6b30: 65 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69  ete(p, iFirst, i
6b40: 4c 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Last);.  if( p->
6b50: 70 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29  pIdxDeleter==0 )
6b60: 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
6b70: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
6b80: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
6b90: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
6ba0: 28 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65  (p, &p->pIdxDele
6bb0: 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  ter, sqlite3_mpr
6bc0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
6bd0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
6be0: 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45  '.'%q_idx' WHERE
6bf0: 20 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20   segid=?",.     
6c00: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
6c10: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
6c20: 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20  e.    ));.  }.  
6c30: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
6c40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6c50: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
6c60: 70 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20  pIdxDeleter, 1, 
6c70: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c  iSegid);.    sql
6c80: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64  ite3_step(p->pId
6c90: 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70  xDeleter);.    p
6ca0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6cb0: 65 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65  eset(p->pIdxDele
6cc0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
6cd0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
6ce0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73  erence to an Fts
6cf0: 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
6d00: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  t returned by an
6d10: 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c   earlier .** cal
6d20: 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75  l to fts5Structu
6d30: 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35  reRead() or fts5
6d40: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
6d50: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
6d60: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  d fts5StructureR
6d70: 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63  elease(Fts5Struc
6d80: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
6d90: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
6da0: 20 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e   0>=(--pStruct->
6db0: 6e 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74  nRef) ){.    int
6dc0: 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
6dd0: 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30  pStruct->nRef==0
6de0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
6df0: 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   i<pStruct->nLev
6e00: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
6e10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
6e20: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
6e30: 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aSeg);.    }.   
6e40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
6e50: 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  truct);.  }.}..s
6e60: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
6e70: 74 72 75 63 74 75 72 65 52 65 66 28 46 74 73 35  tructureRef(Fts5
6e80: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
6e90: 63 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e  ct){.  pStruct->
6ea0: 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nRef++;.}../*.**
6eb0: 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64   Deserialize and
6ec0: 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75   return the stru
6ed0: 63 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72  cture record cur
6ee0: 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
6ef0: 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66   serialized.** f
6f00: 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65  orm within buffe
6f10: 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a  r pData/nData..*
6f20: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72  *.** The Fts5Str
6f30: 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20  ucture.aLevel[] 
6f40: 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72  and each Fts5Str
6f50: 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67  uctureLevel.aSeg
6f60: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
6f70: 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62  over-allocated b
6f80: 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73  y one slot. This
6f90: 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75   allows the stru
6fa0: 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  cture contents.*
6fb0: 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73  * to be more eas
6fc0: 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a  ily edited..**.*
6fd0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6fe0: 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20  curs, *ppOut is 
6ff0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
7000: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
7010: 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
7020: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70  . Otherwise, *pp
7030: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
7040: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
7050: 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c  bject and.** SQL
7060: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
7070: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7080: 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
7090: 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  de(.  const u8 *
70a0: 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
70b0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
70c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61  containing seria
70d0: 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20  lized structure 
70e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7110: 62 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20  buffer pData in 
7120: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  bytes */.  int *
7130: 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20  piCookie,       
7140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7150: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
7160: 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74  ie value */.  Ft
7170: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
7180: 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Out           /*
7190: 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a   OUT: Deserializ
71a0: 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ed object */.){.
71b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
71c0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20  E_OK;.  int i = 
71d0: 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20  0;.  int iLvl;. 
71e0: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b   int nLevel = 0;
71f0: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
7200: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
7210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7220: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
7230: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
7240: 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a  cate at pRet */.
7250: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7260: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
7270: 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
7280: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
7290: 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  */..  /* Grab th
72a0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  e cookie value *
72b0: 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65  /.  if( piCookie
72c0: 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73   ) *piCookie = s
72d0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28  qlite3Fts5Get32(
72e0: 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b  pData);.  i = 4;
72f0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
7300: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7310: 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65  levels and segme
7320: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
7330: 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  rt of the.  ** s
7340: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
7350: 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35    */.  i += fts5
7360: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7370: 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a  ta[i], nLevel);.
7380: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
7390: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
73a0: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e  , nSegment);.  n
73b0: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73  Byte = (.      s
73c0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
73d0: 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ure) +          
73e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
73f0: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
7400: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7410: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20  StructureLevel) 
7420: 2a 20 28 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20  * (nLevel-1)    
7430: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7440: 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74  y */.  );.  pRet
7450: 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
7460: 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
7470: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
7480: 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65  yte);..  if( pRe
7490: 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  t ){.    pRet->n
74a0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 52 65  Ref = 1;.    pRe
74b0: 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76  t->nLevel = nLev
74c0: 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53  el;.    pRet->nS
74d0: 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e  egment = nSegmen
74e0: 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  t;.    i += sqli
74f0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
7500: 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65  (&pData[i], &pRe
7510: 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
7520: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  );..    for(iLvl
7530: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
7540: 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c  K && iLvl<nLevel
7550: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
7560: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7570: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65  vel *pLvl = &pRe
7580: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
7590: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61  .      int nTota
75a0: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  l;.      int iSe
75b0: 67 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 66  g;..      i += f
75c0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
75d0: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
75e0: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 69  nMerge);.      i
75f0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7600: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
7610: 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61 73  Total);.      as
7620: 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c  sert( nTotal>=pL
7630: 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20  vl->nMerge );.  
7640: 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
7650: 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53   (Fts5StructureS
7660: 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46  egment*)sqlite3F
7670: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
7680: 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e 54  c, .          nT
7690: 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74  otal * sizeof(Ft
76a0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
76b0: 6e 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20  nt).      );..  
76c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
76d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
76e0: 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54   pLvl->nSeg = nT
76f0: 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f  otal;.        fo
7700: 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e  r(iSeg=0; iSeg<n
7710: 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a  Total; iSeg++){.
7720: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66            i += f
7730: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
7740: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
7750: 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69  aSeg[iSeg].iSegi
7760: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  d);.          i 
7770: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7780: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7790: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
77a0: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
77b0: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
77c0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
77d0: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  [i], pLvl->aSeg[
77e0: 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b  iSeg].pgnoLast);
77f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7810: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
7820: 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20  ease(pRet);.    
7830: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
7840: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7850: 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74  .  *ppOut = pRet
7860: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7870: 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
7880: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
7890: 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74  tureAddLevel(int
78a0: 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63   *pRc, Fts5Struc
78b0: 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29  ture **ppStruct)
78c0: 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
78d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
78e0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
78f0: 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
7900: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65  t;.    int nLeve
7910: 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  l = pStruct->nLe
7920: 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79  vel;.    int nBy
7930: 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73  te = (.        s
7940: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7950: 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ure) +          
7960: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20          /* Main 
7970: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
7980: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7990: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20  StructureLevel) 
79a0: 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a  * (nLevel+1)  /*
79b0: 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20   aLevel[] array 
79c0: 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70  */.    );..    p
79d0: 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33  Struct = sqlite3
79e0: 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74  _realloc(pStruct
79f0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
7a00: 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
7a10: 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75     memset(&pStru
7a20: 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65  ct->aLevel[nLeve
7a30: 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  l], 0, sizeof(Ft
7a40: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7a50: 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  ));.      pStruc
7a60: 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20  t->nLevel++;.   
7a70: 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70     *ppStruct = p
7a80: 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73  Struct;.    }els
7a90: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
7aa0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7ab0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7ac0: 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c   Extend level iL
7ad0: 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  vl so that there
7ae0: 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20   is room for at 
7af0: 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72  least nExtra mor
7b00: 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  e.** segments..*
7b10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7b20: 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
7b30: 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70  dLevel(.  int *p
7b40: 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63  Rc, .  Fts5Struc
7b50: 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a  ture *pStruct, .
7b60: 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69    int iLvl, .  i
7b70: 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e  nt nExtra, .  in
7b80: 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69  t bInsert.){.  i
7b90: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
7ba0: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  OK ){.    Fts5St
7bb0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
7bc0: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
7bd0: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
7be0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
7bf0: 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20  gment *aNew;.   
7c00: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20   int nByte;..   
7c10: 20 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e   nByte = (pLvl->
7c20: 6e 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a  nSeg + nExtra) *
7c30: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7c40: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
7c50: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
7c60: 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e  3_realloc(pLvl->
7c70: 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20  aSeg, nByte);.  
7c80: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
7c90: 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d      if( bInsert=
7ca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
7cb0: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d  mset(&aNew[pLvl-
7cc0: 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nSeg], 0, sizeo
7cd0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
7ce0: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
7cf0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7d00: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76          int nMov
7d10: 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a  e = pLvl->nSeg *
7d20: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7d30: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
7d40: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
7d50: 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e  aNew[nExtra], aN
7d60: 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  ew, nMove);.    
7d70: 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c      memset(aNew,
7d80: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
7d90: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
7da0: 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20   * nExtra);.    
7db0: 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e    }.      pLvl->
7dc0: 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  aSeg = aNew;.   
7dd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
7de0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
7df0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  M;.    }.  }.}..
7e00: 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65  /*.** Read, dese
7e10: 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75  rialize and retu
7e20: 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  rn the structure
7e30: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54   record..**.** T
7e40: 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
7e50: 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61  .aLevel[] and ea
7e60: 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ch Fts5Structure
7e70: 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72  Level.aSeg[] arr
7e80: 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61  ay.** are over-a
7e90: 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63  llocated as desc
7ea0: 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69  ribed for functi
7eb0: 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65  on fts5Structure
7ec0: 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f  Decode() .** abo
7ed0: 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ve..**.** If an 
7ee0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
7ef0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
7f00: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
7f10: 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20   left in the.** 
7f20: 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
7f30: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
7f40: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
7f50: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
7f60: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
7f70: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
7f80: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  p..*/.static Fts
7f90: 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35  5Structure *fts5
7fa0: 53 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74  StructureRead(Ft
7fb0: 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
7fc0: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
7fd0: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
7fe0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
7ff0: 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
8000: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
8010: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
8020: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
8030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8040: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
8050: 6b 69 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  kie */.  Fts5Dat
8060: 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44 61  a *pData;..  pDa
8070: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
8080: 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54  d(p, FTS5_STRUCT
8090: 55 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66  URE_ROWID);.  if
80a0: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
80b0: 20 30 3b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 44   0;.  /* TODO: D
80c0: 6f 20 77 65 20 6e 65 65 64 20 74 68 69 73 20 69  o we need this i
80d0: 66 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78  f the leaf-index
80e0: 20 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72   is appended? Pr
80f0: 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 6d  obably... */.  m
8100: 65 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70 5b  emset(&pData->p[
8110: 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46  pData->nn], 0, F
8120: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
8130: 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73  );.  p->rc = fts
8140: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
8150: 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61  (pData->p, pData
8160: 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20  ->nn, &iCookie, 
8170: 26 70 52 65 74 29 3b 0a 20 20 69 66 28 20 70 2d  &pRet);.  if( p-
8180: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
8190: 26 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b  & pConfig->iCook
81a0: 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20  ie!=iCookie ){. 
81b0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
81c0: 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64  e3Fts5ConfigLoad
81d0: 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69  (pConfig, iCooki
81e0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  e);.  }..  fts5D
81f0: 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
8200: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
8210: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8220: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
8230: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
8240: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
8250: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8270: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8280: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
8290: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53  dex structure pS
82a0: 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66  truct. This.** f
82b0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
82c0: 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61 72  ever used as par
82d0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f  t of assert() co
82e0: 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66  nditions..*/.#if
82f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8300: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8310: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
8320: 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63  gments(Fts5Struc
8330: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
8340: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
8350: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8360: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
8370: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f  r of segments */
8380: 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
8390: 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  {.    int iLvl; 
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
83c0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
83d0: 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72  evels */.    for
83e0: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
83f0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
8400: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53  Lvl++){.      nS
8410: 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63  egment += pStruc
8420: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
8430: 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nSeg;.    }.  }.
8440: 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65  .  return nSegme
8450: 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64  nt;.}.#endif..#d
8460: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
8470: 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
8480: 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  Buf, pBlob, nBlo
8490: 62 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73 73  b) {     \.  ass
84a0: 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70  ert( (pBuf)->nSp
84b0: 61 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e 2b  ace>=((pBuf)->n+
84c0: 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20  nBlob) );       
84d0: 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79        \.  memcpy
84e0: 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75  (&(pBuf)->p[(pBu
84f0: 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e  f)->n], pBlob, n
8500: 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20 20  Blob);          
8510: 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e     \.  (pBuf)->n
8520: 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20   += nBlob;      
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  \.}..#define fts
8560: 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
8570: 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 56  dVarint(pBuf, iV
8580: 61 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20 20  al) {           
8590: 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d       \.  (pBuf)-
85a0: 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
85b0: 35 50 75 74 56 61 72 69 6e 74 28 26 28 70 42 75  5PutVarint(&(pBu
85c0: 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d  f)->p[(pBuf)->n]
85d0: 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20 20  , (iVal));  \.  
85e0: 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e  assert( (pBuf)->
85f0: 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d 3e  nSpace>=(pBuf)->
8600: 6e 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  n );            
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
8620: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c  }.../*.** Serial
8630: 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ize and store th
8640: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
8650: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
8660: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8670: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
8680: 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49  ode in the Fts5I
8690: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20  ndex object. If 
86a0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20  an.** error has 
86b0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
86c0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
86d0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
86e0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
86f0: 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74  tructureWrite(Ft
8700: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
8710: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8720: 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ct){.  if( p->rc
8730: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8740: 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75     Fts5Buffer bu
8750: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8760: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65   /* Buffer to se
8770: 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69  rialize record i
8780: 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nto */.    int i
8790: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
87a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
87b0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
87c0: 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
87d0: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20    int iCookie;  
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20  /* Cookie value 
8800: 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20  to store */..   
8810: 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
8820: 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
8830: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
8840: 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
8850: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62  );.    memset(&b
8860: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
8870: 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
8880: 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63   /* Append the c
8890: 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61  urrent configura
88a0: 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20  tion cookie */. 
88b0: 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e     iCookie = p->
88c0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
88d0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69  ;.    if( iCooki
88e0: 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20  e<0 ) iCookie = 
88f0: 30 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  0;..    if( 0==s
8900: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
8910: 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75  Size(&p->rc, &bu
8920: 66 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a 20  f, 4+9+9+9) ){. 
8930: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
8940: 50 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43 6f  Put32(buf.p, iCo
8950: 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75 66  okie);.      buf
8960: 2e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66 74  .n = 4;.      ft
8970: 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
8980: 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70  ndVarint(&buf, p
8990: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b  Struct->nLevel);
89a0: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
89b0: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
89c0: 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d  t(&buf, pStruct-
89d0: 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  >nSegment);.    
89e0: 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
89f0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75  AppendVarint(&bu
8a00: 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74 2d  f, (i64)pStruct-
8a10: 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b  >nWriteCounter);
8a20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
8a30: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
8a40: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
8a50: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  vl++){.      int
8a60: 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
8a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
8a80: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
8a90: 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a  rough segments *
8aa0: 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  /.      Fts5Stru
8ab0: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
8ac0: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
8ad0: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
8ae0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8af0: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8b00: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72  &buf, pLvl->nMer
8b10: 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  ge);.      fts5B
8b20: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
8b30: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
8b40: 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20  pLvl->nSeg);.   
8b50: 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
8b60: 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
8b70: 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f  Seg );..      fo
8b80: 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
8b90: 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl->nSeg; iSeg+
8ba0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  +){.        fts5
8bb0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8bc0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8bd0: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
8be0: 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20  ].iSegid);.     
8bf0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
8c00: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
8c10: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
8c20: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
8c30: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  st);.        fts
8c40: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
8c50: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
8c60: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
8c70: 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  g].pgnoLast);.  
8c80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8c90: 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
8ca0: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
8cb0: 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20 62  _ROWID, buf.p, b
8cc0: 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 42  uf.n);.    fts5B
8cd0: 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
8ce0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74  .  }.}..#if 0.st
8cf0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
8d00: 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e 74  bugStructure(int
8d10: 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46 74  *,Fts5Buffer*,Ft
8d20: 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a 73  s5Structure*);.s
8d30: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
8d40: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f  rintStructure(co
8d50: 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69  nst char *zCapti
8d60: 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  on, Fts5Structur
8d70: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
8d80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8d90: 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  K;.  Fts5Buffer 
8da0: 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
8db0: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75  uf, 0, sizeof(bu
8dc0: 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67  f));.  fts5Debug
8dd0: 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26  Structure(&rc, &
8de0: 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  buf, pStruct);. 
8df0: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
8e00: 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61   "%s: %s\n", zCa
8e10: 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20  ption, buf.p);. 
8e20: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
8e30: 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
8e40: 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65  e(&buf);.}.#else
8e50: 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50 72  .# define fts5Pr
8e60: 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c 79  intStructure(x,y
8e70: 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  ).#endif..static
8e80: 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74   int fts5Segment
8e90: 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74 75  Size(Fts5Structu
8ea0: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29  reSegment *pSeg)
8eb0: 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70  {.  return 1 + p
8ec0: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
8ed0: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b  pSeg->pgnoFirst;
8ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8ef0: 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78   a copy of index
8f00: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
8f10: 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d  ct. Except, prom
8f20: 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20  ote as many .** 
8f30: 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73 73  segments as poss
8f40: 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50  ible to level iP
8f50: 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f  romote. If an OO
8f60: 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  M occurs, NULL i
8f70: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
8f80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
8f90: 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
8fa0: 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e 64  oteTo(.  Fts5Ind
8fb0: 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72  ex *p,.  int iPr
8fc0: 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50  omote,.  int szP
8fd0: 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53 74  romote,.  Fts5St
8fe0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
8ff0: 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73  .){.  int il, is
9000: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
9010: 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26  eLevel *pOut = &
9020: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9030: 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66  iPromote];..  if
9040: 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d  ( pOut->nMerge==
9050: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d  0 ){.    for(il=
9060: 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70  iPromote+1; il<p
9070: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
9080: 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  il++){.      Fts
9090: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
90a0: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
90b0: 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20  ->aLevel[il];.  
90c0: 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
90d0: 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  erge ) return;. 
90e0: 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c       for(is=pLvl
90f0: 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b  ->nSeg-1; is>=0;
9100: 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20   is--){.        
9110: 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67  int sz = fts5Seg
9120: 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e  mentSize(&pLvl->
9130: 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20  aSeg[is]);.     
9140: 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d     if( sz>szProm
9150: 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ote ) return;.  
9160: 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
9170: 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26  ureExtendLevel(&
9180: 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20  p->rc, pStruct, 
9190: 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b  iPromote, 1, 1);
91a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
91b0: 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rc ) return;.   
91c0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74       memcpy(pOut
91d0: 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61  ->aSeg, &pLvl->a
91e0: 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28  Seg[is], sizeof(
91f0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9200: 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20  ment));.        
9210: 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20  pOut->nSeg++;.  
9220: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67        pLvl->nSeg
9230: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
9240: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
9250: 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61 73   new segment has
9260: 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74 74   just been writt
9270: 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c  en to level iLvl
9280: 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74   of index struct
9290: 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20  ure.** pStruct. 
92a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
92b0: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79 20  termines if any 
92c0: 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  segments should 
92d0: 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61  be promoted.** a
92e0: 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67 6d  s a result. Segm
92f0: 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65  ents are promote
9300: 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  d in two scenari
9310: 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49  os:.**.**   a) I
9320: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75  f the segment ju
9330: 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73 6d  st written is sm
9340: 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f  aller than one o
9350: 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a  r more segments.
9360: 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20 74  **      within t
9370: 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70 75  he previous popu
9380: 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74 20  lated level, it 
9390: 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74  is promoted to t
93a0: 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20  he previous.**  
93b0: 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c 65      populated le
93c0: 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  vel..**.**   b) 
93d0: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
93e0: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 6c  ust written is l
93f0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6e  arger than the n
9400: 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e  ewest segment on
9410: 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65 78  .**      the nex
9420: 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65  t populated leve
9430: 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65 67  l, then that seg
9440: 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74  ment, and any ot
9450: 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20  her adjacent.** 
9460: 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74 68       segments th
9470: 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c  at are also smal
9480: 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  ler than the one
9490: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 61   just written, a
94a0: 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d  re .**      prom
94b0: 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  oted. .**.** If 
94c0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  one or more segm
94d0: 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65  ents are promote
94e0: 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  d, the structure
94f0: 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61 74   object is updat
9500: 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74  ed.** to reflect
9510: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
9520: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
9530: 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74  urePromote(.  Ft
9540: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9560: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
9570: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ject */.  int iL
9580: 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  vl,             
9590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
95a0: 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70  ex level just up
95b0: 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35 53  dated */.  Fts5S
95c0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
95d0: 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t          /* In
95e0: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
95f0: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
9600: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9610: 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20 20    int iTst;.    
9620: 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d  int iPromote = -
9630: 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72 6f  1;.    int szPro
9640: 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  mote = 0;       
9650: 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20       /* Promote 
9660: 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73 69  anything this si
9670: 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f  ze or smaller */
9680: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
9690: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
96a0: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75     /* Segment ju
96b0: 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  st written */.  
96c0: 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20 20    int szSeg;    
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d 65  /* Size of segme
96f0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
9700: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 20  */.    int nSeg 
9710: 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
9720: 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20  l[iLvl].nSeg;.. 
9730: 20 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20 29     if( nSeg==0 )
9740: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53 65   return;.    pSe
9750: 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
9760: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b  evel[iLvl].aSeg[
9770: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9780: 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20  iLvl].nSeg-1];. 
9790: 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20     szSeg = (1 + 
97a0: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
97b0: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
97c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
97d0: 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28   for condition (
97e0: 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54  a) */.    for(iT
97f0: 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e  st=iLvl-1; iTst>
9800: 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  =0 && pStruct->a
9810: 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67  Level[iTst].nSeg
9820: 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20  ==0; iTst--);.  
9830: 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b    if( iTst>=0 ){
9840: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9850: 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20      int szMax = 
9860: 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  0;.      Fts5Str
9870: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73  uctureLevel *pTs
9880: 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
9890: 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20  evel[iTst];.    
98a0: 20 20 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e    assert( pTst->
98b0: 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20  nMerge==0 );.   
98c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
98d0: 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  st->nSeg; i++){.
98e0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d          int sz =
98f0: 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70   pTst->aSeg[i].p
9900: 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e  gnoLast - pTst->
9910: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73  aSeg[i].pgnoFirs
9920: 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t + 1;.        i
9930: 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a  f( sz>szMax ) sz
9940: 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  Max = sz;.      
9950: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61  }.      if( szMa
9960: 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20  x>=szSeg ){.    
9970: 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e      /* Condition
9980: 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50 72   (a) is true. Pr
9990: 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74  omote the newest
99a0: 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65   segment on leve
99b0: 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c  l .        ** iL
99c0: 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74  vl to level iTst
99d0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50  .  */.        iP
99e0: 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20  romote = iTst;. 
99f0: 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65         szPromote
9a00: 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20   = szMax;.      
9a10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9a20: 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29  If condition (a)
9a30: 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73   is not met, ass
9a40: 75 6d 65 20 28 62 29 20 69 73 20 74 72 75 65 2e  ume (b) is true.
9a50: 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74   StructurePromot
9a60: 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20  eTo().    ** is 
9a70: 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73  a no-op if it is
9a80: 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66   not.  */.    if
9a90: 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a  ( iPromote<0 ){.
9aa0: 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d        iPromote =
9ab0: 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50   iLvl;.      szP
9ac0: 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a  romote = szSeg;.
9ad0: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
9ae0: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
9af0: 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a  (p, iPromote, sz
9b00: 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74  Promote, pStruct
9b10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
9b20: 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
9b30: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
9b40: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
9b50: 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f 66  t. If the end of
9b60: 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74   the .** doclist
9b70: 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 72  -index page is r
9b80: 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20 6e  eached, return n
9b90: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
9ba0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
9bb0: 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69 64  LvlNext(Fts5Dlid
9bc0: 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46  xLvl *pLvl){.  F
9bd0: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d  ts5Data *pData =
9be0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20   pLvl->pData;.. 
9bf0: 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d   if( pLvl->iOff=
9c00: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
9c10: 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20  ( pLvl->bEof==0 
9c20: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  );.    pLvl->iOf
9c30: 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d  f = 1;.    pLvl-
9c40: 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  >iOff += fts5Get
9c50: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 2d  Varint32(&pData-
9c60: 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65  >p[1], pLvl->iLe
9c70: 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76  afPgno);.    pLv
9c80: 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  l->iOff += fts5G
9c90: 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
9ca0: 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20  >p[pLvl->iOff], 
9cb0: 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f  (u64*)&pLvl->iRo
9cc0: 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  wid);.    pLvl->
9cd0: 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c  iFirstOff = pLvl
9ce0: 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  ->iOff;.  }else{
9cf0: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
9d00: 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c     for(iOff=pLvl
9d10: 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61  ->iOff; iOff<pDa
9d20: 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b  ta->nn; iOff++){
9d30: 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
9d40: 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61  ->p[iOff] ) brea
9d50: 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  k; .    }..    i
9d60: 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e  f( iOff<pData->n
9d70: 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  n ){.      i64 i
9d80: 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  Val;.      pLvl-
9d90: 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69  >iLeafPgno += (i
9da0: 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off - pLvl->iOff
9db0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66  ) + 1;.      iOf
9dc0: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
9dd0: 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66  nt(&pData->p[iOf
9de0: 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29  f], (u64*)&iVal)
9df0: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 52  ;.      pLvl->iR
9e00: 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
9e10: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
9e20: 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65   iOff;.    }else
9e30: 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45  {.      pLvl->bE
9e40: 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
9e50: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c  }..  return pLvl
9e60: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->bEof;.}../*.**
9e70: 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
9e80: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
9e90: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
9ea0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9eb0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
9ec0: 78 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70  xtR(Fts5Index *p
9ed0: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
9ee0: 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c  *pIter, int iLvl
9ef0: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76  ){.  Fts5DlidxLv
9f00: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
9f10: 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20  ->aLvl[iLvl];.. 
9f20: 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49   assert( iLvl<pI
9f30: 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69  ter->nLvl );.  i
9f40: 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  f( fts5DlidxLvlN
9f50: 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20  ext(pLvl) ){.   
9f60: 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20   if( (iLvl+1) < 
9f70: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20  pIter->nLvl ){. 
9f80: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
9f90: 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72  erNextR(p, pIter
9fa0: 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20  , iLvl+1);.     
9fb0: 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f   if( pLvl[1].bEo
9fc0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
9fd0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
9fe0: 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20  pLvl->pData);.  
9ff0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76        memset(pLv
a000: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  l, 0, sizeof(Fts
a010: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
a020: 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
a030: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
a040: 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  p, .            
a050: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
a060: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
a070: 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c  iLvl, pLvl[1].iL
a080: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  eafPgno).       
a090: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
a0a0: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66 74  pLvl->pData ) ft
a0b0: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70  s5DlidxLvlNext(p
a0c0: 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Lvl);.      }.  
a0d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a0e0: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
a0f0: 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20  .bEof;.}.static 
a100: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
a110: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20  rNext(Fts5Index 
a120: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
a130: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
a140: 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65  urn fts5DlidxIte
a150: 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c  rNextR(p, pIter,
a160: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
a170: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
a180: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
a190: 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20  rgument has the 
a1a0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
a1b0: 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f   set.** as follo
a1c0: 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ws. This functio
a1d0: 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72 65  n sets up the re
a1e0: 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  st of the iterat
a1f0: 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  or so that it.**
a200: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
a210: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
a220: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  e doclist-index.
a230: 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 0a  .**.**   pData:.
a240: 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20 74  **     pointer t
a250: 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  o doclist-index 
a260: 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57  record, .**.** W
a270: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a280: 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65  n is called pIte
a290: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20  r->iLeafPgno is 
a2a0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
a2b0: 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69  the.** doclist i
a2c0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
a2d0: 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75  h (the one featu
a2e0: 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a  ring the term)..
a2f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
a300: 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74  s5DlidxIterFirst
a310: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
a320: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
a330: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
a340: 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
a350: 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c 76  .    fts5DlidxLv
a360: 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61 4c  lNext(&pIter->aL
a370: 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  vl[i]);.  }.  re
a380: 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c  turn pIter->aLvl
a390: 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74  [0].bEof;.}...st
a3a0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
a3b0: 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  dxIterEof(Fts5In
a3c0: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
a3d0: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
a3e0: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d 53   return p->rc!=S
a3f0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65  QLITE_OK || pIte
a400: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b  r->aLvl[0].bEof;
a410: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
a420: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73  fts5DlidxIterLas
a430: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
a440: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
a450: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Iter){.  int i;.
a460: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61  .  /* Advance ea
a470: 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65 20  ch level to the 
a480: 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  last entry on th
a490: 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a 20  e last page */. 
a4a0: 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e 4c   for(i=pIter->nL
a4b0: 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  vl-1; p->rc==SQL
a4c0: 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b 20  ITE_OK && i>=0; 
a4d0: 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  i--){.    Fts5Dl
a4e0: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
a4f0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  pIter->aLvl[i];.
a500: 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44      while( fts5D
a510: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c  lidxLvlNext(pLvl
a520: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c  )==0 );.    pLvl
a530: 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 20  ->bEof = 0;..   
a540: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
a550: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
a560: 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d  pChild = &pLvl[-
a570: 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61  1];.      fts5Da
a580: 74 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c 64  taRelease(pChild
a590: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
a5a0: 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20 30  memset(pChild, 0
a5b0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
a5c0: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70  dxLvl));.      p
a5d0: 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20 66  Child->pData = f
a5e0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
a5f0: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
a600: 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72  LIDX_ROWID(pIter
a610: 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20 70  ->iSegid, i-1, p
a620: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a  Lvl->iLeafPgno).
a630: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
a640: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65   }.}../*.** Move
a650: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
a660: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
a670: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
a680: 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 2e   previous entry.
a690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a6a0: 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28  ts5DlidxLvlPrev(
a6b0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
a6c0: 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20  vl){.  int iOff 
a6d0: 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20  = pLvl->iOff;.. 
a6e0: 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62   assert( pLvl->b
a6f0: 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Eof==0 );.  if( 
a700: 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72  iOff<=pLvl->iFir
a710: 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c 76  stOff ){.    pLv
a720: 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d  l->bEof = 1;.  }
a730: 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20  else{.    u8 *a 
a740: 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70  = pLvl->pData->p
a750: 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a  ;.    i64 iVal;.
a760: 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a      int iLimit;.
a770: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
a780: 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a  int nZero = 0;..
a790: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79      /* Currently
a7a0: 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20   iOff points to 
a7b0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
a7c0: 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73  f a varint. This
a7d0: 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64   block .    ** d
a7e0: 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75  ecrements iOff u
a7f0: 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
a800: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
a810: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
a820: 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e   .    ** varint.
a830: 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74   Taking care not
a840: 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d   to read any mem
a850: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68  ory locations th
a860: 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20  at occur.    ** 
a870: 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65  before the buffe
a880: 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f  r in memory.  */
a890: 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69  .    iLimit = (i
a8a0: 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a  Off>9 ? iOff-9 :
a8b0: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66   0);.    for(iOf
a8c0: 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74  f--; iOff>iLimit
a8d0: 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20  ; iOff--){.     
a8e0: 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20   if( (a[iOff-1] 
a8f0: 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65  & 0x80)==0 ) bre
a900: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  ak;.    }..    f
a910: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
a920: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56  iOff], (u64*)&iV
a930: 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  al);.    pLvl->i
a940: 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20  Rowid -= iVal;. 
a950: 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67     pLvl->iLeafPg
a960: 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b  no--;..    /* Sk
a970: 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73  ip backwards pas
a980: 74 20 61 6e 79 20 30 78 30 30 20 76 61 72 69 6e  t any 0x00 varin
a990: 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ts. */.    for(i
a9a0: 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70 4c  i=iOff-1; ii>=pL
a9b0: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26  vl->iFirstOff &&
a9c0: 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69 69   a[ii]==0x00; ii
a9d0: 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f  --){.      nZero
a9e0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
a9f0: 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72  ( ii>=pLvl->iFir
aa00: 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d 20  stOff && (a[ii] 
aa10: 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20 20  & 0x80) ){.     
aa20: 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d 6d   /* The byte imm
aa30: 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65 20  ediately before 
aa40: 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 62 79  the last 0x00 by
aa50: 74 65 20 68 61 73 20 74 68 65 20 30 78 38 30 20  te has the 0x80 
aa60: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  bit.      ** set
aa70: 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30 78  . So the last 0x
aa80: 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61 72  00 is only a var
aa90: 69 6e 74 20 30 20 69 66 20 74 68 65 72 65 20 61  int 0 if there a
aaa0: 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a 20  re 8 more 0x80. 
aab0: 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62 65       ** bytes be
aac0: 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20  fore a[ii]. */. 
aad0: 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20 3d       int bZero =
aae0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
aaf0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73 74   /* True if last
ab00: 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f 0a   0x00 counts */.
ab10: 20 20 20 20 20 20 69 66 28 20 28 69 69 2d 38 29        if( (ii-8)
ab20: 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  >=pLvl->iFirstOf
ab30: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  f ){.        int
ab40: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
ab50: 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61 5b  j=1; j<=8 && (a[
ab60: 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20 6a  ii-j] & 0x80); j
ab70: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a 65  ++);.        bZe
ab80: 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20 20  ro = (j>8);.    
ab90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 5a    }.      if( bZ
aba0: 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d  ero==0 ) nZero--
abb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c  ;.    }.    pLvl
abc0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20 6e  ->iLeafPgno -= n
abd0: 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  Zero;.    pLvl->
abe0: 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e 5a  iOff = iOff - nZ
abf0: 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ero;.  }..  retu
ac00: 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d  rn pLvl->bEof;.}
ac10: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
ac20: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28  5DlidxIterPrevR(
ac30: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ac40: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
ac50: 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20  er, int iLvl){. 
ac60: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
ac70: 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
ac80: 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73  vl[iLvl];..  ass
ac90: 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d  ert( iLvl<pIter-
aca0: 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66  >nLvl );.  if( f
acb0: 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28  ts5DlidxLvlPrev(
acc0: 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  pLvl) ){.    if(
acd0: 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65   (iLvl+1) < pIte
ace0: 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20  r->nLvl ){.     
acf0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
ad00: 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  evR(p, pIter, iL
ad10: 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  vl+1);.      if(
ad20: 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30   pLvl[1].bEof==0
ad30: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
ad40: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c  DataRelease(pLvl
ad50: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
ad60: 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30    memset(pLvl, 0
ad70: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
ad80: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20  dxLvl));.       
ad90: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
ada0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35              FTS5
adc0: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74  _DLIDX_ROWID(pIt
add0: 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c  er->iSegid, iLvl
ade0: 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50  , pLvl[1].iLeafP
adf0: 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
ae00: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
ae10: 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ->pData ){.     
ae20: 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35       while( fts5
ae30: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
ae40: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  l)==0 );.       
ae50: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
ae60: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
ae70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
ae80: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
ae90: 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a  aLvl[0].bEof;.}.
aea0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
aeb0: 6c 69 64 78 49 74 65 72 50 72 65 76 28 46 74 73  lidxIterPrev(Fts
aec0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
aed0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
aee0: 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44  {.  return fts5D
aef0: 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c  lidxIterPrevR(p,
af00: 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f   pIter, 0);.}../
af10: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c  *.** Free a docl
af20: 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74  ist-index iterat
af30: 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61  or object alloca
af40: 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64 78  ted by fts5Dlidx
af50: 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  IterInit()..*/.s
af60: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
af70: 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74 73  lidxIterFree(Fts
af80: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
af90: 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20  r){.  if( pIter 
afa0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
afb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
afc0: 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a  er->nLvl; i++){.
afd0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
afe0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c 76  lease(pIter->aLv
aff0: 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20 20  l[i].pData);.   
b000: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
b010: 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ree(pIter);.  }.
b020: 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44 6c  }..static Fts5Dl
b030: 69 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c 69  idxIter *fts5Dli
b040: 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  dxIterInit(.  Ft
b050: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b070: 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74 6f   Fts5 Backend to
b080: 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
b090: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
b0c0: 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a 2f   ORDER BY ASC */
b0d0: 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20  .  int iSegid,  
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64     /* Segment id
b100: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
b110: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
b120: 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61        /* Leaf pa
b130: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61  ge number to loa
b140: 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29  d dlidx for */.)
b150: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
b160: 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20  r *pIter = 0;.  
b170: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f  int i;.  int bDo
b180: 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  ne = 0;..  for(i
b190: 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
b1a0: 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30  E_OK && bDone==0
b1b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
b1c0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
b1d0: 74 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b 20  ts5DlidxIter) + 
b1e0: 69 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 44  i * sizeof(Fts5D
b1f0: 6c 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74  lidxLvl);.    Ft
b200: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e 65  s5DlidxIter *pNe
b210: 77 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28  w;..    pNew = (
b220: 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29 73  Fts5DlidxIter*)s
b230: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
b240: 49 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Iter, nByte);.  
b250: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
b260: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
b270: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
b280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
b290: 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  4 iRowid = FTS5_
b2a0: 44 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65 67  DLIDX_ROWID(iSeg
b2b0: 69 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29 3b  id, i, iLeafPg);
b2c0: 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
b2d0: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65  Lvl *pLvl = &pNe
b2e0: 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20  w->aLvl[i];.    
b2f0: 20 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a    pIter = pNew;.
b300: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76        memset(pLv
b310: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  l, 0, sizeof(Fts
b320: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
b330: 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d     pLvl->pData =
b340: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
b350: 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
b360: 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20  if( pLvl->pData 
b370: 26 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d  && (pLvl->pData-
b380: 3e 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29 3d  >p[0] & 0x0001)=
b390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44  =0 ){.        bD
b3a0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
b3b0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c  .      pIter->nL
b3c0: 76 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a  vl = i+1;.    }.
b3d0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
b3e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b3f0: 20 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69 64     pIter->iSegid
b400: 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 69   = iSegid;.    i
b410: 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20  f( bRev==0 ){.  
b420: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
b430: 72 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20  rFirst(pIter);. 
b440: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b450: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73  fts5DlidxIterLas
b460: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
b470: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d   }.  }..  if( p-
b480: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
b490: 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 49  {.    fts5DlidxI
b4a0: 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a  terFree(pIter);.
b4b0: 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20      pIter = 0;. 
b4c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74   }..  return pIt
b4d0: 65 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36  er;.}..static i6
b4e0: 34 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  4 fts5DlidxIterR
b4f0: 6f 77 69 64 28 46 74 73 35 44 6c 69 64 78 49 74  owid(Fts5DlidxIt
b500: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
b510: 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c  turn pIter->aLvl
b520: 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74  [0].iRowid;.}.st
b530: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b540: 64 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35 44  dxIterPgno(Fts5D
b550: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b560: 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  {.  return pIter
b570: 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50  ->aLvl[0].iLeafP
b580: 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  gno;.}../*.** Lo
b590: 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66  ad the next leaf
b5a0: 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73   page into the s
b5b0: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e  egment iterator.
b5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b5d0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
b5e0: 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  age(.  Fts5Index
b5f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b600: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
b610: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
b620: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
b630: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
b640: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
b650: 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78  o advance to nex
b660: 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46  t page */.){.  F
b670: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a  ts5Data *pLeaf;.
b680: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
b690: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
b6a0: 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74  Iter->pSeg;.  ft
b6b0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
b6c0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
b6d0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b  Iter->iLeafPgno+
b6e0: 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  +;.  if( pIter->
b6f0: 70 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20 20  pNextLeaf ){.   
b700: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
b710: 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
b720: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65  ;.    pIter->pNe
b730: 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65  xtLeaf = 0;.  }e
b740: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 69  lse if( pIter->i
b750: 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e  LeafPgno<=pSeg->
b760: 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20  pgnoLast ){.    
b770: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66  pIter->pLeaf = f
b780: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
b790: 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47          FTS5_SEG
b7a0: 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
b7b0: 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e  >iSegid, pIter->
b7c0: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29  iLeafPgno).    )
b7d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b7e0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
b7f0: 0a 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20 70  .  }.  pLeaf = p
b800: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20  Iter->pLeaf;..  
b810: 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
b820: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
b830: 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  f = pLeaf->szLea
b840: 66 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c  f;.    if( fts5L
b850: 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c  eafIsTermless(pL
b860: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 70 49  eaf) ){.      pI
b870: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
b880: 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31  st = pLeaf->nn+1
b890: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b8a0: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
b8b0: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
b8c0: 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
b8d0: 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66  [pIter->iPgidxOf
b8e0: 66 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49  f],.          pI
b8f0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
b900: 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
b910: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
b920: 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73  rgument p points
b930: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
b940: 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e 74  taining a varint
b950: 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74   to be interpret
b960: 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74  ed as a.** posit
b970: 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66 69  ion list size fi
b980: 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61  eld. Read the va
b990: 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  rint and return 
b9a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
b9b0: 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66  tes.** read. Bef
b9c0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73  ore returning, s
b9d0: 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20  et *pnSz to the 
b9e0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
b9f0: 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a  in the position.
ba00: 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62  ** list, and *pb
ba10: 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20 74  Del to true if t
ba20: 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69  he delete flag i
ba30: 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65 20  s set, or false 
ba40: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
ba50: 61 74 69 63 20 69 6e 74 20 66 74 73 35 47 65 74  atic int fts5Get
ba60: 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73  PoslistSize(cons
ba70: 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  t u8 *p, int *pn
ba80: 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b  Sz, int *pbDel){
ba90: 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e  .  int nSz;.  in
baa0: 74 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35 46  t n = 0;.  fts5F
bab0: 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
bac0: 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73  , n, nSz);.  ass
bad0: 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29  ert_nc( nSz>=0 )
bae0: 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f  ;.  *pnSz = nSz/
baf0: 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53  2;.  *pbDel = nS
bb00: 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65  z & 0x0001;.  re
bb10: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
bb20: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
bb30: 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74  afOffset current
bb40: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
bb50: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
bb60: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
bb70: 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65  t size field. Re
bb80: 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
bb90: 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74  the field and st
bba0: 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65  ore it.** in the
bbb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
bbc0: 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74  bles:.**.**   Ft
bbd0: 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a  s5SegIter.nPos.*
bbe0: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
bbf0: 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65  bDel.**.** Leave
bc00: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
bc10: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e  afOffset pointin
bc20: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  g to the first b
bc30: 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  yte of the .** p
bc40: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  osition list con
bc50: 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a  tent (if any)..*
bc60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
bc70: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
bc80: 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
bc90: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
bca0: 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er){.  if( p->rc
bcb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bcc0: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49     int iOff = pI
bcd0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
bce0: 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20  ;  /* Offset to 
bcf0: 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 41  read at */.    A
bd00: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
bd10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
bd20: 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69     if( p->pConfi
bd30: 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
bd40: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
bd50: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65        pIter->bDe
bd60: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74  l = 0;.      pIt
bd70: 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20  er->nPos = 1;.  
bd80: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 49 74      if( iOff<pIt
bd90: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
bda0: 66 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61  f && pIter->pLea
bdb0: 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b  f->p[iOff]==0 ){
bdc0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
bdd0: 62 44 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  bDel = 1;.      
bde0: 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20    iOff++;.      
bdf0: 20 20 69 66 28 20 69 4f 66 66 3c 70 49 74 65 72    if( iOff<pIter
be00: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
be10: 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  && pIter->pLeaf-
be20: 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20  >p[iOff]==0 ){. 
be30: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
be40: 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  nPos = 1;.      
be50: 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20      iOff++;.    
be60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
be70: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
be80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
be90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
bea0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a  e{.      int nSz
beb0: 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74  ;.      fts5Fast
bec0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  GetVarint32(pIte
bed0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 69 4f 66  r->pLeaf->p, iOf
bee0: 66 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70  f, nSz);.      p
bef0: 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53  Iter->bDel = (nS
bf00: 7a 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 20  z & 0x0001);.   
bf10: 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d     pIter->nPos =
bf20: 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61   nSz>>1;.      a
bf30: 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d  ssert_nc( pIter-
bf40: 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20  >nPos>=0 );.    
bf50: 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  }.    pIter->iLe
bf60: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
bf70: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
bf80: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
bf90: 6f 61 64 52 6f 77 69 64 28 46 74 73 35 49 6e 64  oadRowid(Fts5Ind
bfa0: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
bfb0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38  er *pIter){.  u8
bfc0: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
bfd0: 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a  af->p;        /*
bfe0: 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20   Buffer to read 
bff0: 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  data from */.  i
c000: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
c010: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20  >iLeafOffset;.. 
c020: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
c030: 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  K(pIter->pLeaf);
c040: 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74  .  if( iOff>=pIt
c050: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
c060: 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67  f ){.    fts5Seg
c070: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
c080: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
c090: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
c0a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
c0b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
c0c0: 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
c0d0: 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  RUPT;.      retu
c0e0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f  rn;.    }.    iO
c0f0: 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20  ff = 4;.    a = 
c100: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
c110: 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73  .  }.  iOff += s
c120: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
c130: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
c140: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
c150: 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  id);.  pIter->iL
c160: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
c170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53  ;.}../*.** Fts5S
c180: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c190: 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  et currently poi
c1a0: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
c1b0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a   byte of the .**
c1c0: 20 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c 64   "nSuffix" field
c1d0: 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e 63   of a term. Func
c1e0: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 6e  tion parameter n
c1f0: 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74 68  Keep contains th
c200: 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68  e value.** of th
c210: 65 20 22 6e 50 72 65 66 69 78 22 20 66 69 65 6c  e "nPrefix" fiel
c220: 64 20 28 69 66 20 74 68 65 72 65 20 77 61 73 20  d (if there was 
c230: 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73 73  one - it is pass
c240: 65 64 20 30 20 69 66 20 74 68 69 73 20 69 73 0a  ed 0 if this is.
c250: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ** the first ter
c260: 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  m in the segment
c270: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
c280: 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73  nction populates
c290: 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65  :.**.**   Fts5Se
c2a0: 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20  gIter.term.**   
c2b0: 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69  Fts5SegIter.rowi
c2c0: 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  d.**.** accordin
c2d0: 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20 28  gly and leaves (
c2e0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
c2f0: 66 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f 20  fOffset) set to 
c300: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a  the content of.*
c310: 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f 73 69  * the first posi
c320: 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70  tion list. The p
c330: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c  osition list bel
c340: 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65  onging to docume
c350: 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67 49  nt .** (Fts5SegI
c360: 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a  ter.iRowid)..*/.
c370: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c380: 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
c390: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
c3a0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
c3b0: 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20  , int nKeep){.  
c3c0: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
c3d0: 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20  Leaf->p;        
c3e0: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61  /* Buffer to rea
c3f0: 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20  d data from */. 
c400: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
c410: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  r->iLeafOffset; 
c420: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65   /* Offset to re
c430: 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ad at */.  int n
c440: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
c450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
c460: 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 20  tes of new data 
c470: 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74  */..  iOff += ft
c480: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
c490: 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20  [iOff], nNew);. 
c4a0: 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d   pIter->term.n =
c4b0: 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42 75   nKeep;.  fts5Bu
c4c0: 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
c4d0: 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
c4e0: 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f  erm, nNew, &a[iO
c4f0: 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20  ff]);.  iOff += 
c500: 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69  nNew;.  pIter->i
c510: 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d  TermLeafOffset =
c520: 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e   iOff;.  pIter->
c530: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20  iTermLeafPgno = 
c540: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
c550: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
c560: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
c570: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50 67    if( pIter->iPg
c580: 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  idxOff>=pIter->p
c590: 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20  Leaf->nn ){.    
c5a0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
c5b0: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
c5c0: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c  eaf->nn+1;.  }el
c5d0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74  se{.    int nExt
c5e0: 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ra;.    pIter->i
c5f0: 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
c600: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 70  GetVarint32(&a[p
c610: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d  Iter->iPgidxOff]
c620: 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 70  , nExtra);.    p
c630: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c640: 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 20  ist += nExtra;. 
c650: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
c660: 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49  rLoadRowid(p, pI
c670: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ter);.}../*.** I
c680: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74  nitialize the it
c690: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49  erator object pI
c6a0: 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  ter to iterate t
c6b0: 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74 72 69  hrough the entri
c6c0: 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74  es in.** segment
c6d0: 20 70 53 65 67 2e 20 54 68 65 20 69 74 65 72 61   pSeg. The itera
c6e0: 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
c6f0: 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
c700: 74 20 65 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a  t entry when .**
c710: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
c720: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  eturns..**.** If
c730: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c740: 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69  , Fts5Index.rc i
c750: 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72  s set to an appr
c760: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
c770: 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  de. If .** an er
c780: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
c790: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
c7a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
c7b0: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
c7c0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
c7d0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
c7e0: 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
c7f0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
c800: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69          /* FTS i
c810: 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
c820: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
c830: 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20  gment *pSeg,    
c840: 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
c850: 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  of segment */.  
c860: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
c870: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
c880: 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
c890: 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  ulate */.){.  if
c8a0: 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ( pSeg->pgnoFirs
c8b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  t==0 ){.    /* T
c8c0: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 74  his happens if t
c8d0: 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 62 65  he segment is be
c8e0: 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e 20 69  ing used as an i
c8f0: 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63 72 65  nput to an incre
c900: 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65  mental.    ** me
c910: 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61 74 61  rge and all data
c920: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
c930: 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53 65 65  n "trimmed". See
c940: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a   function.    **
c950: 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
c960: 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  s() for details.
c970: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65   In this case le
c980: 61 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ave the iterator
c990: 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54   empty..    ** T
c9a0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73  he caller will s
c9b0: 65 65 20 74 68 65 20 28 70 49 74 65 72 2d 3e 70  ee the (pIter->p
c9c0: 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61 73 73  Leaf==0) and ass
c9d0: 75 6d 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ume the iterator
c9e0: 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f   is.    ** at EO
c9f0: 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20  F already. */.  
ca00: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
ca10: 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  >pLeaf==0 );.   
ca20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
ca30: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
ca40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73  E_OK ){.    mems
ca50: 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
ca60: 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
ca70: 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
ca80: 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d  pSeg;.    pIter-
ca90: 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65  >iLeafPgno = pSe
caa0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a  g->pgnoFirst-1;.
cab0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
cac0: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
cad0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
cae0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
caf0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  {.    pIter->iLe
cb00: 61 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20  afOffset = 4;.  
cb10: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74    assert_nc( pIt
cb20: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20  er->pLeaf->nn>4 
cb30: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  );.    assert( f
cb40: 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
cb50: 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  Off(pIter->pLeaf
cb60: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49 74 65  )==4 );.    pIte
cb70: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70  r->iPgidxOff = p
cb80: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
cb90: 65 61 66 2b 31 3b 0a 20 20 20 20 66 74 73 35 53  eaf+1;.    fts5S
cba0: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
cbb0: 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20  , pIter, 0);.   
cbc0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
cbd0: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
cbe0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
cbf0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
cc00: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 6f  ly ever called o
cc10: 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72 65 61  n iterators crea
cc20: 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a  ted by calls to.
cc30: 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75 65 72  ** Fts5IndexQuer
cc40: 79 28 29 20 77 69 74 68 20 74 68 65 20 46 54 53  y() with the FTS
cc50: 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
cc60: 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  C flag set..**.*
cc70: 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  * The iterator i
cc80: 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20  s in an unusual 
cc90: 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
cca0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
ccb0: 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73 35 53  ed: the.** Fts5S
ccc0: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
ccd0: 65 74 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  et variable is s
cce0: 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
ccf0: 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f 66   of the start of
cd00: 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  .** the position
cd10: 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
cd20: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
cd30: 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e  elevant rowid on
cd40: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74   the page..** Ft
cd50: 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 20  s5SegIter.rowid 
cd60: 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50 6f 73  is set, but nPos
cd70: 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20 6e 6f   and bDel are no
cd80: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
cd90: 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73 20  nction advances 
cda0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20  the iterator so 
cdb0: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
cdc0: 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72  o the last .** r
cdd0: 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e  elevant rowid on
cde0: 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c 20 69   the page and, i
cdf0: 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69  f necessary, ini
ce00: 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a  tializes the .**
ce10: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
ce20: 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74  and iRowidOffset
ce30: 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74 20 74   variables. At t
ce40: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 69 74  his point the it
ce50: 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20  erator.** is in 
ce60: 69 74 73 20 72 65 67 75 6c 61 72 20 73 74 61 74  its regular stat
ce70: 65 20 2d 20 46 74 73 35 53 65 67 49 74 65 72 2e  e - Fts5SegIter.
ce80: 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e  iLeafOffset poin
ce90: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  ts to the first.
cea0: 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65 20 70  ** byte of the p
ceb0: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  osition list con
cec0: 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  tent associated 
ced0: 77 69 74 68 20 73 61 69 64 20 72 6f 77 69 64 2e  with said rowid.
cee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cef0: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
cf00: 73 65 49 6e 69 74 50 61 67 65 28 46 74 73 35 49  seInitPage(Fts5I
cf10: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
cf20: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
cf30: 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d  int eDetail = p-
cf40: 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
cf50: 6c 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74  l;.  int n = pIt
cf60: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
cf70: 66 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 74  f;.  int i = pIt
cf80: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
cf90: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
cfa0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e  ->pLeaf->p;.  in
cfb0: 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  t iRowidOffset =
cfc0: 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 70 49 74   0;..  if( n>pIt
cfd0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
cfe0: 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 49 74  t ){.    n = pIt
cff0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
d000: 74 3b 0a 20 20 7d 0a 0a 20 20 41 53 53 45 52 54  t;.  }..  ASSERT
d010: 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72  _SZLEAF_OK(pIter
d020: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77 68 69 6c  ->pLeaf);.  whil
d030: 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20  e( 1 ){.    i64 
d040: 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20  iDelta = 0;.    
d050: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e  int nPos;.    in
d060: 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 69  t bDummy;..    i
d070: 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
d080: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
d090: 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f        /* todo */
d0a0: 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ..    }else{.   
d0b0: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50     i += fts5GetP
d0c0: 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d  oslistSize(&a[i]
d0d0: 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
d0e0: 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50  );.      i += nP
d0f0: 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  os;.    }.    if
d100: 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a  ( i>=n ) break;.
d110: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
d120: 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75  Varint(&a[i], (u
d130: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
d140: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
d150: 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
d160: 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  /* If necessary,
d170: 20 67 72 6f 77 20 74 68 65 20 70 49 74 65 72 2d   grow the pIter-
d180: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20  >aRowidOffset[] 
d190: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66  array. */.    if
d1a0: 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d  ( iRowidOffset>=
d1b0: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
d1c0: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  set ){.      int
d1d0: 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e   nNew = pIter->n
d1e0: 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b  RowidOffset + 8;
d1f0: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  .      int *aNew
d200: 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33   = (int*)sqlite3
d210: 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e  _realloc(pIter->
d220: 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e  aRowidOffset, nN
d230: 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  ew*sizeof(int));
d240: 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d  .      if( aNew=
d250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
d260: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
d270: 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  EM;.        brea
d280: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d290: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
d2a0: 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20  fset = aNew;.   
d2b0: 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64     pIter->nRowid
d2c0: 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  Offset = nNew;. 
d2d0: 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d     }..    pIter-
d2e0: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52  >aRowidOffset[iR
d2f0: 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20  owidOffset++] = 
d300: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d310: 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  et;.    pIter->i
d320: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a  LeafOffset = i;.
d330: 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f    }.  pIter->iRo
d340: 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  widOffset = iRow
d350: 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35  idOffset;.  fts5
d360: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
d370: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
d380: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
d390: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
d3a0: 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73  verseNewPage(Fts
d3b0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
d3c0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
d3d0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
d3e0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
d3f0: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
d400: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
d410: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
d420: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
d430: 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  ;..  fts5DataRel
d440: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
d450: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65  f);.  pIter->pLe
d460: 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  af = 0;.  while(
d470: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d480: 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61  K && pIter->iLea
d490: 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65  fPgno>pIter->iTe
d4a0: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
d4b0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
d4c0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
d4d0: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e  afPgno--;.    pN
d4e0: 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
d4f0: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
d500: 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20  T_ROWID(.       
d510: 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e     pIter->pSeg->
d520: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
d530: 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b  LeafPgno.    ));
d540: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
d550: 0a 20 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c  .      /* iTermL
d560: 65 61 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65  eafOffset may be
d570: 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66   equal to szLeaf
d580: 20 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   if the term is 
d590: 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
d5a0: 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70  * thing on the p
d5b0: 61 67 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66  age - i.e. the f
d5c0: 69 72 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e  irst rowid is on
d5d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
d5e0: 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  age..      ** In
d5f0: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
d600: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
d610: 2c 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  , this iterator 
d620: 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20  is at EOF. */.  
d630: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
d640: 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
d650: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29  >iTermLeafPgno )
d660: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d670: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
d680: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
d690: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
d6a0: 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a  fOffset<pNew->sz
d6b0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
d6c0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
d6d0: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
d6e0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d6f0: 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65  set = pIter->iTe
d700: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  rmLeafOffset;.  
d710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d720: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
d730: 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
d740: 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
d750: 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
d760: 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20  idOff(pNew);.   
d770: 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
d780: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ff ){.          
d790: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
d7a0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
d7b0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d7c0: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  t = iRowidOff;. 
d7d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d7e0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
d7f0: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
d800: 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74      u8 *a = &pIt
d810: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74  er->pLeaf->p[pIt
d820: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  er->iLeafOffset]
d830: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
d840: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20  >iLeafOffset += 
d850: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c  fts5GetVarint(a,
d860: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
d870: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
d880: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
d890: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
d8a0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
d8b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d8c0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
d8d0: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
d8e0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
d8f0: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
d900: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66  eaf->nn+1;.    f
d910: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
d920: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
d930: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
d940: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
d950: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
d960: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
d970: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
d980: 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20  ently.** points 
d990: 74 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b  to a delete mark
d9a0: 65 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72  er. A delete mar
d9b0: 6b 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20  ker is an entry 
d9c0: 77 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a  with a 0 byte.**
d9d0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a   position-list..
d9e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
d9f0: 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70  s5MultiIterIsEmp
da00: 74 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ty(Fts5Index *p,
da10: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
da20: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65  pIter){.  Fts5Se
da30: 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
da40: 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
da50: 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
da60: 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  st];.  return (p
da70: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
da80: 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26  && pSeg->pLeaf &
da90: 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29  & pSeg->nPos==0)
daa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
dab0: 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  ce iterator pIte
dac0: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
dad0: 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  try. .**.** If a
dae0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
daf0: 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
db00: 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
db10: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
db20: 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20  . It .** is not 
db30: 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
db40: 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61  ror if the itera
db50: 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e  tor reaches EOF.
db60: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
db70: 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
db80: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
db90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
dba0: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
dbb0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
dbc0: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
dbd0: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
dbe0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
dbf0: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
dc00: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
dc10: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
dc20: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
dc30: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
dc40: 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
dc50: 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20   *pbNewTerm     
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc70: 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77  OUT: Set for new
dc80: 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73   term */.){.  as
dc90: 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d  sert( pbNewTerm=
dca0: 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d  =0 || *pbNewTerm
dcb0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
dcc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dcd0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
dce0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
dcf0: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a  ITER_REVERSE ){.
dd00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
dd10: 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d  ter->pNextLeaf==
dd20: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
dd30: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
dd40: 65 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  et>0 ){.        
dd50: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
dd60: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20  Leaf->p;.       
dd70: 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
dd80: 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
dd90: 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b       int bDummy;
dda0: 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65  .        i64 iDe
ddb0: 6c 74 61 3b 0a 0a 20 20 20 20 20 20 20 20 70 49  lta;..        pI
ddc0: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
ddd0: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 49 74  t--;.        pIt
dde0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
ddf0: 3d 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  = iOff = pIter->
de00: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74  aRowidOffset[pIt
de10: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
de20: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
de30: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
de40: 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
de50: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
de60: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
de70: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
de80: 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
de90: 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  Dummy);.        
dea0: 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a    iOff += nPos;.
deb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dec0: 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
ded0: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
dee0: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
def0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
df00: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  -= iDelta;.     
df10: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
df20: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
df30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
df40: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
df50: 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
df60: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
df70: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
df80: 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
df90: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
dfa0: 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  eaf;.      int i
dfb0: 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  Off;.      int b
dfc0: 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
dfd0: 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
dfe0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 61 72  ;..      /* Sear
dff0: 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  ch for the end o
e000: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
e010: 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20 63  ist within the c
e020: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a  urrent page. */.
e030: 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c        u8 *a = pL
e040: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e  eaf->p;.      in
e050: 74 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  t n = pLeaf->szL
e060: 65 61 66 3b 0a 0a 20 20 20 20 20 20 41 53 53 45  eaf;..      ASSE
e070: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
e080: 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  af);.      if( p
e090: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
e0a0: 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
e0b0: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
e0c0: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
e0d0: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  eafOffset;.     
e0e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e0f0: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
e100: 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49 74 65  eafOffset + pIte
e110: 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 20 20 7d  r->nPos;.      }
e120: 0a 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ..      if( iOff
e130: 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <n ){.        /*
e140: 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   The next entry 
e150: 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  is on the curren
e160: 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  t page. */.     
e170: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f     assert_nc( iO
e180: 66 66 3c 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f  ff<=pIter->iEndo
e190: 66 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20 20 20  fDoclist );.    
e1a0: 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49      if( iOff>=pI
e1b0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
e1c0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
e1d0: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
e1e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
e1f0: 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  !=fts5LeafFirstT
e200: 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29 7b  ermOff(pLeaf) ){
e210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
e220: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
e230: 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
e240: 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Keep);.         
e250: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
e260: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20  {.          u64 
e270: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
e280: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
e290: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
e2a0: 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61  a[iOff], &iDelta
e2b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
e2c0: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
e2d0: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20  elta;.          
e2e0: 61 73 73 65 72 74 5f 6e 63 28 20 69 44 65 6c 74  assert_nc( iDelt
e2f0: 61 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  a>0 );.        }
e300: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
e310: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
e320: 66 66 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65  ff;..      }else
e330: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67   if( pIter->pSeg
e340: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
e350: 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
e360: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   0;.        cons
e370: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20  t char *zTerm = 
e380: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  0;.        int n
e390: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
e3a0: 20 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72    assert( (pIter
e3b0: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
e3c0: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
e3d0: 7c 7c 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a  || pbNewTerm );.
e3e0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
e3f0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
e400: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
e410: 45 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ERM) ){.        
e420: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
e430: 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61  hScanNext(p->pHa
e440: 73 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  sh);.          s
e450: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
e460: 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68  anEntry(p->pHash
e470: 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74  , &zTerm, &pList
e480: 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20  , &nList);.     
e490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
e4a0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
e4b0: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
e4c0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
e4d0: 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
e4e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
e4f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e500: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e510: 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38  ->pLeaf->p = (u8
e520: 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  *)pList;.       
e530: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
e540: 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  >nn = nList;.   
e550: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
e560: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c  eaf->szLeaf = nL
e570: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ist;.          p
e580: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
e590: 69 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20  ist = nList+1;. 
e5a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e5b0: 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  Fts5BufferSet(&p
e5c0: 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
e5d0: 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rm, (int)strlen(
e5e0: 7a 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20  zTerm),.        
e5f0: 20 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72 6d        (u8*)zTerm
e600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
e610: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
e620: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
e630: 70 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49  pList, (u64*)&pI
e640: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
e650: 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65          *pbNewTe
e660: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
e670: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
e680: 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 30 3b         iOff = 0;
e690: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  .        /* Next
e6a0: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e   entry is not on
e6b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
e6c0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  e */.        whi
e6d0: 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  le( iOff==0 ){. 
e6e0: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
e6f0: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
e700: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
e710: 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
e720: 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20  >pLeaf;.        
e730: 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
e740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e750: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
e760: 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  OK(pLeaf);.     
e770: 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20 3d       if( (iOff =
e780: 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
e790: 77 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20 26  widOff(pLeaf)) &
e7a0: 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a  & iOff<pLeaf->sz
e7b0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
e7c0: 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69      iOff += sqli
e7d0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
e7e0: 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
e7f0: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
e800: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
e810: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e820: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
e830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
e840: 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66   pLeaf->nn>pLeaf
e850: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
e860: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e870: 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65  >iPgidxOff = pLe
e880: 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73  af->szLeaf + fts
e890: 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20  5GetVarint32(.  
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d  &pLeaf->p[pLeaf-
e8c0: 3e 73 7a 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d  >szLeaf], pIter-
e8d0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20  >iEndofDoclist. 
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
e900: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e910: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 4c       else if( pL
e920: 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73  eaf->nn>pLeaf->s
e930: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
e940: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69       pIter->iPgi
e950: 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73  dxOff = pLeaf->s
e960: 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56  zLeaf + fts5GetV
e970: 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20  arint32(.       
e980: 20 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d           &pLeaf-
e990: 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  >p[pLeaf->szLeaf
e9a0: 5d 2c 20 69 4f 66 66 0a 20 20 20 20 20 20 20 20  ], iOff.        
e9b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
e9c0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e9d0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
e9e0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e9f0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
ea00: 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20   iOff;.         
ea10: 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b     bNewTerm = 1;
ea20: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ea30: 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e         if( iOff>
ea40: 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
ea50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
ea60: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
ea70: 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
ea80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
ea90: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
eaa0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
eab0: 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 74 65  Check if the ite
eac0: 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74 20  rator is now at 
ead0: 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74 75  EOF. If so, retu
eae0: 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20  rn early. */.   
eaf0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
eb00: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  eaf ){.        i
eb10: 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20  f( bNewTerm ){. 
eb20: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
eb30: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
eb40: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
eb50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
eb60: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
eb70: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
eb80: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
eb90: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
eba0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ebb0: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
ebc0: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c  gIterLoadTerm(p,
ebd0: 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a   pIter, nKeep);.
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
ebf0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
ec00: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
ec10: 20 20 20 20 20 20 20 69 66 28 20 70 62 4e 65 77         if( pbNew
ec20: 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72  Term ) *pbNewTer
ec30: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
ec40: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
ec50: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
ec60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75  he following cou
ec70: 6c 64 20 62 65 20 64 6f 6e 65 20 62 79 20 63 61  ld be done by ca
ec80: 6c 6c 69 6e 67 20 66 74 73 35 53 65 67 49 74 65  lling fts5SegIte
ec90: 72 4c 6f 61 64 4e 50 6f 73 28 29 2e 20 42 75 74  rLoadNPos(). But
eca0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
ecb0: 69 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72 74  is block is part
ecc0: 69 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d  icularly perform
ecd0: 61 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20 73  ance critical, s
ece0: 6f 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  o equivalent.   
ecf0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 69         ** code i
ed00: 73 20 69 6e 6c 69 6e 65 64 2e 20 0a 20 20 20 20  s inlined. .    
ed10: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
ed20: 20 20 20 2a 2a 20 4c 61 74 65 72 3a 20 53 77 69     ** Later: Swi
ed30: 74 63 68 65 64 20 62 61 63 6b 20 74 6f 20 66 74  tched back to ft
ed40: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
ed50: 73 28 29 20 62 65 63 61 75 73 65 20 69 74 20 73  s() because it s
ed60: 75 70 70 6f 72 74 73 0a 20 20 20 20 20 20 20 20  upports.        
ed70: 20 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e 65    ** detail=none
ed80: 20 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65 61 6c   mode. Not ideal
ed90: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 23  ..          */.#
eda0: 69 66 20 30 0a 20 20 20 20 20 20 20 20 20 20 69  if 0.          i
edb0: 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 20 20  nt nSz;.        
edc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
edd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
ede0: 20 20 20 20 20 20 20 20 66 74 73 35 46 61 73 74          fts5Fast
edf0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  GetVarint32(pIte
ee00: 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 70 49 74  r->pLeaf->p, pIt
ee10: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2c  er->iLeafOffset,
ee20: 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20   nSz);.         
ee30: 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28   pIter->bDel = (
ee40: 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a 20  nSz & 0x0001);. 
ee50: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ee60: 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20  nPos = nSz>>1;. 
ee70: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f           assert_
ee80: 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e  nc( pIter->nPos>
ee90: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =0 );.#endif.   
eea0: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
eeb0: 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
eec0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
eed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
eee0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57 41  }.}..#define SWA
eef0: 50 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20  PVAL(T, a, b) { 
ef00: 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d  T tmp; tmp=a; a=
ef10: 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 2f 2a 0a  b; b=tmp; }../*.
ef20: 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
ef30: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
ef40: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
ef50: 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69  rowid in a docli
ef60: 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  st. This.** func
ef70: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74  tion sets the it
ef80: 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61  erator up so tha
ef90: 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72 65  t iterates in re
efa0: 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f  verse order thro
efb0: 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69  ugh.** the docli
efc0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
efd0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
efe0: 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 20  verse(Fts5Index 
eff0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
f000: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 65  *pIter){.  int e
f010: 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
f020: 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
f030: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
f040: 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Dlidx = pIter->p
f050: 44 6c 69 64 78 3b 0a 20 20 46 74 73 35 44 61 74  Dlidx;.  Fts5Dat
f060: 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  a *pLast = 0;.  
f070: 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
f080: 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69 64 78 20  ;..  if( pDlidx 
f090: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  ){.    int iSegi
f0a0: 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  d = pIter->pSeg-
f0b0: 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e  >iSegid;.    pgn
f0c0: 6f 4c 61 73 74 20 3d 20 66 74 73 35 44 6c 69 64  oLast = fts5Dlid
f0d0: 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
f0e0: 29 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66  );.    pLast = f
f0f0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
f100: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
f110: 44 28 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61  D(iSegid, pgnoLa
f120: 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st));.  }else{. 
f130: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
f140: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
f150: 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  f;         /* Cu
f160: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
f170: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65  */..    /* Curre
f180: 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65  ntly, Fts5SegIte
f190: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
f1a0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
f1b0: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a  t byte of.    **
f1c0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63   position-list c
f1d0: 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63  ontent for the c
f1e0: 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61  urrent rowid. Ba
f1f0: 63 6b 20 69 74 20 75 70 20 73 6f 20 74 68 61 74  ck it up so that
f200: 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74   it.    ** point
f210: 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
f220: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  f the position-l
f230: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
f240: 2a 2f 0a 20 20 20 20 69 66 28 20 65 44 65 74 61  */.    if( eDeta
f250: 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
f260: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 49  NONE ){.      pI
f270: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
f280: 20 2d 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   -= sqlite3Fts5G
f290: 65 74 56 61 72 69 6e 74 4c 65 6e 28 70 49 74 65  etVarintLen(pIte
f2a0: 72 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74 65 72 2d  r->nPos*2+pIter-
f2b0: 3e 62 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  >bDel);.    }.. 
f2c0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f     /* If this co
f2d0: 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
f2e0: 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74  then the largest
f2f0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
f300: 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65  urrent.    ** te
f310: 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74  rm may not be st
f320: 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
f330: 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61  ent page. So sea
f340: 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20  rch forward to. 
f350: 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20     ** see where 
f360: 73 61 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c  said rowid reall
f370: 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66  y is.  */.    if
f380: 28 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  ( pIter->iEndofD
f390: 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73  oclist>=pLeaf->s
f3a0: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  zLeaf ){.      i
f3b0: 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46  nt pgno;.      F
f3c0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
f3d0: 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
f3e0: 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20  r->pSeg;..      
f3f0: 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69  /* The last rowi
f400: 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
f410: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74   may not be on t
f420: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
f430: 20 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a   Search.      **
f440: 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64   forward to find
f450: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
f460: 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f  ning the last ro
f470: 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  wid.  */.      f
f480: 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69  or(pgno=pIter->i
f490: 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e  LeafPgno+1; !p->
f4a0: 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67  rc && pgno<=pSeg
f4b0: 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f  ->pgnoLast; pgno
f4c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ++){.        i64
f4d0: 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47   iAbs = FTS5_SEG
f4e0: 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
f4f0: 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a  >iSegid, pgno);.
f500: 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61          Fts5Data
f510: 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74   *pNew = fts5Dat
f520: 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a  aRead(p, iAbs);.
f530: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
f540: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
f550: 74 20 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c  t iRowid, bTerml
f560: 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ess;.          i
f570: 52 6f 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66  Rowid = fts5Leaf
f580: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e  FirstRowidOff(pN
f590: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ew);.          b
f5a0: 54 65 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c  Termless = fts5L
f5b0: 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e  eafIsTermless(pN
f5c0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ew);.          i
f5d0: 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  f( iRowid ){.   
f5e0: 20 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c           SWAPVAL
f5f0: 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77  (Fts5Data*, pNew
f600: 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  , pLast);.      
f610: 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d        pgnoLast =
f620: 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20   pgno;.         
f630: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
f640: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
f650: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
f660: 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29  ( bTermless==0 )
f670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f680: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f690: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61    }..  /* If pLa
f6a0: 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68  st is NULL at th
f6b0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
f6c0: 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f  he last rowid fo
f6d0: 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20  r this doclist. 
f6e0: 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20   ** lies on the 
f6f0: 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69  page currently i
f700: 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
f710: 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69  iterator. In thi
f720: 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74  s case .  ** pIt
f730: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
f740: 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
f750: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
f760: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
f770: 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73  e.  ** field ass
f780: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
f790: 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20   first relevant 
f7a0: 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
f7b0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c  e..  **.  ** Or,
f7c0: 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e   if pLast is non
f7d0: 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69  -NULL, then it i
f7e0: 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
f7f0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73  contains the las
f800: 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e  t.  ** rowid. In
f810: 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69   this case confi
f820: 67 75 72 65 20 74 68 65 20 69 74 65 72 61 74 6f  gure the iterato
f830: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
f840: 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  nts to the.  ** 
f850: 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74  first rowid on t
f860: 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  his page..  */. 
f870: 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20   if( pLast ){.  
f880: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
f890: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
f8a0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
f8b0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
f8c0: 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74  = pLast;.    pIt
f8d0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
f8e0: 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f  pgnoLast;.    iO
f8f0: 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
f900: 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74  stRowidOff(pLast
f910: 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  );.    iOff += f
f920: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
f930: 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ast->p[iOff], (u
f940: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
f950: 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  id);.    pIter->
f960: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
f970: 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73  ff;..    if( fts
f980: 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
f990: 70 4c 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pLast) ){.      
f9a0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
f9b0: 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e  list = pLast->nn
f9c0: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
f9d0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
f9e0: 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35  ofDoclist = fts5
f9f0: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
fa00: 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a  (pLast);.    }..
fa10: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
fa20: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
fa30: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  e(p, pIter);.}..
fa40: 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
fa50: 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
fa60: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
fa70: 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f  st rowid of a do
fa80: 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20  clist..** There 
fa90: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
faa0: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
fab0: 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72  th the final ter
fac0: 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  m on the current
fad0: 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68   .** page. If th
fae0: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
faf0: 73 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  s the last term 
fb00: 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61  on the page, loa
fb10: 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  d the .** doclis
fb20: 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73  t-index from dis
fb30: 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  k and initialize
fb40: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20   an iterator at 
fb50: 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e  (pIter->pDlidx).
fb60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fb70: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
fb80: 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  lidx(Fts5Index *
fb90: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
fba0: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53  pIter){.  int iS
fbb0: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
fbc0: 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20  ->iSegid;.  int 
fbd0: 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66  bRev = (pIter->f
fbe0: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
fbf0: 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20  TER_REVERSE);.  
fc00: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
fc10: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20  = pIter->pLeaf; 
fc20: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
fc30: 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  data */..  asser
fc40: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
fc50: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
fc60: 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
fc70: 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
fc80: 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  x==0 );..  /* Ch
fc90: 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65  eck if the curre
fca0: 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20  nt doclist ends 
fcb0: 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49 66  on this page. If
fcc0: 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e   it does, return
fcd0: 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68  .  ** early with
fce0: 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  out loading the 
fcf0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61  doclist-index (a
fd00: 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20  s it belongs to 
fd10: 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a  a different.  **
fd20: 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20   term. */.  if( 
fd30: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
fd40: 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno==pIter->iLe
fd50: 61 66 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49  afPgno .   && pI
fd60: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
fd70: 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  st<pLeaf->szLeaf
fd80: 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
fd90: 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  n;.  }..  pIter-
fda0: 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c  >pDlidx = fts5Dl
fdb0: 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62  idxIterInit(p, b
fdc0: 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72  Rev, iSeg, pIter
fdd0: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
fde0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  ;.}..#define fts
fdf0: 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74  5IndexSkipVarint
fe00: 28 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20 20  (a, iOff) {     
fe10: 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 69         \.  int i
fe20: 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20  End = iOff+9;   
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe40: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 77             \.  w
fe50: 68 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d  hile( (a[iOff++]
fe60: 20 26 20 30 78 38 30 29 20 26 26 20 69 4f 66 66   & 0x80) && iOff
fe70: 3c 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20 5c  <iEnd );       \
fe80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
fe90: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
fea0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
feb0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
fec0: 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  ently contains.*
fed0: 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65  * no valid value
fee0: 73 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  s except for the
fef0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65   Fts5SegIter.pLe
ff00: 61 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  af member variab
ff10: 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  le. This.** func
ff20: 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68  tion searches th
ff30: 65 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20  e leaf page for 
ff40: 61 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20  a term matching 
ff50: 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a  (pTerm/nTerm)..*
ff60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63  *.** If the spec
ff70: 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f  ified term is fo
ff80: 75 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  und on the page,
ff90: 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
ffa0: 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f  or is left.** po
ffb0: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66  inting to it. If
ffc0: 20 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73   argument bGe is
ffd0: 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65   zero and the te
ffe0: 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  rm is not found,
fff0: 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72  .** the iterator
10000 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
10010 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  g at EOF..**.** 
10020 49 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65  If bGe is non-ze
10030 72 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ro and the speci
10040 66 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74  fied term is not
10050 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
10060 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20  .** iterator is 
10070 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
10080 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65   the smallest te
10090 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
100a0 74 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  t that.** is lar
100b0 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65  ger than the spe
100c0 63 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65  cified term, eve
100d0 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 69  n if this term i
100e0 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20  s not on the.** 
100f0 63 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f  current page..*/
10100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
10110 35 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73  5LeafSeek(.  Fts
10120 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10140 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
10150 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  code here */.  i
10160 6e 74 20 62 47 65 2c 20 20 20 20 20 20 20 20 20  nt bGe,         
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10180 2a 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20  * True for a >= 
10190 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35  search */.  Fts5
101a0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
101b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
101c0 74 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20  terator to seek 
101d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
101e0 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20  Term, int nTerm 
101f0 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
10200 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b  search for */.){
10210 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63  .  int iOff;.  c
10220 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74  onst u8 *a = pIt
10230 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
10240 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74  int szLeaf = pIt
10250 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
10260 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74  f;.  int n = pIt
10270 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a  er->pLeaf->nn;..
10280 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30    int nMatch = 0
10290 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20  ;.  int nKeep = 
102a0 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  0;.  int nNew = 
102b0 30 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66  0;.  int iTermOf
102c0 66 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b  f;.  int iPgidx;
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
102f0 6f 66 66 73 65 74 20 69 6e 20 70 67 69 64 78 20  offset in pgidx 
10300 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50  */.  int bEndOfP
10310 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
10320 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
10330 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64  E_OK );..  iPgid
10340 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50  x = szLeaf;.  iP
10350 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
10360 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
10370 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20  x], iTermOff);. 
10380 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
10390 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
103a0 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
103b0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6e 65 77  out how many new
103c0 20 62 79 74 65 73 20 61 72 65 20 69 6e 20 74 68   bytes are in th
103d0 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 66  is term */.    f
103e0 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
103f0 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4e 65 77  32(a, iOff, nNew
10400 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70  );.    if( nKeep
10410 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  <nMatch ){.     
10420 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
10430 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
10440 61 73 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d 6e  assert( nKeep>=n
10450 4d 61 74 63 68 20 29 3b 0a 20 20 20 20 69 66 28  Match );.    if(
10460 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29   nKeep==nMatch )
10470 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70  {.      int nCmp
10480 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
10490 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28       nCmp = MIN(
104a0 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74  nNew, nTerm-nMat
104b0 63 68 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ch);.      for(i
104c0 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29  =0; i<nCmp; i++)
104d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 5b  {.        if( a[
104e0 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e  iOff+i]!=pTerm[n
104f0 4d 61 74 63 68 2b 69 5d 20 29 20 62 72 65 61 6b  Match+i] ) break
10500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10510 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20  nMatch += i;..  
10520 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 6e      if( nTerm==n
10530 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
10540 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a   if( i==nNew ){.
10550 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
10560 65 61 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20  earch_success;. 
10570 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10580 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61          goto sea
10590 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  rch_failed;.    
105a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
105b0 65 20 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20  e if( i<nNew && 
105c0 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b  a[iOff+i]>pTerm[
105d0 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20  nMatch] ){.     
105e0 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66     goto search_f
105f0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
10600 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50     }..    if( iP
10610 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  gidx>=n ){.     
10620 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b   bEndOfPage = 1;
10630 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10640 20 20 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20    }..    iPgidx 
10650 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
10660 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e  32(&a[iPgidx], n
10670 4b 65 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d  Keep);.    iTerm
10680 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20  Off += nKeep;.  
10690 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
106a0 66 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  f;..    /* Read 
106b0 74 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20  the nKeep field 
106c0 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  of the next term
106d0 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73  . */.    fts5Fas
106e0 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20  tGetVarint32(a, 
106f0 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  iOff, nKeep);.  
10700 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65  }.. search_faile
10710 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20  d:.  if( bGe==0 
10720 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  ){.    fts5DataR
10730 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
10740 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
10750 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
10760 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
10770 69 66 28 20 62 45 6e 64 4f 66 50 61 67 65 20 29  if( bEndOfPage )
10780 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
10790 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
107a0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
107b0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
107c0 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75  >pLeaf==0 ) retu
107d0 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20 70 49  rn;.      a = pI
107e0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
107f0 20 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61       if( fts5Lea
10800 66 49 73 54 65 72 6d 6c 65 73 73 28 70 49 74 65  fIsTermless(pIte
10810 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a  r->pLeaf)==0 ){.
10820 20 20 20 20 20 20 20 20 69 50 67 69 64 78 20 3d          iPgidx =
10830 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
10840 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 69  zLeaf;.        i
10850 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74  Pgidx += fts5Get
10860 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d  Varint32(&pIter-
10870 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67 69 64 78  >pLeaf->p[iPgidx
10880 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20  ], iOff);.      
10890 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
108a0 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65  iOff>=pIter->pLe
108b0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
108c0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
108d0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
108e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
108f0 20 20 20 20 20 20 20 6e 4b 65 65 70 20 3d 20 30         nKeep = 0
10900 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54 65 72  ;.          iTer
10910 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20  mOff = iOff;.   
10920 20 20 20 20 20 20 20 6e 20 3d 20 70 49 74 65 72         n = pIter
10930 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20 20  ->pLeaf->nn;.   
10940 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
10950 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
10960 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  a[iOff], nNew);.
10970 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10980 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10990 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 31   }.    }while( 1
109a0 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68   );.  }.. search
109b0 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20 70 49 74  _success:..  pIt
109c0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
109d0 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a 20  = iOff + nNew;. 
109e0 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
109f0 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d  fOffset = pIter-
10a00 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
10a10 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
10a20 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c  Pgno = pIter->iL
10a30 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73 35  eafPgno;..  fts5
10a40 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
10a50 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
10a60 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a 20  nKeep, pTerm);. 
10a70 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
10a80 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
10a90 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77  Iter->term, nNew
10aa0 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20  , &a[iOff]);..  
10ab0 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b  if( iPgidx>=n ){
10ac0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
10ad0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65  ofDoclist = pIte
10ae0 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a  r->pLeaf->nn+1;.
10af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
10b00 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 50 67   nExtra;.    iPg
10b10 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
10b20 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
10b30 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
10b40 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
10b50 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f 66 66 20  list = iTermOff 
10b60 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20 20  + nExtra;.  }.  
10b70 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
10b80 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20 20 66 74   = iPgidx;..  ft
10b90 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77  s5SegIterLoadRow
10ba0 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  id(p, pIter);.  
10bb0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
10bc0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  Pos(p, pIter);.}
10bd0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
10be0 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49  ze the object pI
10bf0 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ter to point to 
10c00 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
10c10 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a   within segment.
10c20 2a 2a 20 70 53 65 67 2e 20 49 66 20 74 68 65 72  ** pSeg. If ther
10c30 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72  e is no such ter
10c40 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  m in the index, 
10c50 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
10c60 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a  set to EOF..**.*
10c70 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
10c80 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
10c90 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
10ca0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
10cb0 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61  r code. If .** a
10cc0 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
10cd0 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
10ce0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
10cf0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
10d00 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
10d10 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
10d20 49 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20  IterSeekInit(.  
10d30 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
10d60 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
10d70 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
10d80 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
10d90 6f 20 75 73 65 20 66 6f 72 20 6c 6f 61 64 69 6e  o use for loadin
10da0 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 63 6f 6e  g pages */.  con
10db0 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
10dc0 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
10dd0 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
10de0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
10e10 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c  FTS5INDEX_XXX fl
10e20 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ags */.  Fts5Str
10e30 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
10e40 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
10e50 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
10e60 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
10e70 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
10e80 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
10e90 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
10ea0 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20  .){.  int iPg = 
10eb0 31 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28  1;.  int bGe = (
10ec0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
10ed0 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a 20  X_QUERY_SCAN);. 
10ee0 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b   int bDlidx = 0;
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
10f10 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
10f20 6e 64 65 78 20 2a 2f 0a 0a 20 20 73 74 61 74 69  ndex */..  stati
10f30 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b  c int nCall = 0;
10f40 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a 20 20 61  .  nCall++;..  a
10f50 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c  ssert( bGe==0 ||
10f60 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
10f70 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 3d  DEX_QUERY_DESC)=
10f80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10f90 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 20 29  pTerm && nTerm )
10fa0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  ;.  memset(pIter
10fb0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
10fc0 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  er));.  pIter->p
10fd0 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20 20 2f  Seg = pSeg;..  /
10fe0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 74  * This block set
10ff0 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
11000 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65 61 66   iPg to the leaf
11010 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
11020 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61  t may.  ** conta
11030 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e  in term (pTerm/n
11040 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69 73 20  Term), if it is 
11050 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73  present in the s
11060 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  egment. */.  if(
11070 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 3d 3d   p->pIdxSelect==
11080 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
11090 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
110a0 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
110b0 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
110c0 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 53  tmt(p, &p->pIdxS
110d0 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33 5f 6d  elect, sqlite3_m
110e0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
110f0 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f 20 46    "SELECT pgno F
11100 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78  ROM '%q'.'%q_idx
11110 27 20 57 48 45 52 45 20 22 0a 20 20 20 20 20 20  ' WHERE ".      
11120 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41 4e 44      "segid=? AND
11130 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52 20 42   term<=? ORDER B
11140 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49 4d 49  Y term DESC LIMI
11150 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20  T 1",.          
11160 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
11170 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
11180 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   ));.  }.  if( p
11190 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
111a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
111b0 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c  t(p->pIdxSelect,
111c0 20 31 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64   1, pSeg->iSegid
111d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
111e0 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 53 65  d_blob(p->pIdxSe
111f0 6c 65 63 74 2c 20 32 2c 20 70 54 65 72 6d 2c 20  lect, 2, pTerm, 
11200 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f 53 54  nTerm, SQLITE_ST
11210 41 54 49 43 29 3b 0a 20 20 69 66 28 20 53 51 4c  ATIC);.  if( SQL
11220 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
11230 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 53 65 6c  _step(p->pIdxSel
11240 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36 34 20  ect) ){.    i64 
11250 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
11260 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 70 49 64 78  lumn_int(p->pIdx
11270 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
11280 69 50 67 20 3d 20 28 69 6e 74 29 28 76 61 6c 3e  iPg = (int)(val>
11290 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69 64 78 20  >1);.    bDlidx 
112a0 3d 20 28 76 61 6c 20 26 20 30 78 30 30 30 31 29  = (val & 0x0001)
112b0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20  ;.  }.  p->rc = 
112c0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
112d0 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 0a 20  >pIdxSelect);.. 
112e0 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70   if( iPg<pSeg->p
112f0 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20  gnoFirst ){.    
11300 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  iPg = pSeg->pgno
11310 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64  First;.    bDlid
11320 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49  x = 0;.  }..  pI
11330 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
11340 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35   iPg - 1;.  fts5
11350 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
11360 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66  p, pIter);..  if
11370 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
11380 7b 0a 20 20 20 20 66 74 73 35 4c 65 61 66 53 65  {.    fts5LeafSe
11390 65 6b 28 70 2c 20 62 47 65 2c 20 70 49 74 65 72  ek(p, bGe, pIter
113a0 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , pTerm, nTerm);
113b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
113c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
113d0 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  bGe==0 ){.    pI
113e0 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
113f0 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
11400 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  RM;.    if( pIte
11410 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
11420 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
11430 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
11440 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  SC ){.        pI
11450 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
11460 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
11470 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SE;.      }.    
11480 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a    if( bDlidx ){.
11490 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
114a0 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20  terLoadDlidx(p, 
114b0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
114c0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
114d0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
114e0 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
114f0 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
11500 65 72 73 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  erse(p, pIter);.
11510 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11520 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 3a 0a  }..  /* Either:.
11530 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 61    **.  **   1) a
11540 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
11550 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  rred, or.  **   
11560 32 29 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  2) the iterator 
11570 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 2c 20 6f  points to EOF, o
11580 72 0a 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20  r.  **   3) the 
11590 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
115a0 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68  to an entry with
115b0 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65   term (pTerm/nTe
115c0 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 34  rm), or.  **   4
115d0 29 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f  ) the FTS5INDEX_
115e0 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20  QUERY_SCAN flag 
115f0 77 61 73 20 73 65 74 20 61 6e 64 20 74 68 65 20  was set and the 
11600 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a  iterator points.
11610 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 61 6e 20    **      to an 
11620 65 6e 74 72 79 20 77 69 74 68 20 61 20 74 65 72  entry with a ter
11630 6d 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  m greater than o
11640 72 20 65 71 75 61 6c 20 74 6f 20 28 70 54 65 72  r equal to (pTer
11650 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20  m/nTerm)..  */. 
11660 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
11670 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116a0 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c     /* 1 */.   ||
116b0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
116f0 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20 66 74 73  * 2 */.   || fts
11700 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
11710 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
11720 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d   pTerm, nTerm)==
11730 30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20  0          /* 3 
11740 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65 20 26 26  */.   || (bGe &&
11750 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
11760 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74  reBlob(&pIter->t
11770 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
11780 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a 2f 0a 20  m)>0)  /* 4 */. 
11790 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   );.}../*.** Ini
117a0 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65  tialize the obje
117b0 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  ct pIter to poin
117c0 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f  t to term pTerm/
117d0 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  nTerm within the
117e0 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  .** in-memory ha
117f0 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65  sh table. If the
11800 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65  re is no such te
11810 72 6d 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74  rm in the hash-t
11820 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74  able, the .** it
11830 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  erator is set to
11840 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   EOF..**.** If a
11850 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
11860 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
11870 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
11880 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
11890 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
118a0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
118b0 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
118c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
118d0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
118e0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
118f0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 48 61  id fts5SegIterHa
11900 73 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  shInit(.  Fts5In
11910 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
11920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
11930 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63  5 backend */.  c
11940 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
11950 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
11960 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
11970 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  o */.  int flags
11980 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11990 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
119a0 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20  f FTS5INDEX_XXX 
119b0 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53  flags */.  Fts5S
119c0 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
119d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
119e0 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
119f0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
11a00 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
11a10 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20  int nList = 0;. 
11a20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30   const u8 *z = 0
11a30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a  ;.  int n = 0;..
11a40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
11a50 73 68 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  sh );.  assert( 
11a60 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11a70 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d   );..  if( pTerm
11a80 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
11a90 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
11aa0 53 43 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e  SCAN) ){.    p->
11ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
11ac0 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e  HashScanInit(p->
11ad0 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
11ae0 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
11af0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
11b00 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
11b10 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
11b20 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69   char**)&z, &pLi
11b30 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
11b40 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73   n = (z ? (int)s
11b50 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61  trlen((const cha
11b60 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65  r*)z) : 0);.  }e
11b70 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
11b80 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
11b90 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
11ba0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
11bb0 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68  shQuery(p->pHash
11bc0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  , (const char*)p
11bd0 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c  Term, nTerm, &pL
11be0 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
11bf0 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20    z = pTerm;.   
11c00 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a   n = nTerm;.  }.
11c10 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
11c20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
11c30 65 61 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eaf;.    sqlite3
11c40 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  Fts5BufferSet(&p
11c50 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
11c60 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70  rm, n, z);.    p
11c70 4c 65 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61  Leaf = fts5IdxMa
11c80 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
11c90 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69  ts5Data));.    i
11ca0 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  f( pLeaf==0 ) re
11cb0 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d  turn;.    pLeaf-
11cc0 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b  >p = (u8*)pList;
11cd0 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d  .    pLeaf->nn =
11ce0 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d   pLeaf->szLeaf =
11cf0 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65   nList;.    pIte
11d00 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66  r->pLeaf = pLeaf
11d10 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
11d20 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
11d30 65 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e  etVarint(pLeaf->
11d40 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  p, (u64*)&pIter-
11d50 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49  >iRowid);.    pI
11d60 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
11d70 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31  st = pLeaf->nn+1
11d80 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  ;..    if( flags
11d90 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
11da0 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  RY_DESC ){.     
11db0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
11dc0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
11dd0 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66 74 73  VERSE;.      fts
11de0 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
11df0 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
11e00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11e10 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
11e20 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
11e30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
11e40 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69  /*.** Zero the i
11e50 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
11e60 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
11e70 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
11e80 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43  oid fts5SegIterC
11e90 6c 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72  lear(Fts5SegIter
11ea0 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35   *pIter){.  fts5
11eb0 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65  BufferFree(&pIte
11ec0 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35  r->term);.  fts5
11ed0 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
11ee0 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73  r->pLeaf);.  fts
11ef0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
11f00 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a  er->pNextLeaf);.
11f10 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
11f20 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69 64  ree(pIter->pDlid
11f30 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  x);.  sqlite3_fr
11f40 65 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64  ee(pIter->aRowid
11f50 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65  Offset);.  memse
11f60 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
11f70 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29 29  of(Fts5SegIter))
11f80 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
11f90 54 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20  TE_DEBUG../*.** 
11fa0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
11fb0 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
11fc0 20 74 68 65 20 62 69 67 20 61 73 73 65 72 74 28   the big assert(
11fd0 29 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c  ) procedure impl
11fe0 65 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74  emented by.** ft
11ff0 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
12000 72 53 65 74 75 70 28 29 2e 20 49 74 20 65 6e 73  rSetup(). It ens
12010 75 72 65 73 20 74 68 61 74 20 74 68 65 20 72 65  ures that the re
12020 73 75 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73  sult currently s
12030 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65  tored.** in *pRe
12040 73 20 69 73 20 74 68 65 20 63 6f 72 72 65 63 74  s is the correct
12050 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
12060 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
12070 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74 68   positions of th
12080 65 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61 74 6f  e.** two iterato
12090 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
120a0 69 64 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d  id fts5AssertCom
120b0 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20  parisonResult(. 
120c0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
120d0 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65  pIter, .  Fts5Se
120e0 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73  gIter *p1,.  Fts
120f0 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20  5SegIter *p2,.  
12100 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
12110 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20  s.){.  int i1 = 
12120 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  p1 - pIter->aSeg
12130 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20  ;.  int i2 = p2 
12140 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a  - pIter->aSeg;..
12150 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20    if( p1->pLeaf 
12160 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a  || p2->pLeaf ){.
12170 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61      if( p1->pLea
12180 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
12190 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
121a0 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65  st==i2 );.    }e
121b0 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61  lse if( p2->pLea
121c0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
121d0 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
121e0 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65  st==i1 );.    }e
121f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
12200 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65  Min = MIN(p1->te
12210 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e  rm.n, p2->term.n
12220 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  );.      int res
12230 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65   = memcmp(p1->te
12240 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70  rm.p, p2->term.p
12250 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69  , nMin);.      i
12260 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
12270 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70  = p1->term.n - p
12280 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20  2->term.n;..    
12290 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
122a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
122b0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31  pRes->bTermEq==1
122c0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
122d0 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d  rt( p1->iRowid!=
122e0 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20  p2->iRowid );.  
122f0 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31        res = ((p1
12300 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69  ->iRowid > p2->i
12310 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
12320 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20  Rev) ? -1 : 1;. 
12330 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12340 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12350 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a  ->bTermEq==0 );.
12360 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
12370 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
12380 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12390 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a  ->iFirst==i1 );.
123a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
123b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
123c0 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b  s->iFirst==i2 );
123d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
123e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
123f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
12400 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49  o-op unless SQLI
12410 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
12420 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f  ned when this mo
12430 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69  dule.** is compi
12440 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73  led. In that cas
12450 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
12460 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20   is essentially 
12470 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  an assert() .** 
12480 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  statement used t
12490 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
124a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
124b0 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
124c0 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63  ] array.** are c
124d0 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
124e0 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
124f0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
12500 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
12510 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
12520 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er){.  if( p->rc
12530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12540 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
12550 70 46 69 72 73 74 20 3d 20 26 70 49 74 65 72 2d  pFirst = &pIter-
12560 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
12570 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
12580 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ;.    int i;..  
12590 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72 73    assert( (pFirs
125a0 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49  t->pLeaf==0)==pI
125b0 74 65 72 2d 3e 62 45 6f 66 20 29 3b 0a 0a 20 20  ter->bEof );..  
125c0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
125d0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
125e0 77 69 64 20 69 73 20 73 65 74 20 63 6f 72 72 65  wid is set corre
125f0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ctly. */.    for
12600 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
12610 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Seg; i++){.     
12620 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
12630 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
12640 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  i];.      assert
12650 28 20 70 31 3d 3d 70 46 69 72 73 74 20 0a 20 20  ( p1==pFirst .  
12660 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e           || p1->
12670 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20 20 20  pLeaf==0 .      
12680 20 20 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66       || fts5Buff
12690 65 72 43 6f 6d 70 61 72 65 28 26 70 46 69 72 73  erCompare(&pFirs
126a0 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65  t->term, &p1->te
126b0 72 6d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm) .           
126c0 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70  || p1->iRowid==p
126d0 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
126e0 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  id.           ||
126f0 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74   (p1->iRowid<pIt
12700 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
12710 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20  )==pIter->bRev. 
12720 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
12730 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
12740 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29  ter->nSeg; i+=2)
12750 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
12760 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72  ter *p1 = &pIter
12770 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20  ->aSeg[i];.     
12780 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
12790 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
127a0 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  i+1];.      Fts5
127b0 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
127c0 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28  &pIter->aFirst[(
127d0 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29  pIter->nSeg + i)
127e0 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73   / 2];.      fts
127f0 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f  5AssertCompariso
12800 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70  nResult(pIter, p
12810 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20  1, p2, pRes);.  
12820 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31    }..    for(i=1
12830 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67  ; i<(pIter->nSeg
12840 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20   / 2); i+=2){.  
12850 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
12860 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p1 = &pIter->aS
12870 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
12880 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b  t[i*2].iFirst ];
12890 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
128a0 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d  er *p2 = &pIter-
128b0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
128c0 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72  irst[i*2+1].iFir
128d0 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  st ];.      Fts5
128e0 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
128f0 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69  &pIter->aFirst[i
12900 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73 73  ];.      fts5Ass
12910 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73  ertComparisonRes
12920 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70  ult(pIter, p1, p
12930 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a  2, pRes);.    }.
12940 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
12950 66 69 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d  fine fts5AssertM
12960 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 78 2c  ultiIterSetup(x,
12970 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  y).#endif../*.**
12980 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
12990 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  on necessary to 
129a0 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e  populate pIter->
129b0 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a  aFirst[iOut]..**
129c0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72  .** If the retur
129d0 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e  ned value is non
129e0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
129f0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
12a00 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68  n entry.** in th
12a10 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20  e pIter->aSeg[] 
12a20 61 72 72 61 79 20 74 68 61 74 20 69 73 20 28 61  array that is (a
12a30 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e  ) not at EOF, an
12a40 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a  d (b) pointing.*
12a50 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20  * to a key that 
12a60 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
12a70 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65  f another, highe
12a80 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20  r priority, .** 
12a90 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72  segment-iterator
12aa0 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53   in the pSeg->aS
12ab0 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  eg[] array..*/.s
12ac0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
12ad0 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
12ae0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
12af0 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29  pIter, int iOut)
12b00 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20  {.  int i1;     
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12b30 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65  left-hand Fts5Se
12b40 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  gIter */.  int i
12b50 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
12b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12b70 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e  dex of right-han
12b80 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
12b90 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46  .  int iRes;.  F
12ba0 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20  ts5SegIter *p1; 
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12bc0 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35  * Left-hand Fts5
12bd0 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73  SegIter */.  Fts
12be0 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20  5SegIter *p2;   
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c00 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53  Right-hand Fts5S
12c10 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35  egIter */.  Fts5
12c20 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
12c30 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69  &pIter->aFirst[i
12c40 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  Out];..  assert(
12c50 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65   iOut<pIter->nSe
12c60 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20  g && iOut>0 );. 
12c70 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
12c80 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72  bRev==0 || pIter
12c90 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20  ->bRev==1 );..  
12ca0 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72  if( iOut>=(pIter
12cb0 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20  ->nSeg/2) ){.   
12cc0 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49   i1 = (iOut - pI
12cd0 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32  ter->nSeg/2) * 2
12ce0 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20  ;.    i2 = i1 + 
12cf0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
12d00 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  i1 = pIter->aFir
12d10 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73  st[iOut*2].iFirs
12d20 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65  t;.    i2 = pIte
12d30 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32  r->aFirst[iOut*2
12d40 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a  +1].iFirst;.  }.
12d50 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61    p1 = &pIter->a
12d60 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20  Seg[i1];.  p2 = 
12d70 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d  &pIter->aSeg[i2]
12d80 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72 6d  ;..  pRes->bTerm
12d90 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 31  Eq = 0;.  if( p1
12da0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20  ->pLeaf==0 ){   
12db0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31          /* If p1
12dc0 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20   is at EOF */.  
12dd0 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d    iRes = i2;.  }
12de0 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65  else if( p2->pLe
12df0 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20  af==0 ){     /* 
12e00 49 66 20 70 32 20 69 73 20 61 74 20 45 4f 46 20  If p2 is at EOF 
12e10 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31  */.    iRes = i1
12e20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
12e30 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42 75 66  nt res = fts5Buf
12e40 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e  ferCompare(&p1->
12e50 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29  term, &p2->term)
12e60 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ;.    if( res==0
12e70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12e80 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20 20  ( i2>i1 );.     
12e90 20 61 73 73 65 72 74 28 20 69 32 21 3d 30 20 29   assert( i2!=0 )
12ea0 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62 54  ;.      pRes->bT
12eb0 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  ermEq = 1;.     
12ec0 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d   if( p1->iRowid=
12ed0 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20  =p2->iRowid ){. 
12ee0 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c 20         p1->bDel 
12ef0 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20  = p2->bDel;.    
12f00 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a 20      return i2;. 
12f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73       }.      res
12f20 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20   = ((p1->iRowid 
12f30 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70  > p2->iRowid)==p
12f40 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31  Iter->bRev) ? -1
12f50 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20   : +1;.    }.   
12f60 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30 20   assert( res!=0 
12f70 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  );.    if( res<0
12f80 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d   ){.      iRes =
12f90 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   i1;.    }else{.
12fa0 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b        iRes = i2;
12fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52  .    }.  }..  pR
12fc0 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31  es->iFirst = (u1
12fd0 36 29 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e  6)iRes;.  return
12fe0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76   0;.}../*.** Mov
12ff0 65 20 74 68 65 20 73 65 67 2d 69 74 65 72 20 73  e the seg-iter s
13000 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
13010 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
13020 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c 65 61  wid on page iLea
13030 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20  fPgno..** It is 
13040 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65 61 66  an error if leaf
13050 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73 20   iLeafPgno does 
13060 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
13070 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e  tains no rowids.
13080 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13090 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50  fts5SegIterGotoP
130a0 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  age(.  Fts5Index
130b0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
130c0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
130d0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
130e0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
130f0 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
13100 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
13110 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
13120 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a  nt iLeafPgno.){.
13130 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50    assert( iLeafP
13140 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
13150 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69  Pgno );..  if( i
13160 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
13170 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
13180 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54  {.    p->rc = FT
13190 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65  S5_CORRUPT;.  }e
131a0 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44 61 74  lse{.    fts5Dat
131b0 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
131c0 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20  pNextLeaf);.    
131d0 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
131e0 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d   = 0;.    pIter-
131f0 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
13200 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74  afPgno-1;.    ft
13210 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
13220 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
13230 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
13240 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
13250 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69  er->iLeafPgno==i
13260 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20  LeafPgno );..   
13270 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
13290 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 75  nt iOff;.      u
132a0 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
132b0 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e  eaf->p;.      in
132c0 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  t n = pIter->pLe
132d0 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20  af->szLeaf;..   
132e0 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65     iOff = fts5Le
132f0 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
13300 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
13310 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20       if( iOff<4 
13320 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20  || iOff>=n ){.  
13330 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
13340 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
13350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13360 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
13370 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
13380 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
13390 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
133a0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
133b0 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
133c0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
133d0 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
133e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
133f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76    }.}../*.** Adv
13400 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f  ance the iterato
13410 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
13420 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
13430 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f  until it is at o
13440 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64  r .** past rowid
13450 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65   iFrom. Regardle
13460 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
13470 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74  of iFrom, the it
13480 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77  erator is.** alw
13490 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74 20  ays advanced at 
134a0 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73  least once..*/.s
134b0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
134c0 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a  egIterNextFrom(.
134d0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
13500 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
13510 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
13520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
13530 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
13540 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d  ance */.  i64 iM
13550 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  atch            
13560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76            /* Adv
13570 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61 74  ance iterator at
13580 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72 20   least this far 
13590 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76  */.){.  int bRev
135a0 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73   = (pIter->flags
135b0 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
135c0 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35  REVERSE);.  Fts5
135d0 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
135e0 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  x = pIter->pDlid
135f0 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  x;.  int iLeafPg
13600 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  no = pIter->iLea
13610 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f  fPgno;.  int bMo
13620 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72  ve = 1;..  asser
13630 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
13640 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
13650 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
13660 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
13670 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x );.  assert( p
13680 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a  Iter->pLeaf );..
13690 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b    if( bRev==0 ){
136a0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73  .    while( !fts
136b0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
136c0 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74   pDlidx) && iMat
136d0 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72  ch>fts5DlidxIter
136e0 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b  Rowid(pDlidx) ){
136f0 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f  .      iLeafPgno
13700 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
13710 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
13720 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
13730 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29  rNext(p, pDlidx)
13740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
13750 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f  rt_nc( iLeafPgno
13760 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  >=pIter->iLeafPg
13770 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20  no || p->rc );. 
13780 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f     if( iLeafPgno
13790 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
137a0 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  o ){.      fts5S
137b0 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70  egIterGotoPage(p
137c0 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67  , pIter, iLeafPg
137d0 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  no);.      bMove
137e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
137f0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
13800 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
13810 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  f==0 );.    asse
13820 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72  rt( iMatch<pIter
13830 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->iRowid );.    
13840 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64  while( !fts5Dlid
13850 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
13860 64 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66 74  dx) && iMatch<ft
13870 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
13880 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20  (pDlidx) ){.    
13890 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
138a0 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a  rev(p, pDlidx);.
138b0 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50      }.    iLeafP
138c0 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
138d0 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
138e0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74  ..    assert( ft
138f0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
13900 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65  , pDlidx) || iLe
13910 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69  afPgno<=pIter->i
13920 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20  LeafPgno );..   
13930 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70   if( iLeafPgno<p
13940 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
13950 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
13960 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61  iLeafPgno = iLea
13970 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66  fPgno+1;.      f
13980 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
13990 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65  eNewPage(p, pIte
139a0 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20  r);.      bMove 
139b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
139c0 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d    do{.    if( bM
139d0 6f 76 65 20 29 20 66 74 73 35 53 65 67 49 74 65  ove ) fts5SegIte
139e0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
139f0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  0);.    if( pIte
13a00 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72  r->pLeaf==0 ) br
13a10 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65  eak;.    if( bRe
13a20 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69  v==0 && pIter->i
13a30 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
13a40 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
13a50 52 65 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d  Rev!=0 && pIter-
13a60 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20  >iRowid<=iMatch 
13a70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f  ) break;.    bMo
13a80 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65  ve = 1;.  }while
13a90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13aa0 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  OK );.}.../*.** 
13ab0 46 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f  Free the iterato
13ac0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
13ad0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
13ae0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
13af0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
13b00 49 74 65 72 46 72 65 65 28 46 74 73 35 49 6e 64  IterFree(Fts5Ind
13b10 65 78 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78  ex *p, Fts5Index
13b20 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
13b30 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
13b40 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
13b50 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
13b60 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
13b70 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
13b80 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d  (&pIter->aSeg[i]
13b90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
13ba0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
13bb0 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74  e(pIter->pStruct
13bc0 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
13bd0 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f  rFree(&pIter->po
13be0 73 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  slist);.    sqli
13bf0 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
13c00 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
13c10 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
13c20 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73  rAdvanced(.  Fts
13c30 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c50 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
13c60 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
13c70 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
13c80 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
13c90 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
13ca0 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74  to update aFirst
13cb0 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a  [] array for */.
13cc0 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20    int iChanged, 
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75    /* Index of su
13cf0 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20  b-iterator just 
13d00 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  advanced */.  in
13d10 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20  t iMinset       
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d30 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69   Minimum entry i
13d40 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65  n aFirst[] to se
13d50 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
13d60 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d  .  for(i=(pIter-
13d70 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f  >nSeg+iChanged)/
13d80 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26  2; i>=iMinset &&
13d90 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13da0 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69  K; i=i/2){.    i
13db0 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20  nt iEq;.    if( 
13dc0 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
13dd0 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49  IterDoCompare(pI
13de0 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20  ter, i)) ){.    
13df0 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
13e00 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65  t(p, &pIter->aSe
13e10 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20  g[iEq], 0);.    
13e20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65    i = pIter->nSe
13e30 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20  g + iEq;.    }. 
13e40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d   }.}../*.** Sub-
13e50 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65  iterator iChange
13e60 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49  d of iterator pI
13e70 74 65 72 20 68 61 73 20 6a 75 73 74 20 62 65 65  ter has just bee
13e80 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73  n advanced. It s
13e90 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  till.** points t
13ea0 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20  o the same term 
13eb0 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20  though - just a 
13ec0 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e  different rowid.
13ed0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
13ee0 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70  * attempts to up
13ef0 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
13f00 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e  s of the pIter->
13f10 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69  aFirst[] accordi
13f20 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64  ngly..** If it d
13f30 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73 66 75  oes so successfu
13f40 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e  lly, 0 is return
13f50 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e  ed. Otherwise 1.
13f60 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65  .**.** If non-ze
13f70 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ro is returned, 
13f80 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  the caller shoul
13f90 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69  d call fts5Multi
13fa0 49 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a  IterAdvanced().*
13fb0 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f  * on the iterato
13fc0 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20  r instead. That 
13fd0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
13fe0 65 20 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f  e same as this o
13ff0 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  ne, except.** th
14000 61 74 20 69 74 20 64 65 61 6c 73 20 77 69 74 68  at it deals with
14010 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65   more complicate
14020 64 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e  d cases as well.
14030 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
14040 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
14050 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73  anceRowid(.  Fts
14060 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14080 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
14090 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
140a0 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
140b0 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
140c0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
140d0 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74  to update aFirst
140e0 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a  [] array for */.
140f0 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20    int iChanged  
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14110 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75    /* Index of su
14120 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20  b-iterator just 
14130 61 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20  advanced */.){. 
14140 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e   Fts5SegIter *pN
14150 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  ew = &pIter->aSe
14160 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20  g[iChanged];..  
14170 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64  if( pNew->iRowid
14180 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  ==pIter->iSwitch
14190 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65  Rowid.   || (pNe
141a0 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d  w->iRowid<pIter-
141b0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
141c0 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b  pIter->bRev.  ){
141d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
141e0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74  Fts5SegIter *pOt
141f0 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  her = &pIter->aS
14200 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78  eg[iChanged ^ 0x
14210 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72  0001];.    pIter
14220 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d  ->iSwitchRowid =
14230 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53   pIter->bRev ? S
14240 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
14250 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20  LARGEST_INT64;. 
14260 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d     for(i=(pIter-
14270 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f  >nSeg+iChanged)/
14280 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  2; 1; i=i/2){.  
14290 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
142a0 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
142b0 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20  aFirst[i];..    
142c0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
142d0 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61  pLeaf );.      a
142e0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65  ssert( pRes->bTe
142f0 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65  rmEq==0 || pOthe
14300 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20  r->pLeaf );..   
14310 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65     if( pRes->bTe
14320 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20  rmEq ){.        
14330 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64  if( pNew->iRowid
14340 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  ==pOther->iRowid
14350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
14360 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
14370 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65  }else if( (pOthe
14380 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e  r->iRowid>pNew->
14390 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
143a0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
143b0 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
143c0 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e  Rowid = pOther->
143d0 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
143e0 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b    pNew = pOther;
143f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
14400 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77  f( (pOther->iRow
14410 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63  id>pIter->iSwitc
14420 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  hRowid)==pIter->
14430 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
14440 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
14450 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e  Rowid = pOther->
14460 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
14470 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14480 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28  pRes->iFirst = (
14490 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49 74 65  u16)(pNew - pIte
144a0 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 20 20  r->aSeg);.      
144b0 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b  if( i==1 ) break
144c0 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20  ;..      pOther 
144d0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
144e0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20  pIter->aFirst[i 
144f0 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74  ^ 0x0001].iFirst
14500 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   ];.    }.  }.. 
14510 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
14520 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 49 74 65  .** Set the pIte
14530 72 2d 3e 62 45 6f 66 20 76 61 72 69 61 62 6c 65  r->bEof variable
14540 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 74   based on the st
14550 61 74 65 20 6f 66 20 74 68 65 20 73 75 62 2d 69  ate of the sub-i
14560 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61  terators..*/.sta
14570 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
14580 74 69 49 74 65 72 53 65 74 45 6f 66 28 46 74 73  tiIterSetEof(Fts
14590 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
145a0 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  r){.  Fts5SegIte
145b0 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
145c0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
145d0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
145e0 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  ];.  pIter->bEof
145f0 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d   = pSeg->pLeaf==
14600 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69 53 77 69  0;.  pIter->iSwi
14610 74 63 68 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  tchRowid = pSeg-
14620 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  >iRowid;.}../*.*
14630 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
14640 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
14650 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  entry. .**.** If
14660 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
14670 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
14680 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49  is left in Fts5I
14690 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73 20 6e  ndex.rc. It is n
146a0 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  ot .** considere
146b0 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
146c0 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68  e iterator reach
146d0 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20 69 74  es EOF, or if it
146e0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 0a   is already at .
146f0 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  ** EOF when this
14700 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
14710 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
14720 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
14730 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64  rNext(.  Fts5Ind
14740 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 6e  ex *p, .  Fts5In
14750 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 0a  dexIter *pIter,.
14760 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20    int bFrom,    
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14780 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67    /* True if arg
14790 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76  ument iFrom is v
147a0 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46  alid */.  i64 iF
147b0 72 6f 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  rom             
147c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76            /* Adv
147d0 61 6e 63 65 20 61 74 20 6c 65 61 73 74 20 61 73  ance at least as
147e0 20 66 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a   far as this */.
147f0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
14800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14810 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d 20   int bUseFrom = 
14820 62 46 72 6f 6d 3b 0a 20 20 20 20 64 6f 20 7b 0a  bFrom;.    do {.
14830 20 20 20 20 20 20 69 6e 74 20 69 46 69 72 73 74        int iFirst
14840 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
14850 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20  [1].iFirst;.    
14860 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
14870 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65   0;.      Fts5Se
14880 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
14890 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73  Iter->aSeg[iFirs
148a0 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t];.      assert
148b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
148c0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
148d0 62 55 73 65 46 72 6f 6d 20 26 26 20 70 53 65 67  bUseFrom && pSeg
148e0 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ->pDlidx ){.    
148f0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
14900 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c  extFrom(p, pSeg,
14910 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 7d   iFrom);.      }
14920 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
14930 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
14940 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d   pSeg, &bNewTerm
14950 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
14960 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
14970 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d  f==0 || bNewTerm
14980 20 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35   .       || fts5
14990 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
149a0 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 2c 20  Rowid(p, pIter, 
149b0 69 46 69 72 73 74 29 0a 20 20 20 20 20 20 29 7b  iFirst).      ){
149c0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
149d0 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70  tiIterAdvanced(p
149e0 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c  , pIter, iFirst,
149f0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   1);.        fts
14a00 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66  5MultiIterSetEof
14a10 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  (pIter);.      }
14a20 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
14a30 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
14a40 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20  p, pIter);..    
14a50 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a    bUseFrom = 0;.
14a60 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65      }while( pIte
14a70 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26  r->bSkipEmpty &&
14a80 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
14a90 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20  Empty(p, pIter) 
14aa0 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
14ab0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
14ac0 74 65 72 4e 65 78 74 32 28 0a 20 20 46 74 73 35  terNext2(.  Fts5
14ad0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
14ae0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
14af0 72 2c 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54  r,.  int *pbNewT
14b00 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
14b10 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75       /* OUT: Tru
14b20 65 20 69 66 20 2a 6d 69 67 68 74 2a 20 62 65 20  e if *might* be 
14b30 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20  new term */.){. 
14b40 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14b50 62 53 6b 69 70 45 6d 70 74 79 20 29 3b 0a 20 20  bSkipEmpty );.  
14b60 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 6f 20 7b  E_OK ){.    do {
14b80 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69 72 73  .      int iFirs
14b90 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  t = pIter->aFirs
14ba0 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20  t[1].iFirst;.   
14bb0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
14bc0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
14bd0 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20  Seg[iFirst];.   
14be0 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20     int bNewTerm 
14bf0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66 74 73 35  = 0;..      fts5
14c00 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70  SegIterNext(p, p
14c10 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b  Seg, &bNewTerm);
14c20 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d  .      if( pSeg-
14c30 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65  >pLeaf==0 || bNe
14c40 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c  wTerm .       ||
14c50 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
14c60 76 61 6e 63 65 52 6f 77 69 64 28 70 2c 20 70 49  vanceRowid(p, pI
14c70 74 65 72 2c 20 69 46 69 72 73 74 29 0a 20 20 20  ter, iFirst).   
14c80 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74     ){.        ft
14c90 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
14ca0 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46  ced(p, pIter, iF
14cb0 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  irst, 1);.      
14cc0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53    fts5MultiIterS
14cd0 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20  etEof(pIter);.  
14ce0 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d        *pbNewTerm
14cf0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
14d00 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65  e{.        *pbNe
14d10 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20  wTerm = 0;.     
14d20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73 73   }.      fts5Ass
14d30 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
14d40 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  p(p, pIter);..  
14d50 20 20 7d 77 68 69 6c 65 28 20 66 74 73 35 4d 75    }while( fts5Mu
14d60 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
14d70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a  , pIter) );.  }.
14d80 7d 0a 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49  }...static Fts5I
14d90 6e 64 65 78 49 74 65 72 20 2a 66 74 73 35 4d 75  ndexIter *fts5Mu
14da0 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20  ltiIterAlloc(.  
14db0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dd0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
14de0 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
14df0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a  n */.  int nSeg.
14e00 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  ){.  Fts5IndexIt
14e10 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  er *pNew;.  int 
14e20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
14e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
14e40 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e  ower of two >= n
14e50 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53  Seg */..  for(nS
14e60 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65  lot=2; nSlot<nSe
14e70 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32  g; nSlot=nSlot*2
14e80 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35  );.  pNew = fts5
14e90 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20  IdxMalloc(p, .  
14ea0 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49      sizeof(Fts5I
14eb0 6e 64 65 78 49 74 65 72 29 20 2b 20 20 20 20 20  ndexIter) +     
14ec0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20          /* pNew 
14ed0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14ee0 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 28  Fts5SegIter) * (
14ef0 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20  nSlot-1) +   /* 
14f00 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a  pNew->aSeg[] */.
14f10 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
14f20 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f  5CResult) * nSlo
14f30 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65  t         /* pNe
14f40 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20  w->aFirst[] */. 
14f50 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29   );.  if( pNew )
14f60 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67  {.    pNew->nSeg
14f70 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e   = nSlot;.    pN
14f80 65 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74  ew->aFirst = (Ft
14f90 73 35 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77  s5CResult*)&pNew
14fa0 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20  ->aSeg[nSlot];. 
14fb0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20     pNew->pIndex 
14fc0 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = p;.  }.  retur
14fd0 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
14fe0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
14ff0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 6f 62  Fts5IndexIter ob
15000 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
15010 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  new object will 
15020 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
15030 74 65 20 74 68 72 6f 75 67 68 20 64 61 74 61 20  te through data 
15040 69 6e 20 73 74 72 75 63 74 75 72 65 20 70 53 74  in structure pSt
15050 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76  ruct..** If iLev
15060 65 6c 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20  el is -ve, then 
15070 61 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20  all data in all 
15080 73 65 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67  segments is merg
15090 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65  ed. Or, if iLeve
150a0 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20  l.** is zero or 
150b0 67 72 65 61 74 65 72 2c 20 64 61 74 61 20 66 72  greater, data fr
150c0 6f 6d 20 74 68 65 20 66 69 72 73 74 20 6e 53 65  om the first nSe
150d0 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f  gment segments o
150e0 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a  n level iLevel.*
150f0 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a  * is merged..**.
15100 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
15110 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73  initially points
15120 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 74 65   to the first te
15130 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69  rm/rowid entry i
15140 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  n the .** iterat
15150 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
15160 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
15170 69 49 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35  iIterNew(.  Fts5
15180 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
15190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
151a0 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
151b0 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
151c0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
151d0 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20 20   *pStruct,      
151e0 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20     /* Structure 
151f0 6f 66 20 73 70 65 63 69 66 69 63 20 69 6e 64 65  of specific inde
15200 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  x */.  int bSkip
15210 45 6d 70 74 79 2c 20 20 20 20 20 20 20 20 20 20  Empty,          
15220 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
15230 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d  o ignore delete-
15240 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  keys */.  int fl
15250 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
15260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
15270 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58  5INDEX_QUERY_XXX
15280 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
15290 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
152a0 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
152b0 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28  erm to seek to (
152c0 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20  or NULL/0) */.  
152d0 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72  /* Level to iter
15300 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29  ate (-1 for all)
15310 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
15320 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
15330 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15340 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d  of segments to m
15350 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29  erge (iLevel>=0)
15360 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
15370 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
15380 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
15390 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
153a0 6e 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  nSeg = 0;       
153b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
153c0 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
153d0 2d 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f  -iters in use */
153e0 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30  .  int iIter = 0
153f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15400 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69     /* */.  int i
15410 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
15420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
15430 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
15440 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a  rough segments *
15450 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
15460 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  uf = {0,0,0};   
15470 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
15480 65 64 20 62 79 20 66 74 73 35 53 65 67 49 74 65  ed by fts5SegIte
15490 72 53 65 65 6b 49 6e 69 74 28 29 20 2a 2f 0a 20  rSeekInit() */. 
154a0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
154b0 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73  vel *pLvl;.  Fts
154c0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77  5IndexIter *pNew
154d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  ;..  assert( (pT
154e0 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d  erm==0 && nTerm=
154f0 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20  =0) || iLevel<0 
15500 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
15510 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
15520 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74  new multi-seg-it
15530 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28  erator. */.  if(
15540 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15550 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65  K ){.    if( iLe
15560 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  vel<0 ){.      a
15570 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
15580 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74  nSegment==fts5St
15590 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
155a0 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b  ents(pStruct) );
155b0 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53  .      nSeg = pS
155c0 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
155d0 0a 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28  .      nSeg += (
155e0 70 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30  p->pHash ? 1 : 0
155f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15600 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70      nSeg = MIN(p
15610 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
15620 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65  Level].nSeg, nSe
15630 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  gment);.    }.  
15640 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65  }.  *ppOut = pNe
15650 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  w = fts5MultiIte
15660 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b  rAlloc(p, nSeg);
15670 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
15680 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d   return;.  pNew-
15690 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61  >bRev = (0!=(fla
156a0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
156b0 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70  UERY_DESC));.  p
156c0 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
156d0 3d 20 28 75 38 29 62 53 6b 69 70 45 6d 70 74 79  = (u8)bSkipEmpty
156e0 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 74 72 75 63  ;.  pNew->pStruc
156f0 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 66  t = pStruct;.  f
15700 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
15710 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 2f 2a 20  pStruct);..  /* 
15720 49 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20  Initialize each 
15730 6f 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74  of the component
15740 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
15750 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65  rs. */.  if( iLe
15760 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 46 74 73  vel<0 ){.    Fts
15770 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
15780 2a 70 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74  *pEnd = &pStruct
15790 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74  ->aLevel[pStruct
157a0 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 69  ->nLevel];.    i
157b0 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20  f( p->pHash ){. 
157c0 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65       /* Add a se
157d0 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 66  gment iterator f
157e0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  or the current c
157f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68  ontents of the h
15800 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ash table. */.  
15810 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
15820 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
15830 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20  aSeg[iIter++];. 
15840 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
15850 48 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72  HashInit(p, pTer
15860 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
15870 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
15880 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74     for(pLvl=&pSt
15890 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b  ruct->aLevel[0];
158a0 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c   pLvl<pEnd; pLvl
158b0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
158c0 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31  Seg=pLvl->nSeg-1
158d0 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
158e0 2d 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  -){.        Fts5
158f0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
15900 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
15910 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
15920 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
15930 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
15940 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20  aSeg[iIter++];. 
15950 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
15960 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15970 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
15980 28 70 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  (p, pSeg, pIter)
15990 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
159a0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
159b0 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70  egIterSeekInit(p
159c0 2c 20 26 62 75 66 2c 20 70 54 65 72 6d 2c 20 6e  , &buf, pTerm, n
159d0 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65  Term, flags, pSe
159e0 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  g, pIter);.     
159f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15a00 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
15a10 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
15a20 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b  >aLevel[iLevel];
15a30 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53  .    for(iSeg=nS
15a40 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
15a50 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74  Seg--){.      ft
15a60 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c  s5SegIterInit(p,
15a70 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
15a80 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  g], &pNew->aSeg[
15a90 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d  iIter++]);.    }
15aa0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
15ab0 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20  Iter==nSeg );.. 
15ac0 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
15ad0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
15ae0 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
15af0 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f  iterators now po
15b00 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68  ints .  ** to th
15b10 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
15b20 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e   its segment. In
15b30 20 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69   this case initi
15b40 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20  alize the .  ** 
15b50 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20  aFirst[] array. 
15b60 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
15b70 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72  has occurred, fr
15b80 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  ee the iterator.
15b90 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20    ** object and 
15ba0 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  set the output v
15bb0 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e  ariable to NULL.
15bc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
15bd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15be0 20 20 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65     for(iIter=pNe
15bf0 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72  w->nSeg-1; iIter
15c00 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20  >0; iIter--){.  
15c10 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20      int iEq;.   
15c20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
15c30 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
15c40 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72  pare(pNew, iIter
15c50 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  )) ){.        ft
15c60 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
15c70 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71   &pNew->aSeg[iEq
15c80 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  ], 0);.        f
15c90 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
15ca0 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45  nced(p, pNew, iE
15cb0 71 2c 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20  q, iIter);.     
15cc0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73   }.    }.    fts
15cd0 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66  5MultiIterSetEof
15ce0 28 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35  (pNew);.    fts5
15cf0 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
15d00 65 74 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a  etup(p, pNew);..
15d10 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53      if( pNew->bS
15d20 6b 69 70 45 6d 70 74 79 20 26 26 20 66 74 73 35  kipEmpty && fts5
15d30 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79  MultiIterIsEmpty
15d40 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20  (p, pNew) ){.   
15d50 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
15d60 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c  Next(p, pNew, 0,
15d70 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
15d80 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  se{.    fts5Mult
15d90 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65  iIterFree(p, pNe
15da0 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d  w);.    *ppOut =
15db0 20 30 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75   0;.  }.  fts5Bu
15dc0 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
15dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
15de0 61 6e 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  an Fts5IndexIter
15df0 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 74   that iterates t
15e00 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69  hrough the docli
15e10 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61  st provided.** a
15e20 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
15e30 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
15e40 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
15e50 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49  terNew2(.  Fts5I
15e60 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
15e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
15e80 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
15e90 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
15ea0 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
15eb0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
15ec0 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20    /* Doclist to 
15ed0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
15ee0 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20  */.  int bDesc, 
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
15f10 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
15f20 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73  d order */.  Fts
15f30 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 4f  5IndexIter **ppO
15f40 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ut           /* 
15f50 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  New object */.){
15f60 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
15f70 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
15f80 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c   fts5MultiIterAl
15f90 6c 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69 66 28  loc(p, 2);.  if(
15fa0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73   pNew ){.    Fts
15fb0 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
15fc0 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d  = &pNew->aSeg[1]
15fd0 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 62 46 69  ;..    pNew->bFi
15fe0 6c 74 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  ltered = 1;.    
15ff0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46  pIter->flags = F
16000 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
16010 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61  ERM;.    if( pDa
16020 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a  ta->szLeaf>0 ){.
16030 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
16040 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  af = pData;.    
16050 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
16060 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
16070 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28  rint(pData->p, (
16080 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
16090 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65  wid);.      pIte
160a0 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
160b0 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20   = pData->nn;.  
160c0 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
160d0 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a  [1].iFirst = 1;.
160e0 20 20 20 20 20 20 69 66 28 20 62 44 65 73 63 20        if( bDesc 
160f0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
16100 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20  >bRev = 1;.     
16110 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
16120 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
16130 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20  REVERSE;.       
16140 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
16150 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
16160 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
16170 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
16180 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
16190 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
161a0 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d   }.      pData =
161b0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
161c0 20 20 20 20 20 70 4e 65 77 2d 3e 62 45 6f 66 20       pNew->bEof 
161d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
161e0 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20  *ppOut = pNew;. 
161f0 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
16200 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a  lease(pData);.}.
16210 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
16220 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
16230 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20  or is at EOF or 
16240 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
16250 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61  occurred. .** Fa
16260 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
16270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
16280 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74  5MultiIterEof(Ft
16290 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
162a0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
162b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
162c0 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 49  rc .      || (pI
162d0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
162e0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
162f0 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d  st ].pLeaf==0)==
16300 70 49 74 65 72 2d 3e 62 45 6f 66 20 0a 20 20 29  pIter->bEof .  )
16310 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
16320 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66  c || pIter->bEof
16330 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
16340 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  rn the rowid of 
16350 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
16360 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
16370 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  ently points.** 
16380 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61  to. If the itera
16390 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
163a0 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
163b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
163c0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72  he.** results ar
163d0 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  e undefined..*/.
163e0 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d  static i64 fts5M
163f0 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74  ultiIterRowid(Ft
16400 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
16410 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
16420 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
16430 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
16440 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20  rst ].pLeaf );. 
16450 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
16460 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
16470 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69  st[1].iFirst ].i
16480 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
16490 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
164a0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
164b0 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77  try at or follow
164c0 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73  ing iMatch..*/.s
164d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
164e0 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
164f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16500 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  , .  Fts5IndexIt
16510 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36  er *pIter, .  i6
16520 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68  4 iMatch.){.  wh
16530 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
16540 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74  4 iRowid;.    ft
16550 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
16560 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61  p, pIter, 1, iMa
16570 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74  tch);.    if( ft
16580 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
16590 2c 20 70 49 74 65 72 29 20 29 20 62 72 65 61 6b  , pIter) ) break
165a0 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66  ;.    iRowid = f
165b0 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
165c0 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  d(pIter);.    if
165d0 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30  ( pIter->bRev==0
165e0 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74   && iRowid>=iMat
165f0 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
16600 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21  if( pIter->bRev!
16610 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d  =0 && iRowid<=iM
16620 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
16630 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
16640 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
16650 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
16660 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f  ng the term asso
16670 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
16680 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74  .** entry that t
16690 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
166a0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
166b0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
166c0 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74   u8 *fts5MultiIt
166d0 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  erTerm(Fts5Index
166e0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
166f0 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67   *pn){.  Fts5Seg
16700 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72  Iter *p = &pIter
16710 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
16720 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
16730 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65  ];.  *pn = p->te
16740 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70  rm.n;.  return p
16750 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 73 74 61  ->term.p;.}..sta
16760 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
16770 6e 6b 49 74 65 72 61 74 65 28 0a 20 20 46 74 73  nkIterate(.  Fts
16780 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
167a0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  Index object */.
167b0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
167c0 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
167d0 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20    /* Poslist of 
167e0 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f  this iterator */
167f0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f     /* Context po
16820 69 6e 74 65 72 20 66 6f 72 20 78 43 68 75 6e 6b  inter for xChunk
16830 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76   callback */.  v
16840 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29 28 46 74  oid (*xChunk)(Ft
16850 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c  s5Index*, void*,
16860 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29   const u8*, int)
16870 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d  .){.  int nRem =
16880 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20   pSeg->nPos;    
16890 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
168a0 6f 66 20 62 79 74 65 73 20 73 74 69 6c 6c 20 74  of bytes still t
168b0 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35  o come */.  Fts5
168c0 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 30 3b  Data *pData = 0;
168d0 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20  .  u8 *pChunk = 
168e0 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
168f0 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
16900 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b  t];.  int nChunk
16910 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65   = MIN(nRem, pSe
16920 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  g->pLeaf->szLeaf
16930 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66   - pSeg->iLeafOf
16940 66 73 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e  fset);.  int pgn
16950 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50  o = pSeg->iLeafP
16960 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53  gno;.  int pgnoS
16970 61 76 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  ave = 0;..  /* T
16980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
16990 73 20 6e 6f 74 6d 77 6f 72 6b 20 77 69 74 68 20  s notmwork with 
169a0 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 64 61 74 61  detail=none data
169b0 62 61 73 65 73 2e 20 2a 2f 0a 20 20 61 73 73 65  bases. */.  asse
169c0 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  rt( p->pConfig->
169d0 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45  eDetail!=FTS5_DE
169e0 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20  TAIL_NONE );..  
169f0 69 66 28 20 28 70 53 65 67 2d 3e 66 6c 61 67 73  if( (pSeg->flags
16a00 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
16a10 52 45 56 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20  REVERSE)==0 ){. 
16a20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d 20 70 67     pgnoSave = pg
16a30 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  no+1;.  }..  whi
16a40 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 78 43 68  le( 1 ){.    xCh
16a50 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70 43 68  unk(p, pCtx, pCh
16a60 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20  unk, nChunk);.  
16a70 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b    nRem -= nChunk
16a80 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
16a90 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20  lease(pData);.  
16aa0 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b    if( nRem<=0 ){
16ab0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
16ad0 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61  gno++;.      pDa
16ae0 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
16af0 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
16b00 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 70 53  T_ROWID(pSeg->pS
16b10 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f  eg->iSegid, pgno
16b20 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  ));.      if( pD
16b30 61 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ata==0 ) break;.
16b40 20 20 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 26        pChunk = &
16b50 70 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20  pData->p[4];.   
16b60 20 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28     nChunk = MIN(
16b70 6e 52 65 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c  nRem, pData->szL
16b80 65 61 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  eaf - 4);.      
16b90 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61  if( pgno==pgnoSa
16ba0 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ve ){.        as
16bb0 73 65 72 74 28 20 70 53 65 67 2d 3e 70 4e 65 78  sert( pSeg->pNex
16bc0 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20  tLeaf==0 );.    
16bd0 20 20 20 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c      pSeg->pNextL
16be0 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  eaf = pData;.   
16bf0 20 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a       pData = 0;.
16c00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16c10 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  }.}..../*.** All
16c20 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d  ocate a new segm
16c30 65 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73  ent-id for the s
16c40 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
16c50 2e 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  . The new segmen
16c60 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62 65 20  t.** id must be 
16c70 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 36 35  between 1 and 65
16c80 33 33 35 20 69 6e 63 6c 75 73 69 76 65 2c 20 61  335 inclusive, a
16c90 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75  nd must not be u
16ca0 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20 63  sed by .** any c
16cb0 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 69 6e  urrently existin
16cc0 67 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 61 20  g segment. If a 
16cd0 66 72 65 65 20 73 65 67 6d 65 6e 74 20 69 64 20  free segment id 
16ce0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
16cf0 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
16d00 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
16d10 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  ** If an error h
16d20 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
16d30 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
16d40 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 30  on is a no-op. 0
16d50 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
16d60 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
16d70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
16d80 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 46  5AllocateSegid(F
16d90 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
16da0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
16db0 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 53 65 67  uct){.  int iSeg
16dc0 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  id = 0;..  if( p
16dd0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16de0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  ){.    if( pStru
16df0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46 54  ct->nSegment>=FT
16e00 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29  S5_MAX_SEGMENT )
16e10 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
16e20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
16e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68   }else{.      wh
16e40 69 6c 65 28 20 69 53 65 67 69 64 3d 3d 30 20 29  ile( iSegid==0 )
16e50 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  {.        int iL
16e60 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
16e70 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
16e80 6e 65 73 73 28 73 69 7a 65 6f 66 28 75 33 32 29  ness(sizeof(u32)
16e90 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64  , (void*)&iSegid
16ea0 29 3b 0a 20 20 20 20 20 20 20 20 69 53 65 67 69  );.        iSegi
16eb0 64 20 3d 20 69 53 65 67 69 64 20 26 20 28 28 31  d = iSegid & ((1
16ec0 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44   << FTS5_DATA_ID
16ed0 5f 42 29 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  _B)-1);.        
16ee0 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
16ef0 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
16f00 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
16f10 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
16f20 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
16f30 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
16f40 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
16f50 20 20 20 20 20 20 20 69 66 28 20 69 53 65 67 69         if( iSegi
16f60 64 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  d==pStruct->aLev
16f70 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
16f80 65 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20  eg].iSegid ){.  
16f90 20 20 20 20 20 20 20 20 20 20 20 20 69 53 65 67              iSeg
16fa0 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  id = 0;.        
16fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16fc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
16fd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16fe0 20 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a   return iSegid;.
16ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
17000 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e   all data curren
17010 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74 68  tly cached in th
17020 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a  e hash-tables..*
17030 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
17040 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61  s5IndexDiscardDa
17050 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ta(Fts5Index *p)
17060 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
17070 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64  Hash || p->nPend
17080 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  ingData==0 );.  
17090 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a  if( p->pHash ){.
170a0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
170b0 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73  ashClear(p->pHas
170c0 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64  h);.    p->nPend
170d0 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d  ingData = 0;.  }
170e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
170f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
17100 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65   prefix, in byte
17110 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 28  s, that buffer (
17120 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72 65  nNew/pNew) share
17130 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65 72  s.** with buffer
17140 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f   (nOld/pOld)..*/
17150 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
17160 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a  PrefixCompress(.
17170 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73    int nOld, cons
17180 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e  t u8 *pOld,.  in
17190 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75 38  t nNew, const u8
171a0 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20   *pNew.){.  int 
171b0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74 73  i;.  assert( fts
171c0 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4f 6c  5BlobCompare(pOl
171d0 64 2c 20 6e 4f 6c 64 2c 20 70 4e 65 77 2c 20 6e  d, nOld, pNew, n
171e0 4e 65 77 29 3c 30 20 29 3b 0a 20 20 66 6f 72 28  New)<0 );.  for(
171f0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
17200 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b  ){.    if( pOld[
17210 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72  i]!=pNew[i] ) br
17220 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
17230 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n i;.}..static v
17240 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69  oid fts5WriteDli
17250 64 78 43 6c 65 61 72 28 0a 20 20 46 74 73 35 49  dxClear(.  Fts5I
17260 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
17270 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
17280 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75 73 68  er,.  int bFlush
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
172b0 2c 20 77 72 69 74 65 20 64 6c 69 64 78 20 74 6f  , write dlidx to
172c0 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e   disk */.){.  in
172d0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 62  t i;.  assert( b
172e0 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70 57 72  Flush==0 || (pWr
172f0 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26  iter->nDlidx>0 &
17300 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
17310 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20 29 3b  x[0].buf.n>0) );
17320 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
17330 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69  riter->nDlidx; i
17340 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  ++){.    Fts5Dli
17350 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78  dxWriter *pDlidx
17360 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
17370 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  idx[i];.    if( 
17380 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30  pDlidx->buf.n==0
17390 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
173a0 28 20 62 46 6c 75 73 68 20 29 7b 0a 20 20 20 20  ( bFlush ){.    
173b0 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
173c0 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ->pgno!=0 );.   
173d0 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
173e0 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
173f0 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
17400 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
17410 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f   i, pDlidx->pgno
17420 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c  ),.          pDl
17430 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69  idx->buf.p, pDli
17440 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20  dx->buf.n.      
17450 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
17460 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65  ite3Fts5BufferZe
17470 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29  ro(&pDlidx->buf)
17480 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50  ;.    pDlidx->bP
17490 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  revValid = 0;.  
174a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20  }.}../*.** Grow 
174b0 74 68 65 20 70 57 72 69 74 65 72 2d 3e 61 44 6c  the pWriter->aDl
174c0 69 64 78 5b 5d 20 61 72 72 61 79 20 74 6f 20 61  idx[] array to a
174d0 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65 6c 65  t least nLvl ele
174e0 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  ments in size..*
174f0 2a 20 41 6e 79 20 6e 65 77 20 61 72 72 61 79 20  * Any new array 
17500 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a 65 72  elements are zer
17510 6f 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  oed before retur
17520 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
17530 69 6e 74 20 66 74 73 35 57 72 69 74 65 44 6c 69  int fts5WriteDli
17540 64 78 47 72 6f 77 28 0a 20 20 46 74 73 35 49 6e  dxGrow(.  Fts5In
17550 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65  dex *p,.  Fts5Se
17560 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
17570 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a  ,.  int nLvl.){.
17580 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
17590 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d  ITE_OK && nLvl>=
175a0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20  pWriter->nDlidx 
175b0 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  ){.    Fts5Dlidx
175c0 57 72 69 74 65 72 20 2a 61 44 6c 69 64 78 20 3d  Writer *aDlidx =
175d0 20 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65   (Fts5DlidxWrite
175e0 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
175f0 6f 63 28 0a 20 20 20 20 20 20 20 20 70 57 72 69  oc(.        pWri
17600 74 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a  ter->aDlidx, siz
17610 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69  eof(Fts5DlidxWri
17620 74 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20  ter) * nLvl.    
17630 29 3b 0a 20 20 20 20 69 66 28 20 61 44 6c 69 64  );.    if( aDlid
17640 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  x==0 ){.      p-
17650 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
17660 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
17670 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
17680 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
17690 78 57 72 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c  xWriter) * (nLvl
176a0 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69   - pWriter->nDli
176b0 64 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  dx);.      memse
176c0 74 28 26 61 44 6c 69 64 78 5b 70 57 72 69 74 65  t(&aDlidx[pWrite
176d0 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e  r->nDlidx], 0, n
176e0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 57 72  Byte);.      pWr
176f0 69 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61  iter->aDlidx = a
17700 44 6c 69 64 78 3b 0a 20 20 20 20 20 20 70 57 72  Dlidx;.      pWr
17710 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e  iter->nDlidx = n
17720 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Lvl;.    }.  }. 
17730 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d   return p->rc;.}
17740 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ../*.** If the c
17750 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69  urrent doclist-i
17760 6e 64 65 78 20 61 63 63 75 6d 75 6c 61 74 69 6e  ndex accumulatin
17770 67 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 44  g in pWriter->aD
17780 6c 69 64 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a  lidx[] is large.
17790 2a 2a 20 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68  ** enough, flush
177a0 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20   it to disk and 
177b0 72 65 74 75 72 6e 20 31 2e 20 4f 74 68 65 72 77  return 1. Otherw
177c0 69 73 65 20 64 69 73 63 61 72 64 20 69 74 20 61  ise discard it a
177d0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72  nd return.** zer
177e0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
177f0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44   fts5WriteFlushD
17800 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  lidx(Fts5Index *
17810 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72  p, Fts5SegWriter
17820 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e   *pWriter){.  in
17830 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20  t bFlag = 0;..  
17840 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65  /* If there were
17850 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f   FTS5_MIN_DLIDX_
17860 53 49 5a 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70  SIZE or more emp
17870 74 79 20 6c 65 61 66 20 70 61 67 65 73 20 77 72  ty leaf pages wr
17880 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
17890 65 20 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f  e database, also
178a0 20 77 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69   write the docli
178b0 73 74 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b  st-index to disk
178c0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69  .  */.  if( pWri
178d0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
178e0 75 66 2e 6e 3e 30 20 26 26 20 70 57 72 69 74 65  uf.n>0 && pWrite
178f0 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f  r->nEmpty>=FTS5_
17900 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29  MIN_DLIDX_SIZE )
17910 7b 0a 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b  {.    bFlag = 1;
17920 0a 20 20 7d 0a 20 20 66 74 73 35 57 72 69 74 65  .  }.  fts5Write
17930 44 6c 69 64 78 43 6c 65 61 72 28 70 2c 20 70 57  DlidxClear(p, pW
17940 72 69 74 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20  riter, bFlag);. 
17950 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
17960 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 62   = 0;.  return b
17970 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Flag;.}../*.** T
17980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17990 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
179a0 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
179b0 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  e doclist for th
179c0 65 20 0a 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20  e .** last term 
179d0 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 28 70 57  on leaf page (pW
179e0 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 29 20  riter->iBtPage) 
179f0 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a  is completed. .*
17a00 2a 0a 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73 74  *.** The doclist
17a10 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20  -index for that 
17a20 74 65 72 6d 20 69 73 20 63 75 72 72 65 6e 74 6c  term is currentl
17a30 79 20 73 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f  y stored in-memo
17a40 72 79 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ry within the.**
17a50 20 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 61   Fts5SegWriter.a
17a60 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 2e 20 49  Dlidx[] array. I
17a70 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e  f it is large en
17a80 6f 75 67 68 2c 20 74 68 69 73 20 66 75 6e 63 74  ough, this funct
17a90 69 6f 6e 0a 2a 2a 20 77 72 69 74 65 73 20 69 74  ion.** writes it
17aa0 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72   out to disk. Or
17ab0 2c 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 73  , if it is too s
17ac0 6d 61 6c 6c 20 74 6f 20 62 6f 74 68 65 72 20 77  mall to bother w
17ad0 69 74 68 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a  ith, discards.**
17ae0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53   it..**.** Fts5S
17af0 65 67 57 72 69 74 65 72 2e 62 74 74 65 72 6d 20  egWriter.btterm 
17b00 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
17b10 6e 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ns the first ter
17b20 6d 20 6f 6e 20 70 61 67 65 20 69 42 74 50 61 67  m on page iBtPag
17b30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
17b40 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68  d fts5WriteFlush
17b50 42 74 72 65 65 28 46 74 73 35 49 6e 64 65 78 20  Btree(Fts5Index 
17b60 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
17b70 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69  r *pWriter){.  i
17b80 6e 74 20 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73  nt bFlag;..  ass
17b90 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 69 42  ert( pWriter->iB
17ba0 74 50 61 67 65 20 7c 7c 20 70 57 72 69 74 65 72  tPage || pWriter
17bb0 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20  ->nEmpty==0 );. 
17bc0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 69 42   if( pWriter->iB
17bd0 74 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  tPage==0 ) retur
17be0 6e 3b 0a 20 20 62 46 6c 61 67 20 3d 20 66 74 73  n;.  bFlag = fts
17bf0 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78  5WriteFlushDlidx
17c00 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20  (p, pWriter);.. 
17c10 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
17c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
17c30 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 70 57  st char *z = (pW
17c40 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e  riter->btterm.n>
17c50 30 3f 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  0?(const char*)p
17c60 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70  Writer->btterm.p
17c70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  :"");.    /* The
17c80 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61   following was a
17c90 6c 72 65 61 64 79 20 64 6f 6e 65 20 69 6e 20 66  lready done in f
17ca0 74 73 35 57 72 69 74 65 49 6e 69 74 28 29 3a 20  ts5WriteInit(): 
17cb0 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  */.    /* sqlite
17cc0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49  3_bind_int(p->pI
17cd0 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72  dxWriter, 1, pWr
17ce0 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a  iter->iSegid); *
17cf0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  /.    sqlite3_bi
17d00 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57  nd_blob(p->pIdxW
17d10 72 69 74 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72  riter, 2, z, pWr
17d20 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20  iter->btterm.n, 
17d30 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
17d40 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
17d50 5f 69 6e 74 36 34 28 70 2d 3e 70 49 64 78 57 72  _int64(p->pIdxWr
17d60 69 74 65 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b  iter, 3, bFlag +
17d70 20 28 28 69 36 34 29 70 57 72 69 74 65 72 2d 3e   ((i64)pWriter->
17d80 69 42 74 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20  iBtPage<<1));.  
17d90 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
17da0 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20  ->pIdxWriter);. 
17db0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
17dc0 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78  e3_reset(p->pIdx
17dd0 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 70  Writer);.  }.  p
17de0 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20  Writer->iBtPage 
17df0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
17e00 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  is is called onc
17e10 65 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20  e for each leaf 
17e20 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20  page except the 
17e30 66 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61  first that conta
17e40 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20  ins.** at least 
17e50 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65  one term. Argume
17e60 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29  nt (nTerm/pTerm)
17e70 20 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65   is the split-ke
17e80 79 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a  y - a term that.
17e90 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ** is larger tha
17ea0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74  n all terms writ
17eb0 74 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c  ten to earlier l
17ec0 65 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c  eaves, and equal
17ed0 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65   to or.** smalle
17ee0 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74  r than the first
17ef0 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77   term on the new
17f00 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   leaf..**.** If 
17f10 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
17f20 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
17f30 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e  s left in Fts5In
17f40 64 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72  dex.rc. If an er
17f50 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  ror.** has alrea
17f60 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
17f70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
17f80 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
17f90 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
17fa0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
17fb0 65 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74  eBtreeTerm(.  Ft
17fc0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17fe0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
17ff0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
18000 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
18010 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
18020 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
18030 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74  int nTerm, const
18040 20 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20   u8 *pTerm      
18050 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e  /* First term on
18060 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a   new page */.){.
18070 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
18080 42 74 72 65 65 28 70 2c 20 70 57 72 69 74 65 72  Btree(p, pWriter
18090 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  );.  fts5BufferS
180a0 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  et(&p->rc, &pWri
180b0 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e 54 65  ter->btterm, nTe
180c0 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57  rm, pTerm);.  pW
180d0 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d  riter->iBtPage =
180e0 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
180f0 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  .pgno;.}../*.** 
18100 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
18110 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75   called when flu
18120 73 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61 67  shing a leaf pag
18130 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
18140 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20 61  no.** terms at a
18150 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ll to disk..*/.s
18160 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
18170 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28  riteBtreeNoTerm(
18180 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
181b0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
181c0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
181d0 72 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  riter          /
181e0 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
181f0 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68  */.){.  /* If th
18200 65 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77 69  ere were no rowi
18210 64 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70  ds on the leaf p
18220 61 67 65 20 65 69 74 68 65 72 20 61 6e 64 20 74  age either and t
18230 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
18240 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  .  ** has alread
18250 79 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c 20  y been started, 
18260 61 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62  append an 0x00 b
18270 79 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20  yte to it.  */. 
18280 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
18290 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
182a0 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  && pWriter->aDli
182b0 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b  dx[0].buf.n>0 ){
182c0 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
182d0 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26  iter *pDlidx = &
182e0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
182f0 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0];.    assert( 
18300 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
18310 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  id );.    sqlite
18320 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
18330 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
18340 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29  &pDlidx->buf, 0)
18350 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
18360 65 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62 65  ement the "numbe
18370 72 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c 20  r of sequential 
18380 6c 65 61 76 65 73 20 77 69 74 68 6f 75 74 20 61  leaves without a
18390 20 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20   term" counter. 
183a0 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45  */.  pWriter->nE
183b0 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69  mpty++;.}..stati
183c0 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 45  c i64 fts5DlidxE
183d0 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64  xtractFirstRowid
183e0 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75  (Fts5Buffer *pBu
183f0 66 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  f){.  i64 iRowid
18400 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20  ;.  int iOff;.. 
18410 20 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73 35   iOff = 1 + fts5
18420 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  GetVarint(&pBuf-
18430 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52  >p[1], (u64*)&iR
18440 6f 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65 74  owid);.  fts5Get
18450 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
18460 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52  iOff], (u64*)&iR
18470 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  owid);.  return 
18480 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iRowid;.}../*.**
18490 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61   Rowid iRowid ha
184a0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65  s just been appe
184b0 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
184c0 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 49  ent leaf page. I
184d0 74 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  t is the.** firs
184e0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 54  t on the page. T
184f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
18500 65 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72 69  ends an appropri
18510 61 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  ate entry to the
18520 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c   current.** docl
18530 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ist-index..*/.st
18540 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
18550 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a  iteDlidxAppend(.
18560 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
18570 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
18580 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36   *pWriter, .  i6
18590 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e  4 iRowid.){.  in
185a0 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65  t i;.  int bDone
185b0 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
185c0 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
185d0 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20  OK && bDone==0; 
185e0 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 56  i++){.    i64 iV
185f0 61 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  al;.    Fts5Dlid
18600 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
18610 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
18620 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20  dx[i];..    if( 
18630 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70  pDlidx->buf.n>=p
18640 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
18650 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
18660 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d  current doclist-
18670 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 66 75  index page is fu
18680 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20  ll. Write it to 
18690 64 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20 20  disk and push.  
186a0 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66      ** a copy of
186b0 20 69 52 6f 77 69 64 20 28 77 68 69 63 68 20 77   iRowid (which w
186c0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 66  ill become the f
186d0 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  irst rowid on th
186e0 65 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20  e next.      ** 
186f0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65  doclist-index le
18700 61 66 20 70 61 67 65 29 20 75 70 20 69 6e 74 6f  af page) up into
18710 20 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 20   the next level 
18720 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a 20  of the b-tree . 
18730 20 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63 68       ** hierarch
18740 79 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62  y. If the node b
18750 65 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73 20  eing flushed is 
18760 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 6f  currently the ro
18770 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a  ot node,.      *
18780 2a 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73 20  * also push its 
18790 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 77 61  first rowid upwa
187a0 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44  rds. */.      pD
187b0 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d  lidx->buf.p[0] =
187c0 20 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74   0x01;    /* Not
187d0 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a   the root node *
187e0 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  /.      fts5Data
187f0 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20  Write(p, .      
18800 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
18810 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
18820 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d  egid, i, pDlidx-
18830 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20  >pgno),.        
18840 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c    pDlidx->buf.p,
18850 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20   pDlidx->buf.n. 
18860 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74       );.      ft
18870 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
18880 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b 32  (p, pWriter, i+2
18890 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 20  );.      pDlidx 
188a0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
188b0 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  dx[i];.      if(
188c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
188d0 4b 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62  K && pDlidx[1].b
188e0 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  uf.n==0 ){.     
188f0 20 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20     i64 iFirst = 
18900 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74  fts5DlidxExtract
18910 46 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c 69  FirstRowid(&pDli
18920 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20  dx->buf);..     
18930 20 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20 74     /* This was t
18940 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75  he root node. Pu
18950 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77  sh its first row
18960 69 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 77  id up to the new
18970 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20   root. */.      
18980 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f    pDlidx[1].pgno
18990 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b   = pDlidx->pgno;
189a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
189b0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
189c0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
189d0 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30  pDlidx[1].buf, 0
189e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
189f0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
18a00 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
18a10 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c   &pDlidx[1].buf,
18a20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a   pDlidx->pgno);.
18a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
18a40 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
18a50 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
18a60 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46  Dlidx[1].buf, iF
18a70 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  irst);.        p
18a80 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56 61  Dlidx[1].bPrevVa
18a90 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
18aa0 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76   pDlidx[1].iPrev
18ab0 20 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20 20   = iFirst;.     
18ac0 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
18ad0 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28  3Fts5BufferZero(
18ae0 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20  &pDlidx->buf);. 
18af0 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72       pDlidx->bPr
18b00 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  evValid = 0;.   
18b10 20 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b     pDlidx->pgno+
18b20 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
18b30 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
18b40 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44     }..    if( pD
18b50 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
18b60 20 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d   ){.      iVal =
18b70 20 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64 78   iRowid - pDlidx
18b80 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c  ->iPrev;.    }el
18b90 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50  se{.      i64 iP
18ba0 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57  gno = (i==0 ? pW
18bb0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67  riter->writer.pg
18bc0 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e  no : pDlidx[-1].
18bd0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73  pgno);.      ass
18be0 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66  ert( pDlidx->buf
18bf0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  .n==0 );.      s
18c00 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
18c10 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
18c20 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
18c30 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20  f, !bDone);.    
18c40 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
18c50 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
18c60 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
18c70 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20  >buf, iPgno);.  
18c80 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69      iVal = iRowi
18c90 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  d;.    }..    sq
18ca0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
18cb0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
18cc0 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
18cd0 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c  , iVal);.    pDl
18ce0 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
18cf0 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d  = 1;.    pDlidx-
18d00 3e 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b  >iPrev = iRowid;
18d10 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
18d20 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75  oid fts5WriteFlu
18d30 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78  shLeaf(Fts5Index
18d40 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
18d50 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
18d60 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
18d70 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c  zero[] = { 0x00,
18d80 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
18d90 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57  0 };.  Fts5PageW
18da0 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
18db0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
18dc0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a  .  i64 iRowid;..
18dd0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
18de0 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28  ->pgidx.n==0)==(
18df0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
18e00 65 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a 20  ermInPage) );.. 
18e10 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65   /* Set the szLe
18e20 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e  af header field.
18e30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
18e40 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61  =fts5GetU16(&pPa
18e50 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b  ge->buf.p[2]) );
18e60 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70  .  fts5PutU16(&p
18e70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20  Page->buf.p[2], 
18e80 28 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e  (u16)pPage->buf.
18e90 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74  n);..  if( pWrit
18ea0 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
18eb0 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  Page ){.    /* N
18ec0 6f 20 74 65 72 6d 20 77 61 73 20 77 72 69 74 74  o term was writt
18ed0 65 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e  en to this page.
18ee0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
18ef0 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d  pPage->pgidx.n==
18f00 30 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  0 );.    fts5Wri
18f10 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c  teBtreeNoTerm(p,
18f20 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c   pWriter);.  }el
18f30 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  se{.    /* Appen
18f40 64 20 74 68 65 20 70 67 69 64 78 20 74 6f 20 74  d the pgidx to t
18f50 68 65 20 70 61 67 65 20 62 75 66 66 65 72 2e 20  he page buffer. 
18f60 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68  Set the szLeaf h
18f70 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a  eader field. */.
18f80 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
18f90 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
18fa0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50   &pPage->buf, pP
18fb0 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50  age->pgidx.n, pP
18fc0 61 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20  age->pgidx.p);. 
18fd0 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
18fe0 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 64  he page out to d
18ff0 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20  isk */.  iRowid 
19000 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
19010 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
19020 65 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e  egid, pPage->pgn
19030 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72  o);.  fts5DataWr
19040 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70  ite(p, iRowid, p
19050 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
19060 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f  ge->buf.n);..  /
19070 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
19080 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20   next page. */. 
19090 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
190a0 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20  &pPage->buf);.  
190b0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
190c0 70 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20  pPage->pgidx);. 
190d0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
190e0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
190f0 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65  Page->buf, 4, ze
19100 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50  ro);.  pPage->iP
19110 72 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20 20  revPgidx = 0;.  
19120 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a  pPage->pgno++;..
19130 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68    /* Increase th
19140 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e  e leaves written
19150 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57   counter */.  pW
19160 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74  riter->nLeafWrit
19170 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65  ten++;..  /* The
19180 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20   new leaf holds 
19190 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69  no terms or rowi
191a0 64 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  ds */.  pWriter-
191b0 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
191c0 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  e = 1;.  pWriter
191d0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
191e0 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  age = 1;.}../*.*
191f0 2a 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54  * Append term pT
19200 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65  erm/nTerm to the
19210 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77   segment being w
19220 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72  ritten by the wr
19230 69 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61  iter passed.** a
19240 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
19250 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
19260 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
19270 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
19280 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
19290 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
192a0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
192b0 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
192c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
192d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
192e0 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
192f0 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
19300 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
19310 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
19320 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f  .  int nTerm, co
19330 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29  nst u8 *pTerm .)
19340 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  {.  int nPrefix;
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
19370 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69  prefix compressi
19380 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20  on for term */. 
19390 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
193a0 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
193b0 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74 73  r->writer;.  Fts
193c0 35 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 20  5Buffer *pPgidx 
193d0 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
193e0 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 61 73 73  er.pgidx;..  ass
193f0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
19400 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
19410 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  t( pPage->buf.n>
19420 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
19430 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c  pPage->buf.n>4 |
19440 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  | pWriter->bFirs
19450 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a  tTermInPage );..
19460 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
19470 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ent leaf page is
19480 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20   full, flush it 
19490 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66  to disk. */.  if
194a0 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
194b0 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54  + pPgidx->n + nT
194c0 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f  erm + 2)>=p->pCo
194d0 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
194e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66    if( pPage->buf
194f0 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74  .n>4 ){.      ft
19500 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
19510 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
19520 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
19530 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26  erGrow(&p->rc, &
19540 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
19550 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  m+FTS5_DATA_PADD
19560 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  ING);.  }.  .  /
19570 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e  * TODO1: Updatin
19580 67 20 70 67 69 64 78 20 68 65 72 65 2e 20 2a 2f  g pgidx here. */
19590 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20  .  pPgidx->n += 
195a0 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
195b0 72 69 6e 74 28 0a 20 20 20 20 20 20 26 70 50 67  rint(.      &pPg
195c0 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e  idx->p[pPgidx->n
195d0 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ], pPage->buf.n 
195e0 2d 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67  - pPage->iPrevPg
195f0 69 64 78 0a 20 20 29 3b 0a 20 20 70 50 61 67 65  idx.  );.  pPage
19600 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 70  ->iPrevPgidx = p
19610 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66  Page->buf.n;.#if
19620 20 30 0a 20 20 66 74 73 35 50 75 74 55 31 36 28   0.  fts5PutU16(
19630 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64  &pPgidx->p[pPgid
19640 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75  x->n], pPage->bu
19650 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e  f.n);.  pPgidx->
19660 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a  n += 2;.#endif..
19670 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
19680 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
19690 29 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  ){.    nPrefix =
196a0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
196b0 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20  e->pgno!=1 ){.  
196c0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
196d0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
196e0 20 61 20 6c 65 61 66 20 74 68 61 74 20 69 73 20   a leaf that is 
196f0 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74  not the leftmost
19700 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a   leaf in.      *
19710 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d  * the segment b-
19720 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  tree. In this ca
19730 73 65 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  se it is necessa
19740 72 79 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d  ry to add a term
19750 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
19760 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
19770 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6c 61  y that is (a) la
19780 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
19790 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20  rgest term .    
197a0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69    ** already wri
197b0 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d  tten to the segm
197c0 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c  ent and (b) smal
197d0 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ler than or equa
197e0 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  l to.      ** th
197f0 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65  is term. In othe
19800 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69  r words, a prefi
19810 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  x of (pTerm/nTer
19820 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20  m) that is one. 
19830 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e       ** byte lon
19840 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e  ger than the lon
19850 67 65 73 74 20 70 72 65 66 69 78 20 28 70 54 65  gest prefix (pTe
19860 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73  rm/nTerm) shares
19870 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20   with the.      
19880 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ** previous term
19890 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
198a0 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68    ** Usually, th
198b0 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  e previous term 
198c0 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
198d0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65  pPage->term. The
198e0 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
198f0 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20 69   ** is if this i
19900 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
19910 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69   written in an i
19920 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
19930 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20   step..      ** 
19940 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
19950 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69   previous term i
19960 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
19970 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61   so just write a
19980 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
19990 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  f (pTerm/nTerm) 
199a0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
199b0 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c  node. This is sl
199c0 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  ightly.      ** 
199d0 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74  inefficient, but
199e0 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20   still correct. 
199f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
19a00 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  = nTerm;.      i
19a10 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  f( pPage->term.n
19a20 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   ){.        n = 
19a30 31 20 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f  1 + fts5PrefixCo
19a40 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
19a50 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
19a60 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
19a70 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
19a80 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
19a90 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c  Term(p, pWriter,
19aa0 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20   n, pTerm);.    
19ab0 20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74    pPage = &pWrit
19ac0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20  er->writer;.    
19ad0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  }.  }else{.    n
19ae0 50 72 65 66 69 78 20 3d 20 66 74 73 35 50 72 65  Prefix = fts5Pre
19af0 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67  fixCompress(pPag
19b00 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65  e->term.n, pPage
19b10 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c  ->term.p, nTerm,
19b20 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74 73   pTerm);.    fts
19b30 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
19b40 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
19b50 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69 78  ge->buf, nPrefix
19b60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70  );.  }..  /* App
19b70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  end the number o
19b80 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 64  f bytes of new d
19b90 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74 65  ata, then the te
19ba0 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a 20  rm data itself. 
19bb0 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e   ** to the page.
19bc0 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72   */.  fts5Buffer
19bd0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
19be0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
19bf0 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69  , nTerm - nPrefi
19c00 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  x);.  fts5Buffer
19c10 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
19c20 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
19c30 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 2c  nTerm - nPrefix,
19c40 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d   &pTerm[nPrefix]
19c50 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  );..  /* Update 
19c60 74 68 65 20 46 74 73 35 50 61 67 65 57 72 69 74  the Fts5PageWrit
19c70 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20 2a  er.term field. *
19c80 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65  /.  fts5BufferSe
19c90 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
19ca0 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70  ->term, nTerm, p
19cb0 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72  Term);.  pWriter
19cc0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
19cd0 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69 74  ge = 0;..  pWrit
19ce0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
19cf0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72  nPage = 0;.  pWr
19d00 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
19d10 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a  dInDoclist = 1;.
19d20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
19d30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44   || (pWriter->nD
19d40 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65  lidx>0 && pWrite
19d50 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
19d60 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72 69  .n==0) );.  pWri
19d70 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 70  ter->aDlidx[0].p
19d80 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
19d90 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  o;.}../*.** Appe
19da0 6e 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20 70  nd a rowid and p
19db0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
19dc0 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77  e field to the w
19dd0 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a  riters output. .
19de0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
19df0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f  ts5WriteAppendRo
19e00 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
19e10 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
19e20 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
19e30 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a    i64 iRowid.){.
19e40 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
19e60 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
19e70 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
19e80 77 72 69 74 65 72 3b 0a 0a 20 20 20 20 69 66 28  writer;..    if(
19e90 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
19ea0 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 29   pPage->pgidx.n)
19eb0 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  >=p->pConfig->pg
19ec0 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  sz ){.      fts5
19ed0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
19ee0 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
19ef0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
19f00 73 20 69 73 20 74 6f 20 62 65 20 74 68 65 20 66  s is to be the f
19f10 69 72 73 74 20 72 6f 77 69 64 20 77 72 69 74 74  irst rowid writt
19f20 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20  en to the page, 
19f30 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  set the .    ** 
19f40 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20 69 6e  rowid-pointer in
19f50 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
19f60 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61 20  . Also append a 
19f70 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c 69  value to the dli
19f80 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72  dx.    ** buffer
19f90 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63 6c  , in case a docl
19fa0 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65 71  ist-index is req
19fb0 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  uired.  */.    i
19fc0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
19fd0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b  stRowidInPage ){
19fe0 0a 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31  .      fts5PutU1
19ff0 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20  6(pPage->buf.p, 
1a000 28 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e  (u16)pPage->buf.
1a010 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72  n);.      fts5Wr
1a020 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70  iteDlidxAppend(p
1a030 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69  , pWriter, iRowi
1a040 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
1a050 2a 20 57 72 69 74 65 20 74 68 65 20 72 6f 77 69  * Write the rowi
1a060 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  d. */.    if( pW
1a070 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1a080 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70  idInDoclist || p
1a090 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1a0a0 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
1a0b0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1a0c0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1a0d0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69  , &pPage->buf, i
1a0e0 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  Rowid);.    }els
1a0f0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1a100 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64   p->rc || iRowid
1a110 3e 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52  >pWriter->iPrevR
1a120 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74  owid );.      ft
1a130 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1a140 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1a150 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  age->buf, iRowid
1a160 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65   - pWriter->iPre
1a170 76 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  vRowid);.    }. 
1a180 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65     pWriter->iPre
1a190 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  vRowid = iRowid;
1a1a0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46  .    pWriter->bF
1a1b0 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
1a1c0 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69  st = 0;.    pWri
1a1d0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1a1e0 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  InPage = 0;.  }.
1a1f0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1a200 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
1a210 73 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73  slistData(.  Fts
1a220 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1a230 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1a240 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75  iter, .  const u
1a250 38 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74  8 *aData, .  int
1a260 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35   nData.){.  Fts5
1a270 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
1a280 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  e = &pWriter->wr
1a290 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38  iter;.  const u8
1a2a0 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69   *a = aData;.  i
1a2b0 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nt n = nData;.  
1a2c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
1a2d0 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b  onfig->pgsz>0 );
1a2e0 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
1a2f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
1a300 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e   && (pPage->buf.
1a310 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n + pPage->pgidx
1a320 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e  .n + n)>=p->pCon
1a330 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a  fig->pgsz .  ){.
1a340 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70      int nReq = p
1a350 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1a360 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d  - pPage->buf.n -
1a370 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b   pPage->pgidx.n;
1a380 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  .    int nCopy =
1a390 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   0;.    while( n
1a3a0 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20  Copy<nReq ){.   
1a3b0 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20     i64 dummy;.  
1a3c0 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73      nCopy += fts
1a3d0 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43  5GetVarint(&a[nC
1a3e0 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d  opy], (u64*)&dum
1a3f0 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  my);.    }.    f
1a400 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1a410 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
1a420 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20  ge->buf, nCopy, 
1a430 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f  a);.    a += nCo
1a440 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f  py;.    n -= nCo
1a450 70 79 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  py;.    fts5Writ
1a460 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57  eFlushLeaf(p, pW
1a470 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  riter);.  }.  if
1a480 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73  ( n>0 ){.    fts
1a490 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1a4a0 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1a4b0 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20  ->buf, n, a);.  
1a4c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  }.}../*.** Flush
1a4d0 20 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64   any data cached
1a4e0 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f   by the writer o
1a4f0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74  bject to the dat
1a500 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a  abase. Free any.
1a510 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ** allocations a
1a520 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1a530 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74  he writer..*/.st
1a540 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1a550 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73  iteFinish(.  Fts
1a560 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1a570 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1a580 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  iter,         /*
1a590 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
1a5a0 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20  /.  int *pnLeaf 
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
1a5d0 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73  er of leaf pages
1a5e0 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b   in b-tree */.){
1a5f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35  .  int i;.  Fts5
1a600 50 61 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61  PageWriter *pLea
1a610 66 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  f = &pWriter->wr
1a620 69 74 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72  iter;.  if( p->r
1a630 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a640 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 61      assert( pLea
1a650 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20  f->pgno>=1 );.  
1a660 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66    if( pLeaf->buf
1a670 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74  .n>4 ){.      ft
1a680 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1a690 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1a6a0 20 20 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20    }.    *pnLeaf 
1a6b0 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b  = pLeaf->pgno-1;
1a6c0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c  .    fts5WriteFl
1a6d0 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69  ushBtree(p, pWri
1a6e0 74 65 72 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35  ter);.  }.  fts5
1a6f0 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61  BufferFree(&pLea
1a700 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35  f->term);.  fts5
1a710 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61  BufferFree(&pLea
1a720 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  f->buf);.  fts5B
1a730 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
1a740 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35  ->pgidx);.  fts5
1a750 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69  BufferFree(&pWri
1a760 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20  ter->btterm);.. 
1a770 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69   for(i=0; i<pWri
1a780 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b  ter->nDlidx; i++
1a790 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
1a7a0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
1a7b0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
1a7c0 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  .buf);.  }.  sql
1a7d0 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
1a7e0 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73  r->aDlidx);.}..s
1a7f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1a800 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35  riteInit(.  Fts5
1a810 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1a820 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1a830 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67  ter, .  int iSeg
1a840 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  id.){.  const in
1a850 74 20 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70  t nBuffer = p->p
1a860 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46  Config->pgsz + F
1a870 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
1a880 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69  ;..  memset(pWri
1a890 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
1a8a0 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a  ts5SegWriter));.
1a8b0 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69    pWriter->iSegi
1a8c0 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66  d = iSegid;..  f
1a8d0 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
1a8e0 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29  w(p, pWriter, 1)
1a8f0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69  ;.  pWriter->wri
1a900 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ter.pgno = 1;.  
1a910 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1a920 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
1a930 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
1a940 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  e = 1;..  assert
1a950 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  ( pWriter->write
1a960 72 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20  r.buf.n==0 );.  
1a970 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d  assert( pWriter-
1a980 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d  >writer.pgidx.n=
1a990 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77  =0 );..  /* Grow
1a9a0 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
1a9b0 20 74 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69   to pgsz + paddi
1a9c0 6e 67 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ng bytes in size
1a9d0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74  . */.  sqlite3Ft
1a9e0 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
1a9f0 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77  >rc, &pWriter->w
1aa00 72 69 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75  riter.pgidx, nBu
1aa10 66 66 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ffer);.  sqlite3
1aa20 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
1aa30 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
1aa40 3e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 42 75  >writer.buf, nBu
1aa50 66 66 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ffer);..  if( p-
1aa60 3e 70 49 64 78 57 72 69 74 65 72 3d 3d 30 20 29  >pIdxWriter==0 )
1aa70 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
1aa80 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
1aa90 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
1aaa0 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
1aab0 28 70 2c 20 26 70 2d 3e 70 49 64 78 57 72 69 74  (p, &p->pIdxWrit
1aac0 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
1aad0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
1aae0 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27  INSERT INTO '%q'
1aaf0 2e 27 25 71 5f 69 64 78 27 28 73 65 67 69 64 2c  .'%q_idx'(segid,
1ab00 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55 45  term,pgno) VALUE
1ab10 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20 20  S(?,?,?)", .    
1ab20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
1ab30 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
1ab40 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 0a  me.    ));.  }..
1ab50 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1ab60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
1ab70 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1ab80 34 2d 62 79 74 65 20 6c 65 61 66 2d 70 61 67 65  4-byte leaf-page
1ab90 20 68 65 61 64 65 72 20 74 6f 20 30 78 30 30 2e   header to 0x00.
1aba0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
1abb0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1abc0 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20  uf.p, 0, 4);.   
1abd0 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1abe0 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20  .buf.n = 4;..   
1abf0 20 2f 2a 20 42 69 6e 64 20 74 68 65 20 63 75 72   /* Bind the cur
1ac00 72 65 6e 74 20 6f 75 74 70 75 74 20 73 65 67 6d  rent output segm
1ac10 65 6e 74 20 69 64 20 74 6f 20 74 68 65 20 69 6e  ent id to the in
1ac20 64 65 78 2d 77 72 69 74 65 72 2e 20 54 68 69 73  dex-writer. This
1ac30 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 6f 70   is an.    ** op
1ac40 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76 65 72 20  timization over 
1ac50 62 69 6e 64 69 6e 67 20 74 68 65 20 73 61 6d 65  binding the same
1ac60 20 76 61 6c 75 65 20 6f 76 65 72 20 61 6e 64 20   value over and 
1ac70 6f 76 65 72 20 61 73 20 72 6f 77 73 20 61 72 65  over as rows are
1ac80 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 65 64  .    ** inserted
1ac90 20 69 6e 74 6f 20 25 5f 69 64 78 20 62 79 20 74   into %_idx by t
1aca0 68 65 20 63 75 72 72 65 6e 74 20 77 72 69 74 65  he current write
1acb0 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r.  */.    sqlit
1acc0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70  e3_bind_int(p->p
1acd0 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57  IdxWriter, 1, pW
1ace0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 0a  riter->iSegid);.
1acf0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    }.}../*.** Ite
1ad00 72 61 74 6f 72 20 70 49 74 65 72 20 77 61 73 20  rator pIter was 
1ad10 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
1ad20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75  through the inpu
1ad30 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e  t segments of on
1ad40 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   an.** increment
1ad50 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69  al merge operati
1ad60 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
1ad70 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74  n is called if t
1ad80 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a  he incremental.*
1ad90 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68 61 73  * merge step has
1ada0 20 66 69 6e 69 73 68 65 64 20 62 75 74 20 74 68   finished but th
1adb0 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20  e input has not 
1adc0 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20  been completely 
1add0 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74  exhausted..*/.st
1ade0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72  atic void fts5Tr
1adf0 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49  imSegments(Fts5I
1ae00 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e 64  ndex *p, Fts5Ind
1ae10 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
1ae20 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42    int i;.  Fts5B
1ae30 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
1ae40 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
1ae50 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1ae60 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1ae70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
1ae80 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1ae90 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
1aea0 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69  ->aSeg[i];.    i
1aeb0 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30  f( pSeg->pSeg==0
1aec0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d   ){.      /* no-
1aed0 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  op */.    }else 
1aee0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
1aef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
1af00 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 69  ll keys from thi
1af10 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20  s input segment 
1af20 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e 73 66  have been transf
1af30 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  ered to the outp
1af40 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65 74  ut..      ** Set
1af50 20 62 6f 74 68 20 74 68 65 20 66 69 72 73 74 20   both the first 
1af60 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d 6e 75  and last page-nu
1af70 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20 69 6e  mbers to 0 to in
1af80 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a  dicate that the.
1af90 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
1afa0 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a   is now empty. *
1afb0 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53  /.      pSeg->pS
1afc0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30  eg->pgnoLast = 0
1afd0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53  ;.      pSeg->pS
1afe0 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
1aff0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1b000 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70      int iOff = p
1b010 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  Seg->iTermLeafOf
1b020 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66  fset;     /* Off
1b030 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74  set on new first
1b040 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20   leaf page */.  
1b050 20 20 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77      i64 iLeafRow
1b060 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61  id;.      Fts5Da
1b070 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20  ta *pData;.     
1b080 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d   int iId = pSeg-
1b090 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
1b0a0 20 20 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20       u8 aHdr[4] 
1b0b0 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30  = {0x00, 0x00, 0
1b0c0 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20  x00, 0x00};..   
1b0d0 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20     iLeafRowid = 
1b0e0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1b0f0 49 44 28 69 49 64 2c 20 70 53 65 67 2d 3e 69 54  ID(iId, pSeg->iT
1b100 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ermLeafPgno);.  
1b110 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
1b120 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c 65 61  DataRead(p, iLea
1b130 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  fRowid);.      i
1b140 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
1b150 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
1b160 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20 20  ro(&buf);.      
1b170 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77    fts5BufferGrow
1b180 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1b190 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20 20  Data->nn);.     
1b1a0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1b1b0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1b1c0 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48 64  &buf, sizeof(aHd
1b1d0 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20 20  r), aHdr);.     
1b1e0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1b1f0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1b200 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
1b210 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66  rm.n);.        f
1b220 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1b230 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
1b240 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20  , pSeg->term.n, 
1b250 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20  pSeg->term.p);. 
1b260 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1b270 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1b280 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
1b290 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20 26 70  >szLeaf-iOff, &p
1b2a0 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Data->p[iOff]);.
1b2b0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1b2c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
1b2e0 20 74 68 65 20 73 7a 4c 65 61 66 20 66 69 65 6c   the szLeaf fiel
1b2f0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  d */.          f
1b300 74 73 35 50 75 74 55 31 36 28 26 62 75 66 2e 70  ts5PutU16(&buf.p
1b310 5b 32 5d 2c 20 28 75 31 36 29 62 75 66 2e 6e 29  [2], (u16)buf.n)
1b320 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1b330 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74       /* Set up t
1b340 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e 64 65  he new page-inde
1b350 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  x array */.     
1b360 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1b370 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1b380 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20  , &buf, 4);.    
1b390 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c      if( pSeg->iL
1b3a0 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69  eafPgno==pSeg->i
1b3b0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20  TermLeafPgno .  
1b3c0 20 20 20 20 20 20 20 26 26 20 70 53 65 67 2d 3e         && pSeg->
1b3d0 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44  iEndofDoclist<pD
1b3e0 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20  ata->szLeaf .   
1b3f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b400 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44    int nDiff = pD
1b410 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  ata->szLeaf - pS
1b420 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  eg->iEndofDoclis
1b430 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  t;.          fts
1b440 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1b450 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
1b460 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44  , buf.n - 1 - nD
1b470 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  iff - 4);.      
1b480 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1b490 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1b4a0 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20 20 20   &buf, .        
1b4b0 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20        pData->nn 
1b4c0 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66  - pSeg->iPgidxOf
1b4d0 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70 53 65  f, &pData->p[pSe
1b4e0 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20 20  g->iPgidxOff].  
1b4f0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1b500 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74     }..        ft
1b510 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
1b520 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53  ata);.        pS
1b530 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eg->pSeg->pgnoFi
1b540 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72  rst = pSeg->iTer
1b550 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20  mLeafPgno;.     
1b560 20 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74     fts5DataDelet
1b570 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  e(p, FTS5_SEGMEN
1b580 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31 29 2c  T_ROWID(iId, 1),
1b590 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20   iLeafRowid);.  
1b5a0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
1b5b0 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
1b5c0 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
1b5d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b5e0 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1b5f0 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73  Free(&buf);.}..s
1b600 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1b610 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63  ergeChunkCallbac
1b620 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
1b630 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  p, .  void *pCtx
1b640 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
1b650 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
1b660 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72  k.){.  Fts5SegWr
1b670 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20  iter *pWriter = 
1b680 28 46 74 73 35 53 65 67 57 72 69 74 65 72 2a 29  (Fts5SegWriter*)
1b690 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74  pCtx;.  fts5Writ
1b6a0 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
1b6b0 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70  ta(p, pWriter, p
1b6c0 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
1b6d0 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
1b6e0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1b6f0 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46  xMergeLevel(.  F
1b700 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b720 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1b730 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1b740 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1b750 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
1b760 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
1b770 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
1b780 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b7a0 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  Level to read in
1b7b0 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  put from */.  in
1b7c0 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b7e0 20 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69   Write up to thi
1b7f0 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65  s many output le
1b800 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  aves */.){.  Fts
1b810 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1b820 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
1b830 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1b840 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1b850 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1b860 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75  Lvl];.  Fts5Stru
1b870 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1b880 4f 75 74 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  Out;.  Fts5Index
1b890 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b  Iter *pIter = 0;
1b8a0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
1b8b0 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  or to read input
1b8c0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
1b8d0 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70  Rem = pnRem ? *p
1b8e0 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75  nRem : 0;  /* Ou
1b8f0 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20  tput leaf pages 
1b900 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
1b910 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20  .  int nInput;  
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b940 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
1b950 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
1b960 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20  r writer;       
1b970 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
1b980 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1b990 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1b9a0 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74  pSeg;     /* Out
1b9b0 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
1b9c0 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
1b9d0 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b  ;.  int bOldest;
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1ba00 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1ba10 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20  t is the oldest 
1ba20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  */.  int eDetail
1ba30 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65   = p->pConfig->e
1ba40 44 65 74 61 69 6c 3b 0a 0a 20 20 61 73 73 65 72  Detail;..  asser
1ba50 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  t( iLvl<pStruct-
1ba60 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73  >nLevel );.  ass
1ba70 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ert( pLvl->nMerg
1ba80 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b  e<=pLvl->nSeg );
1ba90 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74  ..  memset(&writ
1baa0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
1bab0 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
1bac0 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30   memset(&term, 0
1bad0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1bae0 66 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76  fer));.  if( pLv
1baf0 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20  l->nMerge ){.   
1bb00 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72   pLvlOut = &pStr
1bb10 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1bb20 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  +1];.    assert(
1bb30 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30   pLvlOut->nSeg>0
1bb40 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d   );.    nInput =
1bb50 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20   pLvl->nMerge;. 
1bb60 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
1bb70 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
1bb80 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20  ->nSeg-1];..    
1bb90 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c  fts5WriteInit(p,
1bba0 20 26 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e   &writer, pSeg->
1bbb0 69 53 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69  iSegid);.    wri
1bbc0 74 65 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20  ter.writer.pgno 
1bbd0 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
1bbe0 2b 31 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69  +1;.    writer.i
1bbf0 42 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65  BtPage = 0;.  }e
1bc00 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  lse{.    int iSe
1bc10 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61  gid = fts5Alloca
1bc20 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75  teSegid(p, pStru
1bc30 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74  ct);..    /* Ext
1bc40 65 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75  end the Fts5Stru
1bc50 63 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20  cture object as 
1bc60 72 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75  required to ensu
1bc70 72 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  re the output.  
1bc80 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69    ** segment exi
1bc90 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sts. */.    if( 
1bca0 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e  iLvl==pStruct->n
1bcb0 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20  Level-1 ){.     
1bcc0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64   fts5StructureAd
1bcd0 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
1bce0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
1bcf0 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1bd00 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  uct;.    }.    f
1bd10 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
1bd20 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
1bd30 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c  pStruct, iLvl+1,
1bd40 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
1bd50 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
1bd60 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72      pLvl = &pStr
1bd70 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1bd80 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d  ];.    pLvlOut =
1bd90 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1bda0 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20  l[iLvl+1];..    
1bdb0 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c  fts5WriteInit(p,
1bdc0 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64   &writer, iSegid
1bdd0 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  );..    /* Add t
1bde0 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74  he new segment t
1bdf0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76  o the output lev
1be00 65 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d  el */.    pSeg =
1be10 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
1be20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a  pLvlOut->nSeg];.
1be30 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65      pLvlOut->nSe
1be40 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70  g++;.    pSeg->p
1be50 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  gnoFirst = 1;.  
1be60 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d    pSeg->iSegid =
1be70 20 69 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74   iSegid;.    pSt
1be80 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b  ruct->nSegment++
1be90 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69  ;..    /* Read i
1bea0 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65  nput from all se
1beb0 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  gments in the in
1bec0 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
1bed0 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e   nInput = pLvl->
1bee0 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64  nSeg;.  }.  bOld
1bef0 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e  est = (pLvlOut->
1bf00 6e 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75  nSeg==1 && pStru
1bf10 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c  ct->nLevel==iLvl
1bf20 2b 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  +2);..  assert( 
1bf30 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72  iLvl>=0 );.  for
1bf40 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
1bf50 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c  w(p, pStruct, 0,
1bf60 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20   0, 0, 0, iLvl, 
1bf70 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b  nInput, &pIter);
1bf80 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
1bf90 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
1bfa0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
1bfb0 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
1bfc0 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20   pIter, 0, 0).  
1bfd0 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
1bfe0 65 72 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26  er *pSegIter = &
1bff0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
1c000 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
1c010 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20  irst ];.    int 
1c020 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20  nPos;           
1c030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73            /* pos
1c040 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
1c050 66 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20  field value */. 
1c060 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20     int nTerm;.  
1c070 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
1c080 6d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  m;..    /* Check
1c090 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c   for key annihil
1c0a0 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  ation. */.    if
1c0b0 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73  ( pSegIter->nPos
1c0c0 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20  ==0 && (bOldest 
1c0d0 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65  || pSegIter->bDe
1c0e0 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  l==0) ) continue
1c0f0 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  ;..    pTerm = f
1c100 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
1c110 28 70 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b  (pIter, &nTerm);
1c120 0a 20 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d  .    if( nTerm!=
1c130 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70  term.n || memcmp
1c140 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20  (pTerm, term.p, 
1c150 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20  nTerm) ){.      
1c160 69 66 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69  if( pnRem && wri
1c170 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
1c180 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20  >nRem ){.       
1c190 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c1a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
1c1b0 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70  s a new term. Ap
1c1c0 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74  pend a term to t
1c1d0 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1c1e0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35  t. */.      fts5
1c1f0 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
1c200 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72  p, &writer, nTer
1c210 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
1c220 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
1c230 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54  p->rc, &term, nT
1c240 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
1c250 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e   }..    /* Appen
1c260 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74  d the rowid to t
1c270 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
1c280 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54   /* WRITEPOSLIST
1c290 53 49 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73 35  SIZE */.    fts5
1c2a0 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64  WriteAppendRowid
1c2b0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73  (p, &writer, fts
1c2c0 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
1c2d0 70 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 69 66  pIter));..    if
1c2e0 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
1c2f0 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
1c300 20 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65       if( pSegIte
1c310 72 2d 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20 20  r->bDel ){.     
1c320 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1c330 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1c340 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  , &writer.writer
1c350 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  .buf, 0);.      
1c360 20 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e    if( pSegIter->
1c370 6e 50 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20 20  nPos>0 ){.      
1c380 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1c390 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1c3a0 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65  c, &writer.write
1c3b0 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20  r.buf, 0);.     
1c3c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c3d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1c3e0 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69   Append the posi
1c3f0 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74  tion-list data t
1c400 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
1c410 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65        nPos = pSe
1c420 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20  gIter->nPos*2 + 
1c430 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a  pSegIter->bDel;.
1c440 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1c450 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1c460 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69  >rc, &writer.wri
1c470 74 65 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a  ter.buf, nPos);.
1c480 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
1c490 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 49 74  terate(p, pSegIt
1c4a0 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74  er, (void*)&writ
1c4b0 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75  er, fts5MergeChu
1c4c0 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  nkCallback);.   
1c4d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75   }.  }..  /* Flu
1c4e0 73 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66  sh the last leaf
1c4f0 20 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53   page to disk. S
1c500 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  et the output se
1c510 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69  gment b-tree hei
1c520 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73  ght.  ** and las
1c530 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
1c540 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  er at the same t
1c550 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57  ime.  */.  fts5W
1c560 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77  riteFinish(p, &w
1c570 72 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 70 67  riter, &pSeg->pg
1c580 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20  noLast);..  if( 
1c590 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1c5a0 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20  (p, pIter) ){.  
1c5b0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a    int i;..    /*
1c5c0 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75   Remove the redu
1c5d0 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66  ndant segments f
1c5e0 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
1c5f0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  able */.    for(
1c600 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69  i=0; i<nInput; i
1c610 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  ++){.      fts5D
1c620 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74  ataRemoveSegment
1c630 28 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  (p, pLvl->aSeg[i
1c640 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d  ].iSegid);.    }
1c650 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
1c660 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65  the redundant se
1c670 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  gments from the 
1c680 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  input level */. 
1c690 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65     if( pLvl->nSe
1c6a0 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20  g!=nInput ){.   
1c6b0 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28     int nMove = (
1c6c0 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e  pLvl->nSeg - nIn
1c6d0 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  put) * sizeof(Ft
1c6e0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1c6f0 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f  nt);.      memmo
1c700 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26  ve(pLvl->aSeg, &
1c710 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75  pLvl->aSeg[nInpu
1c720 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  t], nMove);.    
1c730 7d 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  }.    pStruct->n
1c740 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75  Segment -= nInpu
1c750 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65  t;.    pLvl->nSe
1c760 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20  g -= nInput;.   
1c770 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
1c780 30 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  0;.    if( pSeg-
1c790 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a  >pgnoLast==0 ){.
1c7a0 20 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e        pLvlOut->n
1c7b0 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74  Seg--;.      pSt
1c7c0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d  ruct->nSegment--
1c7d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1c7e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65  .    assert( pSe
1c7f0 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b  g->pgnoLast>0 );
1c800 0a 20 20 20 20 66 74 73 35 54 72 69 6d 53 65 67  .    fts5TrimSeg
1c810 6d 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b  ments(p, pIter);
1c820 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  .    pLvl->nMerg
1c830 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a  e = nInput;.  }.
1c840 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
1c850 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Free(p, pIter);.
1c860 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1c870 28 26 74 65 72 6d 29 3b 0a 20 20 69 66 28 20 70  (&term);.  if( p
1c880 6e 52 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d  nRem ) *pnRem -=
1c890 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69   writer.nLeafWri
1c8a0 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  tten;.}../*.** D
1c8b0 6f 20 75 70 20 74 6f 20 6e 50 67 20 70 61 67 65  o up to nPg page
1c8c0 73 20 6f 66 20 61 75 74 6f 6d 65 72 67 65 20 77  s of automerge w
1c8d0 6f 72 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  ork on the index
1c8e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c8f0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28   fts5IndexMerge(
1c900 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1c930 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
1c940 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1c950 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
1c960 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
1c970 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
1c980 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  ndex */.  int nP
1c990 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
1c9a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1c9b0 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f  es of work to do
1c9c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65   */.){.  int nRe
1c9d0 6d 20 3d 20 6e 50 67 3b 0a 20 20 46 74 73 35 53  m = nPg;.  Fts5S
1c9e0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1c9f0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1ca00 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26   while( nRem>0 &
1ca10 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
1ca20 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  OK ){.    int iL
1ca30 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
1ca40 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
1ca50 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
1ca60 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  ls */.    int iB
1ca70 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20  estLvl = 0;     
1ca80 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
1ca90 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74  ffering the most
1caa0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1cab0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74  */.    int nBest
1cac0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1cad0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1cae0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
1caf0 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
1cb00 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73  .    /* Set iBes
1cb10 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65  tLvl to the leve
1cb20 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
1cb30 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a  segments from. *
1cb40 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  /.    assert( pS
1cb50 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
1cb60 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  );.    for(iLvl=
1cb70 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
1cb80 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
1cb90 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
1cba0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1cbb0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1cbc0 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
1cbd0 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
1cbe0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
1cbf0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42   pLvl->nMerge>nB
1cc00 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
1cc10 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
1cc20 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73  ;.          nBes
1cc30 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
1cc40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cc50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1cc60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76   }.      if( pLv
1cc70 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b  l->nSeg>nBest ){
1cc80 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d  .        nBest =
1cc90 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20   pLvl->nSeg;.   
1cca0 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
1ccb0 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iLvl;.      }.  
1ccc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1ccd0 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c  Best is still 0,
1cce0 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
1ccf0 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a  must be empty. *
1cd00 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1cd10 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c  DEBUG.    for(iL
1cd20 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26  vl=0; nBest==0 &
1cd30 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  & iLvl<pStruct->
1cd40 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
1cd50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1cd60 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1cd70 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a  Lvl].nSeg==0 );.
1cd80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1cd90 20 20 69 66 28 20 6e 42 65 73 74 3c 70 2d 3e 70    if( nBest<p->p
1cda0 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
1cdb0 67 65 20 0a 20 20 20 20 20 20 20 20 26 26 20 70  ge .        && p
1cdc0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1cdd0 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
1cde0 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =0 .      ){.   
1cdf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ce00 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
1ce10 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72  geLevel(p, &pStr
1ce20 75 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26  uct, iBestLvl, &
1ce30 6e 52 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  nRem);.    if( p
1ce40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ce50 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
1ce60 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65  el[iBestLvl].nMe
1ce70 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rge==0 ){.      
1ce80 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1ce90 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c  mote(p, iBestLvl
1cea0 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  +1, pStruct);.  
1ceb0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72    }.  }.  *ppStr
1cec0 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d  uct = pStruct;.}
1ced0 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ../*.** A total 
1cee0 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61  of nLeaf leaf pa
1cef0 67 65 73 20 6f 66 20 64 61 74 61 20 68 61 73 20  ges of data has 
1cf00 6a 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65  just been flushe
1cf10 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a  d to a level-0.*
1cf20 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20  * segment. This 
1cf30 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
1cf40 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74   the write-count
1cf50 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  er accordingly a
1cf60 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73  nd, if.** necess
1cf70 61 72 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e  ary, performs in
1cf80 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
1cf90 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  work..**.** If a
1cfa0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1cfb0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
1cfc0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
1cfd0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
1cfe0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
1cff0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
1d000 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1d010 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d020 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72  fts5IndexAutomer
1d030 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
1d040 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1d050 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1d060 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1d070 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1d080 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
1d090 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
1d0a0 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
1d0b0 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
1d0c0 20 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   nLeaf          
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d0e0 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
1d0f0 20 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69   leaves just wri
1d100 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tten */.){.  if(
1d110 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d120 4b 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  K && p->pConfig-
1d130 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b  >nAutomerge>0 ){
1d140 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1d150 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
1d160 70 53 74 72 75 63 74 3b 0a 20 20 20 20 75 36 34  pStruct;.    u64
1d170 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
1d180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1d190 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77  itial value of w
1d1a0 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  rite-counter */.
1d1b0 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20      int nWork;  
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
1d1e0 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65  ork-quanta to pe
1d1f0 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  rform */.    int
1d200 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
1d210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d220 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
1d230 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
1d240 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   */..    /* Upda
1d250 74 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75  te the write-cou
1d260 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e  nter. While doin
1d270 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e  g so, set nWork.
1d280 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d   */.    nWrite =
1d290 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
1d2a0 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f  Counter;.    nWo
1d2b0 72 6b 20 3d 20 28 69 6e 74 29 28 28 28 6e 57 72  rk = (int)(((nWr
1d2c0 69 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70  ite + nLeaf) / p
1d2d0 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28  ->nWorkUnit) - (
1d2e0 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72  nWrite / p->nWor
1d2f0 6b 55 6e 69 74 29 29 3b 0a 20 20 20 20 70 53 74  kUnit));.    pSt
1d300 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
1d310 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20  ter += nLeaf;.  
1d320 20 20 6e 52 65 6d 20 3d 20 28 69 6e 74 29 28 70    nRem = (int)(p
1d330 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57  ->nWorkUnit * nW
1d340 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e  ork * pStruct->n
1d350 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73  Level);..    fts
1d360 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 70  5IndexMerge(p, p
1d370 70 53 74 72 75 63 74 2c 20 6e 52 65 6d 29 3b 0a  pStruct, nRem);.
1d380 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1d390 69 64 20 66 74 73 35 49 6e 64 65 78 43 72 69 73  id fts5IndexCris
1d3a0 69 73 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49  ismerge(.  Fts5I
1d3b0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1d3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1d3d0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1d3e0 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
1d3f0 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20  ture **ppStruct 
1d400 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
1d410 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74  : Current struct
1d420 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
1d430 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  ){.  const int n
1d440 43 72 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e  Crisis = p->pCon
1d450 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67  fig->nCrisisMerg
1d460 65 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  e;.  Fts5Structu
1d470 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
1d480 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69  pStruct;.  int i
1d490 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Lvl = 0;..  asse
1d4a0 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
1d4b0 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d  E_OK || pStruct-
1d4c0 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77  >nLevel>0 );.  w
1d4d0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1d4e0 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63  ITE_OK && pStruc
1d4f0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1d500 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b  nSeg>=nCrisis ){
1d510 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65  .    fts5IndexMe
1d520 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74  rgeLevel(p, &pSt
1d530 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a  ruct, iLvl, 0);.
1d540 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
1d550 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1d560 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e  pStruct->nLevel>
1d570 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (iLvl+1) );.    
1d580 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1d590 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20  mote(p, iLvl+1, 
1d5a0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c  pStruct);.    iL
1d5b0 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53  vl++;.  }.  *ppS
1d5c0 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b  truct = pStruct;
1d5d0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
1d5e0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46  ts5IndexReturn(F
1d5f0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1d600 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
1d610 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1d620 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  _OK;.  return rc
1d630 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
1d640 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
1d650 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73   Fts5FlushCtx;.s
1d660 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
1d670 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  tx {.  Fts5Index
1d680 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65   *pIdx;.  Fts5Se
1d690 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
1d6a0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  .};../*.** Buffe
1d6b0 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e  r aBuf[] contain
1d6c0 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69  s a list of vari
1d6d0 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65  nts, all small e
1d6e0 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20  nough to fit.** 
1d6f0 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
1d700 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ger. Return the 
1d710 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67  size of the larg
1d720 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74 68  est prefix of th
1d730 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78  is .** list nMax
1d740 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69   bytes or less i
1d750 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
1d760 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73  c int fts5Poslis
1d770 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38  tPrefix(const u8
1d780 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78   *aBuf, int nMax
1d790 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
1d7a0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74  u32 dummy;.  ret
1d7b0 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
1d7c0 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b  32(aBuf, dummy);
1d7d0 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d 61 78 20  .  if( ret<nMax 
1d7e0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  ){.    while( 1 
1d7f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d  ){.      int i =
1d800 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
1d810 28 26 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d  (&aBuf[ret], dum
1d820 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  my);.      if( (
1d830 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20  ret + i) > nMax 
1d840 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72  ) break;.      r
1d850 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20  et += i;.    }. 
1d860 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
1d870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
1d880 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d890 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
1d8a0 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20  able iHash to a 
1d8b0 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20  new level-0 .** 
1d8c0 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e  segment on disk.
1d8d0 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65   Also update the
1d8e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73   corresponding s
1d8f0 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
1d900 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1d910 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
1d920 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
1d930 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
1d940 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
1d950 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
1d960 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1d970 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1d980 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 46  tatic void fts5F
1d990 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35  lushOneHash(Fts5
1d9a0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
1d9b0 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70  5Hash *pHash = p
1d9c0 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73 35 53  ->pHash;.  Fts5S
1d9d0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1d9e0 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b  t;.  int iSegid;
1d9f0 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
1da00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1da10 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61       /* Last lea
1da20 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  f page number in
1da30 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f   segment */..  /
1da40 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
1da50 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65  ence to the inde
1da60 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  x structure and 
1da70 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  allocate a new s
1da80 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66  egment-id.  ** f
1da90 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c  or the new level
1daa0 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a  -0 segment.  */.
1dab0 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
1dac0 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
1dad0 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74 73  ;.  iSegid = fts
1dae0 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70  5AllocateSegid(p
1daf0 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69  , pStruct);..  i
1db00 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20  f( iSegid ){.   
1db10 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
1db20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
1db30 73 7a 3b 0a 0a 20 20 20 20 46 74 73 35 53 74 72  sz;..    Fts5Str
1db40 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1db50 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65  Seg;   /* New se
1db60 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74  gment within pSt
1db70 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74 73 35  ruct */.    Fts5
1db80 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
1db90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
1dba0 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
1dbb0 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61  assemble leaf pa
1dbc0 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75  ge */.    Fts5Bu
1dbd0 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20 20 20  ffer *pPgidx;   
1dbe0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1dbf0 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73  r in which to as
1dc00 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a  semble pgidx */.
1dc10 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69 74  .    Fts5SegWrit
1dc20 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66  er writer;.    f
1dc30 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1dc40 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
1dc50 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77  ;..    pBuf = &w
1dc60 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
1dc70 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d 20 26  ;.    pPgidx = &
1dc80 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67  writer.writer.pg
1dc90 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73  idx;..    /* fts
1dca0 35 57 72 69 74 65 49 6e 69 74 28 29 20 73 68 6f  5WriteInit() sho
1dcb0 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69 61 6c  uld have initial
1dcc0 69 7a 65 64 20 74 68 65 20 62 75 66 66 65 72 73  ized the buffers
1dcd0 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79   to (most likely
1dce0 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78  ).    ** the max
1dcf0 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69  imum space requi
1dd00 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  red. */.    asse
1dd10 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75  rt( p->rc || pBu
1dd20 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a  f->nSpace>=(pgsz
1dd30 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44   + FTS5_DATA_PAD
1dd40 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61 73 73  DING) );.    ass
1dd50 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50  ert( p->rc || pP
1dd60 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70  gidx->nSpace>=(p
1dd70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
1dd80 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20  PADDING) );..   
1dd90 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69   /* Begin scanni
1dda0 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68 20  ng through hash 
1ddb0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 54  table entries. T
1ddc0 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  his loop runs on
1ddd0 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  ce for each.    
1dde0 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20  ** term/doclist 
1ddf0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1de00 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73 68   within the hash
1de10 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69   table. */.    i
1de20 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1de30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1de40 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
1de50 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61  HashScanInit(pHa
1de60 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  sh, 0, 0);.    }
1de70 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
1de80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1de90 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61  0==sqlite3Fts5Ha
1dea0 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29  shScanEof(pHash)
1deb0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1dec0 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
1ded0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1dee0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
1def0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1df00 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20  8 *pDoclist;    
1df10 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1df20 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  to doclist for t
1df30 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
1df40 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20    int nDoclist; 
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1df60 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
1df70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
1df80 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1df90 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65   term for this e
1dfa0 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  ntry to disk. */
1dfb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1dfc0 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
1dfd0 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
1dfe0 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c  pDoclist, &nDocl
1dff0 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ist);.      fts5
1e000 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
1e010 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69 6e 74  p, &writer, (int
1e020 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20  )strlen(zTerm), 
1e030 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d  (const u8*)zTerm
1e040 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
1e050 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52  ( writer.bFirstR
1e060 6f 77 69 64 49 6e 50 61 67 65 3d 3d 30 20 29 3b  owidInPage==0 );
1e070 0a 20 20 20 20 20 20 69 66 28 20 70 67 73 7a 3e  .      if( pgsz>
1e080 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69  =(pBuf->n + pPgi
1e090 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74  dx->n + nDoclist
1e0a0 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20   + 1) ){.       
1e0b0 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64   /* The entire d
1e0c0 6f 63 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oclist will fit 
1e0d0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
1e0e0 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eaf. */.        
1e0f0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
1e100 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
1e110 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73  Doclist, nDoclis
1e120 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
1e130 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f  .        i64 iRo
1e140 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wid = 0;.       
1e150 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
1e160 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
1e170 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  f = 0;..        
1e180 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f  /* The entire do
1e190 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66  clist will not f
1e1a0 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e  it on this leaf.
1e1b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   The following .
1e1c0 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20          ** loop 
1e1d0 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
1e1e0 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74 68   the poslists th
1e1f0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
1e200 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20  urrent .        
1e210 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a  ** doclist.  */.
1e220 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
1e230 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1e240 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  && iOff<nDoclist
1e250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1e260 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  t nPos;.        
1e270 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20 20 20    int nCopy;.   
1e280 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d         int bDumm
1e290 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  y;.          iOf
1e2a0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
1e2b0 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  nt(&pDoclist[iOf
1e2c0 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  f], (u64*)&iDelt
1e2d0 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  a);.          nC
1e2e0 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50 6f 73  opy = fts5GetPos
1e2f0 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63 6c 69  listSize(&pDocli
1e300 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c  st[iOff], &nPos,
1e310 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
1e320 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50       nCopy += nP
1e330 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52  os;.          iR
1e340 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
1e350 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
1e360 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72 2e       if( writer.
1e370 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1e380 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1e390 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42 75   fts5PutU16(&pBu
1e3a0 66 2d 3e 70 5b 30 5d 2c 20 28 75 31 36 29 70 42  f->p[0], (u16)pB
1e3b0 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72  uf->n);   /* fir
1e3c0 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1e3d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1e3e0 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1e3f0 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
1e400 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
1e410 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  ], iRowid);.    
1e420 20 20 20 20 20 20 20 20 77 72 69 74 65 72 2e 62          writer.b
1e430 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1e440 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1e450 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1e460 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74 65  Append(p, &write
1e470 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r, iRowid);.    
1e480 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e490 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e           pBuf->n
1e4a0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50   += sqlite3Fts5P
1e4b0 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  utVarint(&pBuf->
1e4c0 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c  p[pBuf->n], iDel
1e4d0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ta);.          }
1e4e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e4f0 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66  t( pBuf->n<=pBuf
1e500 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20 20  ->nSpace );..   
1e510 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66         if( (pBuf
1e520 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20  ->n + pPgidx->n 
1e530 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a  + nCopy) <= pgsz
1e540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e550 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f  /* The entire po
1e560 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f  slist will fit o
1e570 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  n the current le
1e580 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20 20  af. So copy.    
1e590 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 6e          ** it in
1e5a0 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20 20   one go. */.    
1e5b0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1e5c0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
1e5d0 28 70 42 75 66 2c 20 26 70 44 6f 63 6c 69 73 74  (pBuf, &pDoclist
1e5e0 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a  [iOff], nCopy);.
1e5f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1e600 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1e610 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69  The entire posli
1e620 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  st will not fit 
1e630 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53 6f  on this leaf. So
1e640 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20 20   it needs.      
1e650 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 62        ** to be b
1e660 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74 69  roken into secti
1e670 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75  ons. The only qu
1e680 61 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69 6e  alification bein
1e690 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  g.            **
1e6a0 20 74 68 61 74 20 65 61 63 68 20 76 61 72 69 6e   that each varin
1e6b0 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64  t must be stored
1e6c0 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20   contiguously.  
1e6d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
1e6e0 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69 73  onst u8 *pPoslis
1e6f0 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f  t = &pDoclist[iO
1e700 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ff];.           
1e710 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20   int iPos = 0;. 
1e720 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
1e730 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e750 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d      int nSpace =
1e760 20 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20   pgsz - pBuf->n 
1e770 2d 20 70 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20  - pPgidx->n;.   
1e780 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
1e790 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1e7a0 20 20 20 20 69 66 28 20 28 6e 43 6f 70 79 20 2d      if( (nCopy -
1e7b0 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29   iPos)<=nSpace )
1e7c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e7d0 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50    n = nCopy - iP
1e7e0 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
1e7f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e800 20 20 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73           n = fts
1e810 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26  5PoslistPrefix(&
1e820 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20  pPoslist[iPos], 
1e830 6e 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  nSpace);.       
1e840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e850 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1e860 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
1e870 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1e880 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
1e890 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f  f, &pPoslist[iPo
1e8a0 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  s], n);.        
1e8b0 20 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b        iPos += n;
1e8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1e8d0 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  f( (pBuf->n + pP
1e8e0 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29  gidx->n)>=pgsz )
1e8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e900 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1e910 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72 29  Leaf(p, &writer)
1e920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e930 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1e940 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20  if( iPos>=nCopy 
1e950 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
1e960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e970 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66   }.          iOf
1e980 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  f += nCopy;.    
1e990 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1e9a0 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20 44       /* TODO2: D
1e9b0 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  oclist terminato
1e9c0 72 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e 20  r written here. 
1e9d0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75 66  */.      /* pBuf
1e9e0 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
1e9f0 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20 20   '\0'; */.      
1ea00 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c  assert( pBuf->n<
1ea10 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b  =pBuf->nSpace );
1ea20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1ea30 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
1ea40 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Hash);.    }.   
1ea50 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1ea60 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
1ea70 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
1ea80 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70  h(p, &writer, &p
1ea90 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f  gnoLast);..    /
1eaa0 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73  * Update the Fts
1eab0 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20 69  5Structure. It i
1eac0 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74  s written back t
1ead0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
1eae0 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74 73  y the.    ** fts
1eaf0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1eb00 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20  e() call below. 
1eb10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72   */.    if( pStr
1eb20 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29  uct->nLevel==0 )
1eb30 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
1eb40 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70  ctureAddLevel(&p
1eb50 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b  ->rc, &pStruct);
1eb60 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
1eb70 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
1eb80 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
1eb90 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  uct, 0, 1, 0);. 
1eba0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1ebb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ebc0 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74   pSeg = &pStruct
1ebd0 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67  ->aLevel[0].aSeg
1ebe0 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  [ pStruct->aLeve
1ebf0 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20  l[0].nSeg++ ];. 
1ec00 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69       pSeg->iSegi
1ec10 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
1ec20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
1ec30 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65  t = 1;.      pSe
1ec40 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67  g->pgnoLast = pg
1ec50 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 53  noLast;.      pS
1ec60 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b  truct->nSegment+
1ec70 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  +;.    }.    fts
1ec80 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
1ec90 65 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29  e(p, 0, pStruct)
1eca0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64  ;.  }..  fts5Ind
1ecb0 65 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20 26  exAutomerge(p, &
1ecc0 70 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73  pStruct, pgnoLas
1ecd0 74 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 43  t);.  fts5IndexC
1ece0 72 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26 70  risismerge(p, &p
1ecf0 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53  Struct);.  fts5S
1ed00 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
1ed10 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73   pStruct);.  fts
1ed20 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1ed30 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f  e(pStruct);.}../
1ed40 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64  *.** Flush any d
1ed50 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
1ed60 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
1ed70 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64   tables to the d
1ed80 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1ed90 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1eda0 78 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65 78  xFlush(Fts5Index
1edb0 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73   *p){.  /* Unles
1edc0 73 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20 66  s it is empty, f
1edd0 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61  lush the hash ta
1ede0 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ble to disk */. 
1edf0 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   if( p->nPending
1ee00 44 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65  Data ){.    asse
1ee10 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a  rt( p->pHash );.
1ee20 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
1ee30 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73  ata = 0;.    fts
1ee40 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29  5FlushOneHash(p)
1ee50 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74 20 73 71  ;.  }.}...int sq
1ee60 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
1ee70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78  timize(Fts5Index
1ee80 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
1ee90 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
1eea0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1eeb0 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74  *pNew = 0;.  int
1eec0 20 6e 53 65 67 20 3d 20 30 3b 0a 0a 20 20 61 73   nSeg = 0;..  as
1eed0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
1eee0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
1eef0 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20  IndexFlush(p);. 
1ef00 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
1ef10 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
1ef20 0a 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  ..  if( pStruct 
1ef30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ef40 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
1ef50 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43  ==fts5StructureC
1ef60 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74  ountSegments(pSt
1ef70 72 75 63 74 29 20 29 3b 0a 20 20 20 20 6e 53 65  ruct) );.    nSe
1ef80 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  g = pStruct->nSe
1ef90 67 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e  gment;.    if( n
1efa0 53 65 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  Seg>1 ){.      i
1efb0 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
1efc0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
1efd0 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  ;.      nByte +=
1efe0 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65   (pStruct->nLeve
1eff0 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  l+1) * sizeof(Ft
1f000 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
1f010 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
1f020 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
1f030 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
1f040 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42  cZero(&p->rc, nB
1f050 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  yte);.    }.  }.
1f060 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
1f070 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
1f080 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
1f090 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 53 65 67  int nByte = nSeg
1f0a0 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
1f0b0 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
1f0c0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65  .    pNew->nLeve
1f0d0 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  l = pStruct->nLe
1f0e0 76 65 6c 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d  vel+1;.    pNew-
1f0f0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
1f100 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  New->nWriteCount
1f110 65 72 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  er = pStruct->nW
1f120 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20  riteCounter;.   
1f130 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61   pLvl = &pNew->a
1f140 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
1f150 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c  Level];.    pLvl
1f160 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 74  ->aSeg = (Fts5St
1f170 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29  ructureSegment*)
1f180 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
1f190 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42  cZero(&p->rc, nB
1f1a0 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  yte);.    if( pL
1f1b0 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20 20 20 20  vl->aSeg ){.    
1f1c0 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
1f1d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
1f1e0 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Out = 0;.      f
1f1f0 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
1f200 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
1f210 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
1f220 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
1f230 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
1f240 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
1f250 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
1f260 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65    pLvl->aSeg[iSe
1f270 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63 74 2d  gOut] = pStruct-
1f280 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
1f290 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
1f2a0 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b 0a 20      iSegOut++;. 
1f2b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f2c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65  .      pNew->nSe
1f2d0 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  gment = pLvl->nS
1f2e0 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20 20 7d  eg = nSeg;.    }
1f2f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1f300 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
1f310 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
1f320 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1f330 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74   pNew ){.    int
1f340 20 69 4c 76 6c 20 3d 20 70 4e 65 77 2d 3e 6e 4c   iLvl = pNew->nL
1f350 65 76 65 6c 2d 31 3b 0a 20 20 20 20 77 68 69 6c  evel-1;.    whil
1f360 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1f370 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c 65  _OK && pNew->aLe
1f380 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30  vel[iLvl].nSeg>0
1f390 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   ){.      int nR
1f3a0 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f  em = FTS5_OPT_WO
1f3b0 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20 66  RK_UNIT;.      f
1f3c0 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
1f3d0 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c 76  el(p, &pNew, iLv
1f3e0 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 7d  l, &nRem);.    }
1f3f0 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ..    fts5Struct
1f400 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e 65 77  ureWrite(p, pNew
1f410 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
1f420 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e 65 77  tureRelease(pNew
1f430 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 74  );.  }..  fts5St
1f440 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
1f450 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72  Struct);.  retur
1f460 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
1f470 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71  n(p); .}..int sq
1f480 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4d 65  lite3Fts5IndexMe
1f490 72 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  rge(Fts5Index *p
1f4a0 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20  , int nMerge){. 
1f4b0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1f4c0 70 53 74 72 75 63 74 3b 0a 0a 20 20 70 53 74 72  pStruct;..  pStr
1f4d0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1f4e0 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 66  ureRead(p);.  if
1f4f0 28 20 70 53 74 72 75 63 74 20 26 26 20 70 53 74  ( pStruct && pSt
1f500 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a  ruct->nLevel ){.
1f510 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
1f520 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  ge(p, &pStruct, 
1f530 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 66 74 73  nMerge);.    fts
1f540 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
1f550 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  p, pStruct);.  }
1f560 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
1f570 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
1f580 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ;..  return fts5
1f590 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
1f5a0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1f5b0 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ts5PoslistCallba
1f5c0 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ck(.  Fts5Index 
1f5d0 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  *p, .  void *pCo
1f5e0 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20  ntext, .  const 
1f5f0 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20  u8 *pChunk, int 
1f600 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 61 73 73 65  nChunk.){.  asse
1f610 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30  rt_nc( nChunk>=0
1f620 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b   );.  if( nChunk
1f630 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  >0 ){.    fts5Bu
1f640 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1f650 6f 62 28 28 46 74 73 35 42 75 66 66 65 72 2a 29  ob((Fts5Buffer*)
1f660 70 43 6f 6e 74 65 78 74 2c 20 70 43 68 75 6e 6b  pContext, pChunk
1f670 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d  , nChunk);.  }.}
1f680 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
1f690 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
1f6a0 43 74 78 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62  Ctx PoslistCallb
1f6b0 61 63 6b 43 74 78 3b 0a 73 74 72 75 63 74 20 50  ackCtx;.struct P
1f6c0 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
1f6d0 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72  x {.  Fts5Buffer
1f6e0 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20   *pBuf;         
1f6f0 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
1f700 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
1f710 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
1f720 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20  pColset;        
1f730 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20      /* Restrict 
1f740 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69 73 20  matches to this 
1f750 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
1f760 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
1f770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1f780 65 65 20 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a  ee above */.};..
1f790 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
1f7a0 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
1f7b0 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43   PoslistOffsetsC
1f7c0 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69  tx;.struct Posli
1f7d0 73 74 4f 66 66 73 65 74 73 43 74 78 20 7b 0a 20  stOffsetsCtx {. 
1f7e0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
1f7f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1f800 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
1f810 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46  is buffer */.  F
1f820 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
1f830 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
1f840 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68  * Restrict match
1f850 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d  es to this colum
1f860 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 61 64  n */.  int iRead
1f870 3b 0a 20 20 69 6e 74 20 69 57 72 69 74 65 3b 0a  ;.  int iWrite;.
1f880 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  };../*.** TODO: 
1f890 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72 65 20 65  Make this more e
1f8a0 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61  fficient!.*/.sta
1f8b0 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
1f8c0 78 43 6f 6c 73 65 74 54 65 73 74 28 46 74 73 35  xColsetTest(Fts5
1f8d0 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
1f8e0 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   int iCol){.  in
1f8f0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1f900 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b  i<pColset->nCol;
1f910 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
1f920 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d  Colset->aiCol[i]
1f930 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20  ==iCol ) return 
1f940 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1f950 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
1f960 64 20 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66  d fts5PoslistOff
1f970 73 65 74 73 43 61 6c 6c 62 61 63 6b 28 0a 20 20  setsCallback(.  
1f980 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1f990 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
1f9a0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
1f9b0 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
1f9c0 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 4f 66 66  .){.  PoslistOff
1f9d0 73 65 74 73 43 74 78 20 2a 70 43 74 78 20 3d 20  setsCtx *pCtx = 
1f9e0 28 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43  (PoslistOffsetsC
1f9f0 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20  tx*)pContext;.  
1fa00 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e  assert_nc( nChun
1fa10 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43  k>=0 );.  if( nC
1fa20 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 6e  hunk>0 ){.    in
1fa30 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  t i = 0;.    whi
1fa40 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a  le( i<nChunk ){.
1fa50 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a        int iVal;.
1fa60 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
1fa70 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 68 75  etVarint32(&pChu
1fa80 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20  nk[i], iVal);.  
1fa90 20 20 20 20 69 56 61 6c 20 2b 3d 20 70 43 74 78      iVal += pCtx
1faa0 2d 3e 69 52 65 61 64 20 2d 20 32 3b 0a 20 20 20  ->iRead - 2;.   
1fab0 20 20 20 70 43 74 78 2d 3e 69 52 65 61 64 20 3d     pCtx->iRead =
1fac0 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 66 28   iVal;.      if(
1fad0 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74   fts5IndexColset
1fae0 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73  Test(pCtx->pCols
1faf0 65 74 2c 20 69 56 61 6c 29 20 29 7b 0a 20 20 20  et, iVal) ){.   
1fb00 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1fb10 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
1fb20 70 43 74 78 2d 3e 70 42 75 66 2c 20 69 56 61 6c  pCtx->pBuf, iVal
1fb30 20 2b 20 32 20 2d 20 70 43 74 78 2d 3e 69 57 72   + 2 - pCtx->iWr
1fb40 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  ite);.        pC
1fb50 74 78 2d 3e 69 57 72 69 74 65 20 3d 20 69 56 61  tx->iWrite = iVa
1fb60 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
1fb70 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
1fb80 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 46  oid fts5PoslistF
1fb90 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 28 0a 20  ilterCallback(. 
1fba0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1fbb0 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
1fbc0 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
1fbd0 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
1fbe0 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43 61  k.){.  PoslistCa
1fbf0 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78 20  llbackCtx *pCtx 
1fc00 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  = (PoslistCallba
1fc10 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b  ckCtx*)pContext;
1fc20 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43  .  assert_nc( nC
1fc30 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28  hunk>=0 );.  if(
1fc40 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20   nChunk>0 ){.   
1fc50 20 2f 2a 20 53 65 61 72 63 68 20 74 68 72 6f 75   /* Search throu
1fc60 67 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66  gh to find the f
1fc70 69 72 73 74 20 76 61 72 69 6e 74 20 77 69 74 68  irst varint with
1fc80 20 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20 69   value 1. This i
1fc90 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61  s the.    ** sta
1fca0 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 63  rt of the next c
1fcb0 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f 0a  olumns hits. */.
1fcc0 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
1fcd0 20 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d 20     int iStart = 
1fce0 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 74 78  0;..    if( pCtx
1fcf0 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a 20  ->eState==2 ){. 
1fd00 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
1fd10 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
1fd20 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c  Varint32(pChunk,
1fd30 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20   i, iCol);.     
1fd40 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f   if( fts5IndexCo
1fd50 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70  lsetTest(pCtx->p
1fd60 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29 7b  Colset, iCol) ){
1fd70 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65  .        pCtx->e
1fd80 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
1fd90 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
1fda0 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43  eAppendVarint(pC
1fdb0 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20  tx->pBuf, 1);.  
1fdc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fdd0 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20     pCtx->eState 
1fde0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1fdf0 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   }..    do {.   
1fe00 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75     while( i<nChu
1fe10 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21  nk && pChunk[i]!
1fe20 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  =0x01 ){.       
1fe30 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69   while( pChunk[i
1fe40 5d 20 26 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a  ] & 0x80 ) i++;.
1fe50 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
1fe60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1fe70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Ctx->eState ){. 
1fe80 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1fe90 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
1fea0 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68  pCtx->pBuf, &pCh
1feb0 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69  unk[iStart], i-i
1fec0 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Start);.      }.
1fed0 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68 75        if( i<nChu
1fee0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  nk ){.        in
1fef0 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t iCol;.        
1ff00 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20  iStart = i;.    
1ff10 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
1ff20 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20 29   if( i>=nChunk )
1ff30 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  {.          pCtx
1ff40 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20  ->eState = 2;.  
1ff50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ff60 20 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47         fts5FastG
1ff70 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e  etVarint32(pChun
1ff80 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  k, i, iCol);.   
1ff90 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
1ffa0 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43  ate = fts5IndexC
1ffb0 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e  olsetTest(pCtx->
1ffc0 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a  pColset, iCol);.
1ffd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1ffe0 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  tx->eState ){.  
1fff0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
20000 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
20010 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26  ob(pCtx->pBuf, &
20020 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20  pChunk[iStart], 
20030 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  i-iStart);.     
20040 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
20050 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
20060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20070 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  .    }while( i<n
20080 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  Chunk );.  }.}..
20090 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
200a0 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
200b0 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64  oints to a valid
200c0 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29   entry (not EOF)
200d0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
200e0 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20 70  on appends the p
200f0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
20100 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  a for the curren
20110 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75  t entry to.** bu
20120 66 66 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f  ffer pBuf. It do
20130 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f  es not make a co
20140 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  py of the positi
20150 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20  on-list size.** 
20160 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
20170 20 76 6f 69 64 20 66 74 73 35 53 65 67 69 74 65   void fts5Segite
20180 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
20190 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
201a0 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20  SegIter *pSeg,. 
201b0 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
201c0 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66  lset,.  Fts5Buff
201d0 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66  er *pBuf.){.  if
201e0 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47  ( 0==fts5BufferG
201f0 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  row(&p->rc, pBuf
20200 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29 7b  , pSeg->nPos) ){
20210 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74  .    if( pColset
20220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
20230 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c  5ChunkIterate(p,
20240 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70 42   pSeg, (void*)pB
20250 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 43  uf, fts5PoslistC
20260 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65  allback);.    }e
20270 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
20280 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
20290 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
202a0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  FULL ){.        
202b0 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
202c0 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20  tx sCtx;.       
202d0 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75   sCtx.pBuf = pBu
202e0 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  f;.        sCtx.
202f0 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65  pColset = pColse
20300 74 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  t;.        sCtx.
20310 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64  eState = fts5Ind
20320 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f  exColsetTest(pCo
20330 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lset, 0);.      
20340 20 20 61 73 73 65 72 74 28 20 73 43 74 78 2e 65    assert( sCtx.e
20350 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78  State==0 || sCtx
20360 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20  .eState==1 );.  
20370 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
20380 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
20390 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74  (void*)&sCtx, ft
203a0 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
203b0 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
203c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
203d0 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
203e0 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20 6d   sCtx;.        m
203f0 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20  emset(&sCtx, 0, 
20400 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20  sizeof(sCtx));. 
20410 20 20 20 20 20 20 20 73 43 74 78 2e 70 42 75 66         sCtx.pBuf
20420 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20   = pBuf;.       
20430 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20   sCtx.pColset = 
20440 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20  pColset;.       
20450 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
20460 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64  e(p, pSeg, (void
20470 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73  *)&sCtx, fts5Pos
20480 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62  listOffsetsCallb
20490 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ack);.      }.  
204a0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
204b0 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65   IN/OUT paramete
204c0 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73 20 74  r (*pa) points t
204d0 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  o a position lis
204e0 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  t n bytes in siz
204f0 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73  e. If.** the pos
20500 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ition list conta
20510 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
20520 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65  column iCol, the
20530 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74 0a 2a  n (*pa) is set.*
20540 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  * to point to th
20550 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c  e sub-position-l
20560 69 73 74 20 66 6f 72 20 74 68 61 74 20 63 6f 6c  ist for that col
20570 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  umn and the numb
20580 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69  er of.** bytes i
20590 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e 20 4f  n it returned. O
205a0 72 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  r, if the argume
205b0 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
205c0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e   does not.** con
205d0 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69 65 73  tain any entries
205e0 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c   for column iCol
205f0 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
20600 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
20610 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 0a 20  dexExtractCol(. 
20620 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20   const u8 **pa, 
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20640 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e   /* IN/OUT: Poin
20650 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a  ter to poslist *
20660 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
20670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20680 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65 20      /* IN: Size 
20690 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79  of poslist in by
206a0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  tes */.  int iCo
206b0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
206c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
206d0 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 66 72  mn to extract fr
206e0 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b  om poslist */.){
206f0 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
20700 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
20710 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62     /* Anything b
20720 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
20730 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f  0x01 is col 0 */
20740 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d  .  const u8 *p =
20750 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38   *pa;.  const u8
20760 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20   *pEnd = &p[n]; 
20770 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
20780 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
20790 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
207a0 0a 20 20 75 38 20 70 72 65 76 20 3d 20 30 3b 0a  .  u8 prev = 0;.
207b0 0a 20 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e 69  .  while( iCol>i
207c0 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Current ){.    /
207d0 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65  * Advance pointe
207e0 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69  r p until it poi
207f0 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61  nts to pEnd or a
20800 6e 20 30 78 30 31 20 62 79 74 65 20 74 68 61 74  n 0x01 byte that
20810 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 70   is.    ** not p
20820 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20  art of a varint 
20830 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  */.    while( (p
20840 72 65 76 20 26 20 30 78 38 30 29 20 7c 7c 20 2a  rev & 0x80) || *
20850 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20  p!=0x01 ){.     
20860 20 70 72 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20 20   prev = *p++;.  
20870 20 20 20 20 69 66 28 20 70 3d 3d 70 45 6e 64 20      if( p==pEnd 
20880 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
20890 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b  }.    *pa = p++;
208a0 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65  .    p += fts5Ge
208b0 74 56 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75  tVarint32(p, iCu
208c0 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66  rrent);.  }.  if
208d0 28 20 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e 74  ( iCol!=iCurrent
208e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
208f0 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74  /* Advance point
20900 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f  er p until it po
20910 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20  ints to pEnd or 
20920 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68 61  an 0x01 byte tha
20930 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70 61  t is.  ** not pa
20940 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20 2a  rt of a varint *
20950 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 72 65  /.  assert( (pre
20960 76 20 26 20 30 78 38 30 29 3d 3d 30 20 29 3b 0a  v & 0x80)==0 );.
20970 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20    while( p<pEnd 
20980 26 26 20 28 28 70 72 65 76 20 26 20 30 78 38 30  && ((prev & 0x80
20990 29 20 7c 7c 20 2a 70 21 3d 30 78 30 31 29 20 29  ) || *p!=0x01) )
209a0 7b 0a 20 20 20 20 70 72 65 76 20 3d 20 2a 70 2b  {.    prev = *p+
209b0 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
209c0 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74  p - (*pa);.}..st
209d0 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 70 70  atic int fts5App
209e0 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35  endRowid(.  Fts5
209f0 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20  Index *p,.  i64 
20a00 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 6e  iDelta,.  Fts5In
20a10 64 65 78 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c  dexIter *pMulti,
20a20 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
20a30 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75  Colset,.  Fts5Bu
20a40 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
20a50 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
20a60 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70  Varint(&p->rc, p
20a70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20  Buf, iDelta);.  
20a80 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
20a90 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c  ** Iterator pMul
20aa0 74 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ti currently poi
20ab0 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65  nts to a valid e
20ac0 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20  ntry (not EOF). 
20ad0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
20ae0 20 61 70 70 65 6e 64 73 20 74 68 65 20 66 6f 6c   appends the fol
20af0 6c 6f 77 69 6e 67 20 74 6f 20 62 75 66 66 65 72  lowing to buffer
20b00 20 70 42 75 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   pBuf:.**.**   *
20b10 20 54 68 65 20 76 61 72 69 6e 74 20 69 44 65 6c   The varint iDel
20b20 74 61 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  ta, and.**   * t
20b30 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
20b40 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
20b50 70 6f 69 6e 74 73 20 74 6f 2c 20 69 6e 63 6c 75  points to, inclu
20b60 64 69 6e 67 20 74 68 65 20 73 69 7a 65 20 66 69  ding the size fi
20b70 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  eld..**.** If ar
20b80 67 75 6d 65 6e 74 20 70 43 6f 6c 73 65 74 20 69  gument pColset i
20b90 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
20ba0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69   position list i
20bb0 73 20 66 69 6c 74 65 72 65 64 20 61 63 63 6f 72  s filtered accor
20bc0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 43 6f 6c 73  ding.** to pCols
20bd0 65 74 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  et before being 
20be0 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
20bf0 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
20c00 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 0a  means there are.
20c10 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 20 69 6e  ** no entries in
20c20 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
20c30 73 74 2c 20 6e 6f 74 68 69 6e 67 20 69 73 20 61  st, nothing is a
20c40 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
20c50 75 66 66 65 72 20 28 6e 6f 74 0a 2a 2a 20 65 76  uffer (not.** ev
20c60 65 6e 20 69 44 65 6c 74 61 29 2e 0a 2a 2a 0a 2a  en iDelta)..**.*
20c70 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
20c80 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
20c90 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70  ode is left in p
20ca0 2d 3e 72 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ->rc. .*/.static
20cb0 20 69 6e 74 20 66 74 73 35 41 70 70 65 6e 64 50   int fts5AppendP
20cc0 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e  oslist(.  Fts5In
20cd0 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44  dex *p,.  i64 iD
20ce0 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 6e 64 65  elta,.  Fts5Inde
20cf0 78 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20  xIter *pMulti,. 
20d00 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
20d10 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66  lset,.  Fts5Buff
20d20 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66  er *pBuf.){.  if
20d30 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
20d40 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  OK ){.    Fts5Se
20d50 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
20d60 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75  Multi->aSeg[ pMu
20d70 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  lti->aFirst[1].i
20d80 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 61 73 73  First ];.    ass
20d90 65 72 74 28 20 66 74 73 35 4d 75 6c 74 69 49 74  ert( fts5MultiIt
20da0 65 72 45 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29  erEof(p, pMulti)
20db0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
20dc0 74 28 20 70 53 65 67 2d 3e 6e 50 6f 73 3e 30 20  t( pSeg->nPos>0 
20dd0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 66 74  );.    if( 0==ft
20de0 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
20df0 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d  >rc, pBuf, pSeg-
20e00 3e 6e 50 6f 73 2b 39 2b 39 29 20 29 7b 0a 20 20  >nPos+9+9) ){.  
20e10 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
20e20 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
20e30 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 0a 20 20  5_DETAIL_FULL.  
20e40 20 20 20 20 20 26 26 20 70 53 65 67 2d 3e 69 4c       && pSeg->iL
20e50 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e  eafOffset+pSeg->
20e60 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61  nPos<=pSeg->pLea
20e70 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20 20  f->szLeaf .     
20e80 20 20 26 26 20 28 70 43 6f 6c 73 65 74 3d 3d 30    && (pColset==0
20e90 20 7c 7c 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f   || pColset->nCo
20ea0 6c 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  l==1).      ){. 
20eb0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20         const u8 
20ec0 2a 70 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70  *pPos = &pSeg->p
20ed0 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c  Leaf->p[pSeg->iL
20ee0 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  eafOffset];.    
20ef0 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
20f00 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65        if( pColse
20f10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  t ){.          n
20f20 50 6f 73 20 3d 20 66 74 73 35 49 6e 64 65 78 45  Pos = fts5IndexE
20f30 78 74 72 61 63 74 43 6f 6c 28 26 70 50 6f 73 2c  xtractCol(&pPos,
20f40 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 70 43 6f   pSeg->nPos, pCo
20f50 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b  lset->aiCol[0]);
20f60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
20f70 50 6f 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Pos==0 ) return 
20f80 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
20f90 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73  {.          nPos
20fa0 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20   = pSeg->nPos;. 
20fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20fc0 20 61 73 73 65 72 74 28 20 6e 50 6f 73 3e 30 20   assert( nPos>0 
20fd0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
20fe0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
20ff0 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65 6c  arint(pBuf, iDel
21000 74 61 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ta);.        fts
21010 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
21020 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 6e 50  dVarint(pBuf, nP
21030 6f 73 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 66  os*2);.        f
21040 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
21050 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 50  endBlob(pBuf, pP
21060 6f 73 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20  os, nPos);.     
21070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21080 69 6e 74 20 69 53 76 31 3b 0a 20 20 20 20 20 20  int iSv1;.      
21090 20 20 69 6e 74 20 69 53 76 32 3b 0a 20 20 20 20    int iSv2;.    
210a0 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 0a      int iData;..
210b0 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e          /* Appen
210c0 64 20 69 44 65 6c 74 61 20 2a 2f 0a 20 20 20 20  d iDelta */.    
210d0 20 20 20 20 69 53 76 31 20 3d 20 70 42 75 66 2d      iSv1 = pBuf-
210e0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  >n;.        fts5
210f0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
21100 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65  Varint(pBuf, iDe
21110 6c 74 61 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  lta);..        /
21120 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
21130 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 53  ZE */.        iS
21140 76 32 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20  v2 = pBuf->n;.  
21150 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21160 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
21170 28 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f  (pBuf, pSeg->nPo
21180 73 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 69 44  s*2);.        iD
21190 61 74 61 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 0a  ata = pBuf->n;..
211a0 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 69          fts5Segi
211b0 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 53  terPoslist(p, pS
211c0 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20 70 42 75  eg, pColset, pBu
211d0 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  f);..        if(
211e0 20 70 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20   pColset ){.    
211f0 20 20 20 20 20 20 69 6e 74 20 6e 41 63 74 75 61        int nActua
21200 6c 20 3d 20 70 42 75 66 2d 3e 6e 20 2d 20 69 44  l = pBuf->n - iD
21210 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ata;.          i
21220 66 28 20 6e 41 63 74 75 61 6c 21 3d 70 53 65 67  f( nActual!=pSeg
21230 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20 20  ->nPos ){.      
21240 20 20 20 20 20 20 69 66 28 20 6e 41 63 74 75 61        if( nActua
21250 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
21260 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20        pBuf->n = 
21270 69 53 76 31 3b 0a 20 20 20 20 20 20 20 20 20 20  iSv1;.          
21280 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
21290 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
212a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
212b0 6e 74 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65  nt nReq = sqlite
212c0 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65  3Fts5GetVarintLe
212d0 6e 28 28 75 33 32 29 28 6e 41 63 74 75 61 6c 2a  n((u32)(nActual*
212e0 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  2));.           
212f0 20 20 20 77 68 69 6c 65 28 20 69 53 76 32 3c 28     while( iSv2<(
21300 69 44 61 74 61 2d 6e 52 65 71 29 20 29 7b 20 70  iData-nReq) ){ p
21310 42 75 66 2d 3e 70 5b 69 53 76 32 2b 2b 5d 20 3d  Buf->p[iSv2++] =
21320 20 30 78 38 30 3b 20 7d 0a 20 20 20 20 20 20 20   0x80; }.       
21330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
21340 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
21350 66 2d 3e 70 5b 69 53 76 32 5d 2c 20 6e 41 63 74  f->p[iSv2], nAct
21360 75 61 6c 2a 32 29 3b 0a 20 20 20 20 20 20 20 20  ual*2);.        
21370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21380 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21390 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
213a0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 73   return 0;.}...s
213b0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
213c0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46  oclistIterNext(F
213d0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a  ts5DoclistIter *
213e0 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 70 20  pIter){.  u8 *p 
213f0 3d 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73  = pIter->aPoslis
21400 74 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65  t + pIter->nSize
21410 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69   + pIter->nPosli
21420 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  st;..  assert( p
21430 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29  Iter->aPoslist )
21440 3b 0a 20 20 69 66 28 20 70 3e 3d 70 49 74 65 72  ;.  if( p>=pIter
21450 2d 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20 70 49  ->aEof ){.    pI
21460 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20  ter->aPoslist = 
21470 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
21480 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20  i64 iDelta;..   
21490 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   p += fts5GetVar
214a0 69 6e 74 28 70 2c 20 28 75 36 34 2a 29 26 69 44  int(p, (u64*)&iD
214b0 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72  elta);.    pIter
214c0 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
214d0 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  ta;..    /* Read
214e0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
214f0 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ize */.    if( p
21500 5b 30 5d 20 26 20 30 78 38 30 20 29 7b 0a 20 20  [0] & 0x80 ){.  
21510 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
21520 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65      pIter->nSize
21530 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
21540 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  32(p, nPos);.   
21550 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69     pIter->nPosli
21560 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a  st = (nPos>>1);.
21570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21580 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
21590 20 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d 29 29   = ((int)(p[0]))
215a0 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70 49 74   >> 1;.      pIt
215b0 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20  er->nSize = 1;. 
215c0 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d     }..    pIter-
215d0 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20  >aPoslist = p;. 
215e0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
215f0 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65  d fts5DoclistIte
21600 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66  rInit(.  Fts5Buf
21610 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74  fer *pBuf, .  Ft
21620 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
21630 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  Iter.){.  memset
21640 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
21650 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
21660 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20  ter->aPoslist = 
21670 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72  pBuf->p;.  pIter
21680 2d 3e 61 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e  ->aEof = &pBuf->
21690 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74  p[pBuf->n];.  ft
216a0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
216b0 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66  t(pIter);.}..#if
216c0 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20   0./*.** Append 
216d0 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66  a doclist to buf
216e0 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
216f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
21700 73 75 6d 65 73 20 74 68 61 74 20 73 70 61 63 65  sumes that space
21710 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
21720 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  er has already b
21730 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  een.** allocated
21740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21750 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
21760 44 6f 63 69 64 28 0a 20 20 46 74 73 35 42 75 66  Docid(.  Fts5Buf
21770 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20  fer *pBuf,      
21780 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
21790 65 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  er to write to *
217a0 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52  /.  i64 *piLastR
217b0 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
217c0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
217d0 72 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72  revious rowid wr
217e0 69 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a  itten (if any) *
217f0 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20  /.  i64 iRowid  
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20      /* Rowid to 
21820 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61  append */.){.  a
21830 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d  ssert( pBuf->n!=
21840 30 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77  0 || (*piLastRow
21850 69 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35  id)==0 );.  fts5
21860 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
21870 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 52 6f  Varint(pBuf, iRo
21880 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77  wid - *piLastRow
21890 69 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f  id);.  *piLastRo
218a0 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a  wid = iRowid;.}.
218b0 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
218c0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
218d0 6f 63 69 64 28 70 42 75 66 2c 20 69 4c 61 73 74  ocid(pBuf, iLast
218e0 52 6f 77 69 64 2c 20 69 52 6f 77 69 64 29 20 7b  Rowid, iRowid) {
218f0 20 20 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72         \.  asser
21900 74 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20  t( (pBuf)->n!=0 
21910 7c 7c 20 28 69 4c 61 73 74 52 6f 77 69 64 29 3d  || (iLastRowid)=
21920 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
21930 20 20 20 20 20 20 20 20 5c 0a 20 20 66 74 73 35          \.  fts5
21940 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
21950 56 61 72 69 6e 74 28 28 70 42 75 66 29 2c 20 28  Varint((pBuf), (
21960 69 52 6f 77 69 64 29 20 2d 20 28 69 4c 61 73 74  iRowid) - (iLast
21970 52 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c  Rowid)); \.  (iL
21980 61 73 74 52 6f 77 69 64 29 20 3d 20 28 69 52 6f  astRowid) = (iRo
21990 77 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20  wid);           
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f            \.}../
219c0 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 63 6f  *.** Swap the co
219d0 6e 74 65 6e 74 73 20 6f 66 20 62 75 66 66 65 72  ntents of buffer
219e0 20 2a 70 31 20 77 69 74 68 20 74 68 61 74 20 6f   *p1 with that o
219f0 66 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  f *p2..*/.static
21a00 20 76 6f 69 64 20 66 74 73 35 42 75 66 66 65 72   void fts5Buffer
21a10 53 77 61 70 28 46 74 73 35 42 75 66 66 65 72 20  Swap(Fts5Buffer 
21a20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65 72 20  *p1, Fts5Buffer 
21a30 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66  *p2){.  Fts5Buff
21a40 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20  er tmp = *p1;.  
21a50 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32  *p1 = *p2;.  *p2
21a60 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69   = tmp;.}..stati
21a70 63 20 76 6f 69 64 20 66 74 73 35 4e 65 78 74 52  c void fts5NextR
21a80 6f 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20  owid(Fts5Buffer 
21a90 2a 70 42 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66  *pBuf, int *piOf
21aa0 66 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64 29  f, i64 *piRowid)
21ab0 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f  {.  int i = *piO
21ac0 66 66 3b 0a 20 20 69 66 28 20 69 3e 3d 70 42 75  ff;.  if( i>=pBu
21ad0 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f  f->n ){.    *piO
21ae0 66 66 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  ff = -1;.  }else
21af0 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a  {.    u64 iVal;.
21b00 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b      *piOff = i +
21b10 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
21b20 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69  arint(&pBuf->p[i
21b30 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a  ], &iVal);.    *
21b40 70 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b  piRowid += iVal;
21b50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
21b60 69 73 20 69 73 20 74 68 65 20 65 71 75 69 76 61  is is the equiva
21b70 6c 65 6e 74 20 6f 66 20 66 74 73 35 4d 65 72 67  lent of fts5Merg
21b80 65 50 72 65 66 69 78 4c 69 73 74 73 28 29 20 66  ePrefixLists() f
21b90 6f 72 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d  or detail=none m
21ba0 6f 64 65 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ode..** In this 
21bb0 63 61 73 65 20 74 68 65 20 62 75 66 66 65 72 73  case the buffers
21bc0 20 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 64 65   consist of a de
21bd0 6c 74 61 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74  lta-encoded list
21be0 20 6f 66 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e   of rowids only.
21bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21c00 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69  fts5MergeRowidLi
21c10 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sts(.  Fts5Index
21c20 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
21c30 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
21c40 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
21c50 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
21c60 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
21c70 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74     /* First list
21c80 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46   to merge */.  F
21c90 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20  ts5Buffer *p2   
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21cb0 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f  * Second list to
21cc0 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
21cd0 6e 74 20 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74  nt i1 = 0;.  int
21ce0 20 69 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69   i2 = 0;.  i64 i
21cf0 52 6f 77 69 64 31 20 3d 20 30 3b 0a 20 20 69 36  Rowid1 = 0;.  i6
21d00 34 20 69 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20  4 iRowid2 = 0;. 
21d10 20 69 36 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a   i64 iOut = 0;..
21d20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74    Fts5Buffer out
21d30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c  ;.  memset(&out,
21d40 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29   0, sizeof(out))
21d50 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  ;.  sqlite3Fts5B
21d60 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
21d70 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20  , &out, p1->n + 
21d80 70 32 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d  p2->n);.  if( p-
21d90 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  >rc ) return;.. 
21da0 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70   fts5NextRowid(p
21db0 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31  1, &i1, &iRowid1
21dc0 29 3b 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77  );.  fts5NextRow
21dd0 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f  id(p2, &i2, &iRo
21de0 77 69 64 32 29 3b 0a 20 20 77 68 69 6c 65 28 20  wid2);.  while( 
21df0 69 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29  i1>=0 || i2>=0 )
21e00 7b 0a 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20  {.    if( i1>=0 
21e10 26 26 20 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77  && (i2<0 || iRow
21e20 69 64 31 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a  id1<iRowid2) ){.
21e30 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21e40 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
21e50 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 31 20 2d  (&out, iRowid1 -
21e60 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f   iOut);.      iO
21e70 75 74 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20 20  ut = iRowid1;.  
21e80 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69      fts5NextRowi
21e90 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77  d(p1, &i1, &iRow
21ea0 69 64 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  id1);.    }else{
21eb0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
21ec0 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
21ed0 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 32 20  t(&out, iRowid2 
21ee0 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69  - iOut);.      i
21ef0 4f 75 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20  Out = iRowid2;. 
21f00 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77       fts5NextRow
21f10 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f  id(p2, &i2, &iRo
21f20 77 69 64 32 29 3b 0a 20 20 20 20 20 20 69 66 28  wid2);.      if(
21f30 20 69 31 3e 3d 30 20 26 26 20 69 52 6f 77 69 64   i1>=0 && iRowid
21f40 31 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a 20 20  1==iRowid2 ){.  
21f50 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f        fts5NextRo
21f60 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52  wid(p1, &i1, &iR
21f70 6f 77 69 64 31 29 3b 0a 20 20 20 20 20 20 7d 0a  owid1);.      }.
21f80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
21f90 35 42 75 66 66 65 72 53 77 61 70 28 26 6f 75 74  5BufferSwap(&out
21fa0 2c 20 70 31 29 3b 0a 20 20 66 74 73 35 42 75 66  , p1);.  fts5Buf
21fb0 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d  ferFree(&out);.}
21fc0 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20  ../*.** Buffers 
21fd0 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69  p1 and p2 contai
21fe0 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73  n doclists. This
21ff0 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73   function merges
22000 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
22010 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69  of the two docli
22020 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64  sts together and
22030 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20   sets buffer p1 
22040 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65  to the result be
22050 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
22060 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
22070 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
22080 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
22090 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20  ft in p->rc. If 
220a0 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20  an error has.** 
220b0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
220c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
220d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
220e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
220f0 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28  ergePrefixLists(
22100 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22120 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
22130 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
22140 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20  ts5Buffer *p1,  
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22160 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20  * First list to 
22170 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42  merge */.  Fts5B
22180 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20  uffer *p2       
22190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
221a0 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72  cond list to mer
221b0 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ge */.){.  if( p
221c0 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20  2->n ){.    i64 
221d0 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
221e0 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
221f0 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35  ter i1;.    Fts5
22200 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a  DoclistIter i2;.
22210 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f      Fts5Buffer o
22220 75 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  ut;.    Fts5Buff
22230 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73  er tmp;.    mems
22240 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65  et(&out, 0, size
22250 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65  of(out));.    me
22260 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69  mset(&tmp, 0, si
22270 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20  zeof(tmp));..   
22280 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
22290 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
222a0 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d  out, p1->n + p2-
222b0 3e 6e 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  >n);.    fts5Doc
222c0 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c  listIterInit(p1,
222d0 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44   &i1);.    fts5D
222e0 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70  oclistIterInit(p
222f0 32 2c 20 26 69 32 29 3b 0a 20 20 20 20 77 68 69  2, &i2);.    whi
22300 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
22310 45 5f 4f 4b 20 26 26 20 28 69 31 2e 61 50 6f 73  E_OK && (i1.aPos
22320 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61 50  list!=0 || i2.aP
22330 6f 73 6c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  oslist!=0) ){.  
22340 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f 73 6c      if( i2.aPosl
22350 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e 61 50  ist==0 || (i1.aP
22360 6f 73 6c 69 73 74 20 26 26 20 69 31 2e 69 52 6f  oslist && i1.iRo
22370 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 29 20 29  wid<i2.iRowid) )
22380 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  {.        /* Cop
22390 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31 20  y entry from i1 
223a0 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  */.        fts5M
223b0 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
223c0 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
223d0 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i1.iRowid);.  
223e0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
223f0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
22400 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74  out, i1.aPoslist
22410 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69 31  , i1.nPoslist+i1
22420 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  .nSize);.       
22430 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
22440 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20  Next(&i1);.     
22450 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
22460 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  ( i1.aPoslist==0
22470 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d 69   || i2.iRowid!=i
22480 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  1.iRowid ){.    
22490 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72      /* Copy entr
224a0 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20  y from i2 */.   
224b0 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
224c0 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20  pendDocid(&out, 
224d0 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69  iLastRowid, i2.i
224e0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
224f0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
22500 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69  pendBlob(&out, i
22510 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e  2.aPoslist, i2.n
22520 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53 69 7a 65  Poslist+i2.nSize
22530 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
22540 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
22550 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i2);.      }.   
22560 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20     else{.       
22570 20 69 36 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a   i64 iPos1 = 0;.
22580 20 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73          i64 iPos
22590 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
225a0 6e 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20 20  nt iOff1 = 0;.  
225b0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 32 20        int iOff2 
225c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
225d0 2a 61 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c 69  *a1 = &i1.aPosli
225e0 73 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20  st[i1.nSize];.  
225f0 20 20 20 20 20 20 75 38 20 2a 61 32 20 3d 20 26        u8 *a2 = &
22600 69 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e 6e  i2.aPoslist[i2.n
22610 53 69 7a 65 5d 3b 0a 0a 20 20 20 20 20 20 20 20  Size];..        
22620 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
22630 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 20 20  r writer;.      
22640 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72    memset(&writer
22650 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 72 69 74  , 0, sizeof(writ
22660 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  er));..        /
22670 2a 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20  * Merge the two 
22680 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20  position lists. 
22690 2a 2f 20 0a 20 20 20 20 20 20 20 20 66 74 73 35  */ .        fts5
226a0 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
226b0 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
226c0 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i2.iRowid);. 
226d0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
226e0 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 0a 20 20  rZero(&tmp);..  
226f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
22700 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
22710 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  1, i1.nPoslist, 
22720 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b  &iOff1, &iPos1);
22730 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22740 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
22750 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  4(a2, i2.nPoslis
22760 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73  t, &iOff2, &iPos
22770 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 77 68 69  2);..        whi
22780 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
22790 45 5f 4f 4b 20 26 26 20 28 69 50 6f 73 31 3e 3d  E_OK && (iPos1>=
227a0 30 20 7c 7c 20 69 50 6f 73 32 3e 3d 30 29 20 29  0 || iPos2>=0) )
227b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
227c0 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
227d0 69 66 28 20 69 50 6f 73 32 3c 30 20 7c 7c 20 28  if( iPos2<0 || (
227e0 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73  iPos1>=0 && iPos
227f0 31 3c 69 50 6f 73 32 29 20 29 7b 0a 20 20 20 20  1<iPos2) ){.    
22800 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 69          iNew = i
22810 50 6f 73 31 3b 0a 20 20 20 20 20 20 20 20 20 20  Pos1;.          
22820 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
22830 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69  listNext64(a1, i
22840 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
22850 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20  f1, &iPos1);.   
22860 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22870 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
22880 20 69 50 6f 73 32 3b 0a 20 20 20 20 20 20 20 20   iPos2;.        
22890 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
228a0 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c  oslistNext64(a2,
228b0 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i2.nPoslist, &i
228c0 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20  Off2, &iPos2);. 
228d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
228e0 50 6f 73 31 3d 3d 69 50 6f 73 32 20 29 7b 0a 20  Pos1==iPos2 ){. 
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22900 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
22910 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f  ext64(a1, i1.nPo
22920 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 26 69  slist, &iOff1,&i
22930 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
22940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
22950 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
22960 4e 65 77 21 3d 77 72 69 74 65 72 2e 69 50 72 65  New!=writer.iPre
22970 76 20 7c 7c 20 74 6d 70 2e 6e 3d 3d 30 20 29 7b  v || tmp.n==0 ){
22980 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
22990 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
229a0 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70  PoslistWriterApp
229b0 65 6e 64 28 26 74 6d 70 2c 20 26 77 72 69 74 65  end(&tmp, &write
229c0 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, iNew);.      
229d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
229e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54  .        /* WRIT
229f0 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
22a00 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
22a10 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
22a20 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a  nt(&out, tmp.n *
22a30 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   2);.        fts
22a40 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
22a50 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e  dBlob(&out, tmp.
22a60 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20  p, tmp.n);.     
22a70 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
22a80 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
22a90 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
22aa0 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
22ab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
22ac0 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
22ad0 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e  &p->rc, p1, out.
22ae0 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66  n, out.p);.    f
22af0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
22b00 6d 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  mp);.    fts5Buf
22b10 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 20  ferFree(&out);. 
22b20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
22b30 64 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69  d fts5SetupPrefi
22b40 78 49 74 65 72 28 0a 20 20 46 74 73 35 49 6e 64  xIter(.  Fts5Ind
22b50 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
22b60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
22b70 78 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  x to read from *
22b80 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20  /.  int bDesc,  
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
22bb0 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20  "ORDER BY rowid 
22bc0 44 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74  DESC" */.  const
22bd0 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20   u8 *pToken,    
22be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
22bf0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
22c00 70 72 65 66 69 78 20 74 6f 20 6d 61 74 63 68 20  prefix to match 
22c10 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  */.  int nToken,
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22c40 62 75 66 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e  buffer pToken in
22c50 20 62 79 74 65 73 20 2a 2f 0a 20 20 46 74 73 35   bytes */.  Fts5
22c60 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
22c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22c80 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20  estrict matches 
22c90 74 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  to these columns
22ca0 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
22cb0 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20  ter **ppIter    
22cc0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
22cd0 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  w iterator */.){
22ce0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
22cf0 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
22d00 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20  5Buffer *aBuf;. 
22d10 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20   const int nBuf 
22d20 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a  = 32;..  void (*
22d30 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64 65  xMerge)(Fts5Inde
22d40 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c  x*, Fts5Buffer*,
22d50 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20   Fts5Buffer*);. 
22d60 20 69 6e 74 20 28 2a 78 41 70 70 65 6e 64 29 28   int (*xAppend)(
22d70 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36 34 2c  Fts5Index*, i64,
22d80 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 2c   Fts5IndexIter*,
22d90 20 46 74 73 35 43 6f 6c 73 65 74 2a 2c 20 46 74   Fts5Colset*, Ft
22da0 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66  s5Buffer*);.  if
22db0 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
22dc0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
22dd0 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78  IL_NONE ){.    x
22de0 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67  Merge = fts5Merg
22df0 65 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20  eRowidLists;.   
22e00 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41   xAppend = fts5A
22e10 70 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65  ppendRowid;.  }e
22e20 6c 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20  lse{.    xMerge 
22e30 3d 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69  = fts5MergePrefi
22e40 78 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70  xLists;.    xApp
22e50 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64  end = fts5Append
22e60 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Poslist;.  }..  
22e70 61 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66  aBuf = (Fts5Buff
22e80 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
22e90 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
22ea0 42 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20  Buffer)*nBuf);. 
22eb0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
22ec0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
22ed0 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20  ..  if( aBuf && 
22ee0 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63  pStruct ){.    c
22ef0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
22f00 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
22f10 5f 53 43 41 4e 3b 0a 20 20 20 20 69 6e 74 20 69  _SCAN;.    int i
22f20 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  ;.    i64 iLastR
22f30 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
22f40 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 31 20  s5IndexIter *p1 
22f50 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72  = 0;     /* Iter
22f60 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74  ator used to gat
22f70 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e  her data from in
22f80 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  dex */.    Fts5D
22f90 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
22fa0 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69  Fts5Buffer docli
22fb0 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77  st;.    int bNew
22fc0 54 65 72 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d  Term = 1;..    m
22fd0 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20  emset(&doclist, 
22fe0 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73  0, sizeof(doclis
22ff0 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  t));.    for(fts
23000 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
23010 20 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61   pStruct, 1, fla
23020 67 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  gs, pToken, nTok
23030 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b  en, -1, 0, &p1);
23040 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
23050 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29  tiIterEof(p, p1)
23060 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ==0;.        fts
23070 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28  5MultiIterNext2(
23080 70 2c 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d  p, p1, &bNewTerm
23090 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
230a0 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
230b0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
230c0 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  1);.      int nT
230d0 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  erm;.      const
230e0 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73   u8 *pTerm = fts
230f0 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
23100 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  1, &nTerm);.    
23110 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d    assert_nc( mem
23120 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
23130 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e  m, MIN(nToken, n
23140 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20  Term))<=0 );.   
23150 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20     if( bNewTerm 
23160 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
23170 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d  Term<nToken || m
23180 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
23190 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62  erm, nToken) ) b
231a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
231b0 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74       if( doclist
231c0 2e 6e 3e 30 20 26 26 20 69 52 6f 77 69 64 3c 3d  .n>0 && iRowid<=
231d0 69 4c 61 73 74 52 6f 77 69 64 20 29 7b 0a 20 20  iLastRowid ){.  
231e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
231f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
23200 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b  && doclist.n; i+
23210 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
23220 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a  sert( i<nBuf );.
23230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42            if( aB
23240 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  uf[i].n==0 ){.  
23250 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
23260 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73  fferSwap(&doclis
23270 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
23280 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
23290 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73  fferZero(&doclis
232a0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
232b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
232c0 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c   xMerge(p, &docl
232d0 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
232e0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
232f0 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66  BufferZero(&aBuf
23300 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
23310 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
23320 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d      iLastRowid =
23330 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
23340 20 20 20 69 66 28 20 21 78 41 70 70 65 6e 64 28     if( !xAppend(
23350 70 2c 20 69 52 6f 77 69 64 2d 69 4c 61 73 74 52  p, iRowid-iLastR
23360 6f 77 69 64 2c 20 70 31 2c 20 70 43 6f 6c 73 65  owid, p1, pColse
23370 74 2c 20 26 64 6f 63 6c 69 73 74 29 20 29 7b 0a  t, &doclist) ){.
23380 20 20 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77          iLastRow
23390 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  id = iRowid;.   
233a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
233b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b  for(i=0; i<nBuf;
233c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
233d0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
233e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4d 65  K ){.        xMe
233f0 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c  rge(p, &doclist,
23400 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
23410 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75    }.      fts5Bu
23420 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b 69  fferFree(&aBuf[i
23430 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ]);.    }.    ft
23440 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
23450 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44 61  p, p1);..    pDa
23460 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  ta = fts5IdxMall
23470 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
23480 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69 73 74  5Data) + doclist
23490 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61  .n);.    if( pDa
234a0 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74  ta ){.      pDat
234b0 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44 61  a->p = (u8*)&pDa
234c0 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44 61  ta[1];.      pDa
234d0 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e  ta->nn = pData->
234e0 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73 74  szLeaf = doclist
234f0 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  .n;.      memcpy
23500 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69  (pData->p, docli
23510 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29  st.p, doclist.n)
23520 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
23530 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44 61  iIterNew2(p, pDa
23540 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74 65  ta, bDesc, ppIte
23550 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  r);.    }.    ft
23560 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64 6f  s5BufferFree(&do
23570 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66  clist);.  }..  f
23580 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
23590 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
235a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75  sqlite3_free(aBu
235b0 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  f);.}.../*.** In
235c0 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20  dicate that all 
235d0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
235e0 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
235f0 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72 74  ndexWrite() pert
23600 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f  ain.** to the do
23610 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69  cument with rowi
23620 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  d iRowid..*/.int
23630 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
23640 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73 35  xBeginWrite(Fts5
23650 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44  Index *p, int bD
23660 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77 69  elete, i64 iRowi
23670 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  d){.  assert( p-
23680 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
23690 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
236a0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
236b0 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
236c0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
236d0 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
236e0 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >pHash==0 ){.   
236f0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
23700 46 74 73 35 48 61 73 68 4e 65 77 28 70 2d 3e 70  Fts5HashNew(p->p
23710 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70 48 61 73  Config, &p->pHas
23720 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  h, &p->nPendingD
23730 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ata);.  }..  /* 
23740 46 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74  Flush the hash t
23750 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 69 66 20  able to disk if 
23760 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66  required */.  if
23770 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72 69  ( iRowid<p->iWri
23780 74 65 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20 28  teRowid .   || (
23790 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69 74  iRowid==p->iWrit
237a0 65 52 6f 77 69 64 20 26 26 20 70 2d 3e 62 44 65  eRowid && p->bDe
237b0 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28  lete==0).   || (
237c0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
237d0 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 48  > p->pConfig->nH
237e0 61 73 68 53 69 7a 65 29 20 0a 20 20 29 7b 0a 20  ashSize) .  ){. 
237f0 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73     fts5IndexFlus
23800 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  h(p);.  }..  p->
23810 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52  iWriteRowid = iR
23820 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c 65  owid;.  p->bDele
23830 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20 20  te = bDelete;.  
23840 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
23850 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
23860 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20  .** Commit data 
23870 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
23880 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
23890 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a  Sync(Fts5Index *
238a0 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  p, int bCommit){
238b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
238c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
238d0 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
238e0 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69  p);.  if( bCommi
238f0 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52 65 61  t ) fts5CloseRea
23900 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  der(p);.  return
23910 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
23920 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  (p);.}../*.** Di
23930 73 63 61 72 64 20 61 6e 79 20 64 61 74 61 20 73  scard any data s
23940 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
23950 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
23960 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  es. Do not write
23970 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61   it.** to the da
23980 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
23990 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68 61  ally, assume tha
239a0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
239b0 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20  f the %_data.** 
239c0 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63  table may have c
239d0 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20  hanged on disk. 
239e0 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79  So any in-memory
239f0 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74   caches of %_dat
23a00 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75  a .** records mu
23a10 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  st be invalidate
23a20 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
23a30 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61  3Fts5IndexRollba
23a40 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ck(Fts5Index *p)
23a50 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61  {.  fts5CloseRea
23a60 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35 49 6e  der(p);.  fts5In
23a70 64 65 78 44 69 73 63 61 72 64 44 61 74 61 28 70  dexDiscardData(p
23a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
23a90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
23aa0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23ab0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
23ac0 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69  e %_data table i
23ad0 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
23ae0 74 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ty when this fun
23af0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
23b00 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
23b10 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20 77  n populates it w
23b20 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ith the initial 
23b30 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
23b40 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  s for each index
23b50 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 69  ,.** and the ini
23b60 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20  tial version of 
23b70 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
23b80 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62 79  ecord (a zero-by
23b90 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74  te blob)..*/.int
23ba0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
23bb0 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65  xReinit(Fts5Inde
23bc0 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72  x *p){.  Fts5Str
23bd0 75 63 74 75 72 65 20 73 3b 0a 20 20 6d 65 6d 73  ucture s;.  mems
23be0 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
23bf0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 29  (Fts5Structure))
23c00 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74  ;.  fts5DataWrit
23c10 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47  e(p, FTS5_AVERAG
23c20 45 53 5f 52 4f 57 49 44 2c 20 28 63 6f 6e 73 74  ES_ROWID, (const
23c30 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 66   u8*)"", 0);.  f
23c40 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
23c50 65 28 70 2c 20 26 73 29 3b 0a 20 20 72 65 74 75  e(p, &s);.  retu
23c60 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
23c70 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
23c80 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35 49  Open a new Fts5I
23c90 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20  ndex handle. If 
23ca0 74 68 65 20 62 43 72 65 61 74 65 20 61 72 67 75  the bCreate argu
23cb0 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63 72  ment is true, cr
23cc0 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  eate.** and init
23cd0 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  ialize the under
23ce0 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61 62  lying %_data tab
23cf0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  le..**.** If suc
23d00 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70  cessful, set *pp
23d10 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
23d20 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20   new object and 
23d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23d40 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
23d50 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20  set *pp to NULL 
23d60 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
23d70 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
23d80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
23d90 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20  ts5IndexOpen(.  
23da0 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
23db0 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72 65  fig, .  int bCre
23dc0 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64 65  ate, .  Fts5Inde
23dd0 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a  x **pp,.  char *
23de0 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20  *pzErr.){.  int 
23df0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23e00 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20    Fts5Index *p; 
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20    /* New object 
23e30 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20  */..  *pp = p = 
23e40 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c 69  (Fts5Index*)sqli
23e50 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
23e60 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74  o(&rc, sizeof(Ft
23e70 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28  s5Index));.  if(
23e80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23e90 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67  {.    p->pConfig
23ea0 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20   = pConfig;.    
23eb0 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46  p->nWorkUnit = F
23ec0 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20  TS5_WORK_UNIT;. 
23ed0 20 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d     p->zDataTbl =
23ee0 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69   sqlite3Fts5Mpri
23ef0 6e 74 66 28 26 72 63 2c 20 22 25 73 5f 64 61 74  ntf(&rc, "%s_dat
23f00 61 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  a", pConfig->zNa
23f10 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  me);.    if( p->
23f20 7a 44 61 74 61 54 62 6c 20 26 26 20 62 43 72 65  zDataTbl && bCre
23f30 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ate ){.      rc 
23f40 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65  = sqlite3Fts5Cre
23f50 61 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20  ateTable(.      
23f60 20 20 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61      pConfig, "da
23f70 74 61 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52  ta", "id INTEGER
23f80 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c   PRIMARY KEY, bl
23f90 6f 63 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a  ock BLOB", 0, pz
23fa0 45 72 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Err.      );.   
23fb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23fc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23fd0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
23fe0 43 72 65 61 74 65 54 61 62 6c 65 28 70 43 6f 6e  CreateTable(pCon
23ff0 66 69 67 2c 20 22 69 64 78 22 2c 20 0a 20 20 20  fig, "idx", .   
24000 20 20 20 20 20 20 20 20 20 22 73 65 67 69 64 2c           "segid,
24010 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49   term, pgno, PRI
24020 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20  MARY KEY(segid, 
24030 74 65 72 6d 29 22 2c 20 0a 20 20 20 20 20 20 20  term)", .       
24040 20 20 20 20 20 31 2c 20 70 7a 45 72 72 0a 20 20       1, pzErr.  
24050 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
24060 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
24070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24080 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24090 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28  Fts5IndexReinit(
240a0 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
240b0 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
240c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
240d0 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
240e0 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  OK );.  if( rc )
240f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
24100 35 49 6e 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a  5IndexClose(p);.
24110 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
24120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24130 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68  ./*.** Close a h
24140 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20  andle opened by 
24150 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
24160 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  to sqlite3Fts5In
24170 64 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  dexOpen()..*/.in
24180 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
24190 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  exClose(Fts5Inde
241a0 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  x *p){.  int rc 
241b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
241c0 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
241d0 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d  rt( p->pReader==
241e0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
241f0 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72  _finalize(p->pWr
24200 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
24210 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
24220 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71  Deleter);.    sq
24230 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
24240 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20  ->pIdxWriter);. 
24250 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
24260 69 7a 65 28 70 2d 3e 70 49 64 78 44 65 6c 65 74  ize(p->pIdxDelet
24270 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
24280 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64  _finalize(p->pId
24290 78 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  xSelect);.    sq
242a0 6c 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65  lite3Fts5HashFre
242b0 65 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20  e(p->pHash);.   
242c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
242d0 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20  >zDataTbl);.    
242e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
242f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
24310 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20  ent p points to 
24320 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
24330 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74  ing utf-8 text t
24340 68 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69  hat is n bytes i
24350 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75  n .** size. Retu
24360 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
24370 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43   bytes in the nC
24380 68 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72  har character pr
24390 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62  efix of the.** b
243a0 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74  uffer, or 0 if t
243b0 68 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68  here are less th
243c0 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  an nChar charact
243d0 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f  ers in total..*/
243e0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
243f0 74 65 33 46 74 73 35 49 6e 64 65 78 43 68 61 72  te3Fts5IndexChar
24400 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20  lenToBytelen(.  
24410 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 0a  const char *p, .
24420 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20    int nByte, .  
24430 69 6e 74 20 6e 43 68 61 72 0a 29 7b 0a 20 20 69  int nChar.){.  i
24440 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt n = 0;.  int 
24450 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
24460 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nChar; i++){.   
24470 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20   if( n>=nByte ) 
24480 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f  return 0;      /
24490 2a 20 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73  * Input contains
244a0 20 66 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61   fewer than nCha
244b0 72 20 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69  r chars */.    i
244c0 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  f( (unsigned cha
244d0 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29  r)p[n++]>=0xc0 )
244e0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  {.      while( (
244f0 70 5b 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78  p[n] & 0xc0)==0x
24500 38 30 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  80 ) n++;.    }.
24510 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
24520 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20  }../*.** pIn is 
24530 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  a UTF-8 encoded 
24540 73 74 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65  string, nIn byte
24550 73 20 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72  s in size. Retur
24560 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
24570 2a 2a 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61  ** unicode chara
24580 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 74 72  cters in the str
24590 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
245a0 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61 72  nt fts5IndexChar
245b0 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  len(const char *
245c0 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20  pIn, int nIn){. 
245d0 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20   int nChar = 0; 
245e0 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
245f0 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  t i = 0;.  while
24600 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69  ( i<nIn ){.    i
24610 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  f( (unsigned cha
24620 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30  r)pIn[i++]>=0xc0
24630 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
24640 20 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69   i<nIn && (pIn[i
24650 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
24660 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ) i++;.    }.   
24670 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20   nChar++;.  }.  
24680 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a  return nChar;.}.
24690 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
246a0 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20   remove data to 
246b0 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  or from the inde
246c0 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 64  x. Each time a d
246d0 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61  ocument is .** a
246e0 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76  dded to or remov
246f0 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ed from the inde
24700 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  x, this function
24710 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f   is called one o
24720 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e  r more.** times.
24730 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
24740 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65  sert, it must be
24750 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
24760 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
24770 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e  he new document.
24780 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61  .** If the opera
24790 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65  tion is a delete
247a0 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
247b0 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f  led (at least) o
247c0 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  nce for each.** 
247d0 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20  unique token in 
247e0 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
247f0 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20  h an iCol value 
24800 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20  less than zero. 
24810 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75  The iPos.** argu
24820 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20  ment is ignored 
24830 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f  for a delete..*/
24840 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24850 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46 74  IndexWrite(.  Ft
24860 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24880 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20   Index to write 
24890 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  to */.  int iCol
248a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
248b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
248c0 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20  n token appears 
248d0 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74  in (-ve -> delet
248e0 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73  e) */.  int iPos
248f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24900 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
24910 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  ion of token wit
24920 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  hin column */.  
24930 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
24940 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20  en, int nToken  
24950 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20  /* Token to add 
24960 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20  or remove to or 
24970 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  from index */.){
24980 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249a0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
249b0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e  erate through in
249c0 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dexes */.  int r
249d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
249e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
249f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
24a00 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
24a10 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
24a20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
24a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
24a40 20 20 61 73 73 65 72 74 28 20 28 69 43 6f 6c 3c    assert( (iCol<
24a50 30 29 3d 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29  0)==p->bDelete )
24a60 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ;..  /* Add the 
24a70 65 6e 74 72 79 20 74 6f 20 74 68 65 20 6d 61 69  entry to the mai
24a80 6e 20 74 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a  n terms index. *
24a90 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
24aa0 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a 20  Fts5HashWrite(. 
24ab0 20 20 20 20 20 70 2d 3e 70 48 61 73 68 2c 20 70       p->pHash, p
24ac0 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69  ->iWriteRowid, i
24ad0 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f  Col, iPos, FTS5_
24ae0 4d 41 49 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f  MAIN_PREFIX, pTo
24af0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b  ken, nToken.  );
24b00 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
24b10 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
24b20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
24b30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
24b40 74 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 70 43  t int nChar = pC
24b50 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
24b60 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ];.    int nByte
24b70 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
24b80 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
24b90 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  len(pToken, nTok
24ba0 65 6e 2c 20 6e 43 68 61 72 29 3b 0a 20 20 20 20  en, nChar);.    
24bb0 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
24bc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
24bd0 74 73 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e  ts5HashWrite(p->
24be0 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  pHash, .        
24bf0 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64    p->iWriteRowid
24c00 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 28 63  , iCol, iPos, (c
24c10 68 61 72 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50  har)(FTS5_MAIN_P
24c20 52 45 46 49 58 2b 69 2b 31 29 2c 20 70 54 6f 6b  REFIX+i+1), pTok
24c30 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 42  en,.          nB
24c40 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  yte.      );.   
24c50 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
24c60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
24c70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f  en a new iterato
24c80 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f  r to iterate tho
24c90 75 67 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68  ugh all rowid th
24ca0 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a  at match the .**
24cb0 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e   specified token
24cc0 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78   or token prefix
24cd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24ce0 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a  Fts5IndexQuery(.
24cf0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d10 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74    /* FTS index t
24d20 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e  o query */.  con
24d30 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
24d40 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20   int nToken, /* 
24d50 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78  Token (or prefix
24d60 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  ) to query for *
24d70 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d90 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
24da0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58  TS5INDEX_QUERY_X
24db0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
24dc0 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
24de0 61 74 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d  atch these colum
24df0 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73  ns only */.  Fts
24e00 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49  5IndexIter **ppI
24e10 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
24e20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f  OUT: New iterato
24e30 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
24e40 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
24e50 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
24e60 67 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  g;.  Fts5IndexIt
24e70 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  er *pRet = 0;.  
24e80 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
24e90 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d  Fts5Buffer buf =
24ea0 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f   {0, 0, 0};..  /
24eb0 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 53  * If the QUERY_S
24ec0 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c  CAN flag is set,
24ed0 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
24ee0 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20   must be clear. 
24ef0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
24f00 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
24f10 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c  QUERY_SCAN)==0 |
24f20 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44  | flags==FTS5IND
24f30 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 29 3b  EX_QUERY_SCAN );
24f40 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ..  if( sqlite3F
24f50 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
24f60 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b  ->rc, &buf, nTok
24f70 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  en+1)==0 ){.    
24f80 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31 5d  memcpy(&buf.p[1]
24f90 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
24fa0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
24fb0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49  E_DEBUG.    /* I
24fc0 66 20 74 68 65 20 51 55 45 52 59 5f 54 45 53 54  f the QUERY_TEST
24fd0 5f 4e 4f 49 44 58 20 66 6c 61 67 20 77 61 73 20  _NOIDX flag was 
24fe0 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
24ff0 74 68 69 73 20 6d 75 73 74 20 62 65 20 61 0a 20  this must be a. 
25000 20 20 20 2a 2a 20 70 72 65 66 69 78 2d 71 75 65     ** prefix-que
25010 72 79 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 75  ry. Instead of u
25020 73 69 6e 67 20 61 20 70 72 65 66 69 78 2d 69 6e  sing a prefix-in
25030 64 65 78 20 28 69 66 20 6f 6e 65 20 65 78 69 73  dex (if one exis
25040 74 73 29 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61  ts), .    ** eva
25050 6c 75 61 74 65 20 74 68 65 20 70 72 65 66 69 78  luate the prefix
25060 20 71 75 65 72 79 20 75 73 69 6e 67 20 74 68 65   query using the
25070 20 6d 61 69 6e 20 46 54 53 20 69 6e 64 65 78 2e   main FTS index.
25080 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20   This is used.  
25090 20 20 2a 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61    ** for interna
250a0 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  l sanity checkin
250b0 67 20 62 79 20 74 68 65 20 69 6e 74 65 67 72 69  g by the integri
250c0 74 79 2d 63 68 65 63 6b 20 69 6e 20 64 65 62 75  ty-check in debu
250d0 67 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f  g .    ** mode o
250e0 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
250f0 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69   pConfig->bPrefi
25100 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c  xIndex==0 || (fl
25110 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
25120 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
25130 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
25140 74 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  t( flags & FTS5I
25150 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
25160 58 20 29 3b 0a 20 20 20 20 20 20 69 49 64 78 20  X );.      iIdx 
25170 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  = 1+pConfig->nPr
25180 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  efix;.    }else.
25190 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66  #endif.    if( f
251a0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
251b0 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b  _QUERY_PREFIX ){
251c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72  .      int nChar
251d0 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72   = fts5IndexChar
251e0 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  len(pToken, nTok
251f0 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  en);.      for(i
25200 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f  Idx=1; iIdx<=pCo
25210 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
25220 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Idx++){.        
25230 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  if( pConfig->aPr
25240 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43  efix[iIdx-1]==nC
25250 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  har ) break;.   
25260 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
25270 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69  if( iIdx<=pConfi
25280 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20  g->nPrefix ){.  
25290 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
252a0 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73  e *pStruct = fts
252b0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
252c0 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  );.      buf.p[0
252d0 5d 20 3d 20 28 75 38 29 28 46 54 53 35 5f 4d 41  ] = (u8)(FTS5_MA
252e0 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78  IN_PREFIX + iIdx
252f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  );.      if( pSt
25300 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ruct ){.        
25310 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
25320 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31 2c 20  (p, pStruct, 1, 
25330 66 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20 6e 54  flags, buf.p, nT
25340 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26  oken+1, -1, 0, &
25350 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  pRet);.        f
25360 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
25370 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
25380 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
25390 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 73 63  .      int bDesc
253a0 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35   = (flags & FTS5
253b0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
253c0 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75 66 2e  )!=0;.      buf.
253d0 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e  p[0] = FTS5_MAIN
253e0 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20 20 66  _PREFIX;.      f
253f0 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
25400 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62 75 66  er(p, bDesc, buf
25410 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 70 43  .p, nToken+1, pC
25420 6f 6c 73 65 74 2c 20 26 70 52 65 74 29 3b 0a 20  olset, &pRet);. 
25430 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
25440 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >rc ){.      sql
25450 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
25460 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 70  e(pRet);.      p
25470 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Ret = 0;.      f
25480 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
25490 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70  );.    }.    *pp
254a0 49 74 65 72 20 3d 20 70 52 65 74 3b 0a 20 20 20  Iter = pRet;.   
254b0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
254c0 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20  erFree(&buf);.  
254d0 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  }.  return fts5I
254e0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
254f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25500 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61  rue if the itera
25510 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
25520 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
25530 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 69 6e  is at EOF..*/.in
25540 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
25550 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74  rEof(Fts5IndexIt
25560 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
25570 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
25580 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  dex->rc==SQLITE_
25590 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  OK );.  return p
255a0 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f  Iter->bEof;.}../
255b0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
255c0 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72   next matching r
255d0 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  owid. .*/.int sq
255e0 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
255f0 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  t(Fts5IndexIter 
25600 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
25610 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
25620 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
25630 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  );.  fts5MultiIt
25640 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49  erNext(pIter->pI
25650 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30 2c 20  ndex, pIter, 0, 
25660 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  0);.  return fts
25670 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
25680 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
25690 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
256a0 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
256b0 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65 64  term/rowid. Used
256c0 20 62 79 20 74 68 65 20 66 74 73 35 76 6f 63 61   by the fts5voca
256d0 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74  b module..*/.int
256e0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
256f0 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e 64  NextScan(Fts5Ind
25700 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
25710 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d    Fts5Index *p =
25720 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a   pIter->pIndex;.
25730 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
25740 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
25750 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66 74  LITE_OK );..  ft
25760 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
25770 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b  p, pIter, 0, 0);
25780 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
25790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
257a0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
257b0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
257c0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
257d0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
257e0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20  if( pSeg->pLeaf 
257f0 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 5b  && pSeg->term.p[
25800 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50 52  0]!=FTS5_MAIN_PR
25810 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66 74  EFIX ){.      ft
25820 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 53  s5DataRelease(pS
25830 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  eg->pLeaf);.    
25840 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d 20    pSeg->pLeaf = 
25850 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  0;.      pIter->
25860 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
25870 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74    }..  return ft
25880 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
25890 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
258a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
258b0 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
258c0 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75   rowid that occu
258d0 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69  rs at or after i
258e0 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65  Match. The.** de
258f0 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20  finition of "at 
25900 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64  or after" depend
25910 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69  s on whether thi
25920 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61  s iterator itera
25930 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  tes.** in ascend
25940 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e  ing or descendin
25950 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a  g rowid order..*
25960 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
25970 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74  5IterNextFrom(Ft
25980 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
25990 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b  er, i64 iMatch){
259a0 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
259b0 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e  NextFrom(pIter->
259c0 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 69  pIndex, pIter, i
259d0 4d 61 74 63 68 29 3b 0a 20 20 72 65 74 75 72 6e  Match);.  return
259e0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
259f0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
25a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25a10 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
25a20 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  id..*/.i64 sqlit
25a30 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28  e3Fts5IterRowid(
25a40 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
25a50 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
25a60 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
25a70 69 64 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  id(pIter);.}../*
25a80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
25a90 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a  urrent term..*/.
25aa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
25ab0 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28  te3Fts5IterTerm(
25ac0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
25ad0 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a  Iter, int *pn){.
25ae0 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
25af0 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
25b00 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74  t char*)fts5Mult
25b10 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c  iIterTerm(pIter,
25b20 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d   &n);.  *pn = n-
25b30 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b 31  1;.  return &z[1
25b40 5d 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e  ];.}...static in
25b50 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  t fts5IndexExtra
25b60 63 74 43 6f 6c 73 65 74 20 28 0a 20 20 46 74 73  ctColset (.  Fts
25b70 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
25b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25b90 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72  Colset to filter
25ba0 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   on */.  const u
25bb0 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f  8 *pPos, int nPo
25bc0 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69  s,       /* Posi
25bd0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46  tion list */.  F
25be0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 20  ts5Buffer *pBuf 
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25c00 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
25c10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
25c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
25c30 74 20 69 3b 0a 0a 20 20 66 74 73 35 42 75 66 66  t i;..  fts5Buff
25c40 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20  erZero(pBuf);.  
25c50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73  for(i=0; i<pCols
25c60 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  et->nCol; i++){.
25c70 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53      const u8 *pS
25c80 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20 69  ub = pPos;.    i
25c90 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35 49 6e  nt nSub = fts5In
25ca0 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26 70  dexExtractCol(&p
25cb0 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c 73  Sub, nPos, pCols
25cc0 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20  et->aiCol[i]);. 
25cd0 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b 0a 20     if( nSub ){. 
25ce0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
25cf0 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 70  ppendBlob(&rc, p
25d00 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62 29  Buf, nSub, pSub)
25d10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25d20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
25d30 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
25d40 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
25d50 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 6f 70  containing a cop
25d60 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  y of the positio
25d70 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 74 68  n list for.** th
25d80 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
25d90 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
25da0 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f 20 74   *pn is set to t
25db0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
25dc0 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62 79 74  uffer .** in byt
25dd0 65 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  es before return
25de0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ing..**.** The r
25df0 65 74 75 72 6e 65 64 20 70 6f 73 69 74 69 6f 6e  eturned position
25e00 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20 69   list does not i
25e10 6e 63 6c 75 64 65 20 74 68 65 20 22 6e 75 6d 62  nclude the "numb
25e20 65 72 20 6f 66 20 62 79 74 65 73 22 20 76 61 72  er of bytes" var
25e30 69 6e 74 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  int.** field tha
25e40 74 20 73 74 61 72 74 73 20 74 68 65 20 70 6f 73  t starts the pos
25e50 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20 64 69  ition list on di
25e60 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
25e70 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73  e3Fts5IterPoslis
25e80 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  t(.  Fts5IndexIt
25e90 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74  er *pIter, .  Ft
25ea0 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
25eb0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
25ec0 20 43 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 20 28   Column filter (
25ed0 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f  or NULL) */.  co
25ee0 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 20 20 20  nst u8 **pp,    
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f00 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
25f10 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64   position-list d
25f20 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
25f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
25f50 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74 69 6f   Size of positio
25f60 6e 2d 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  n-list in bytes 
25f70 2a 2f 0a 20 20 69 36 34 20 2a 70 69 52 6f 77 69  */.  i64 *piRowi
25f80 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
25f90 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 75 72       /* OUT: Cur
25fa0 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  rent rowid */.){
25fb0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
25fc0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
25fd0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
25fe0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
25ff0 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
26000 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
26010 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
26020 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
26030 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
26040 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70  QLITE_OK );.  *p
26050 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
26060 52 6f 77 69 64 3b 0a 20 20 69 66 28 20 65 44 65  Rowid;.  if( eDe
26070 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
26080 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 2a 70  L_NONE ){.    *p
26090 6e 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a  n = pSeg->nPos;.
260a0 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 65 44    }else.  if( eD
260b0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
260c0 49 4c 5f 46 55 4c 4c 20 0a 20 20 20 26 26 20 70  IL_FULL .   && p
260d0 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
260e0 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65  +pSeg->nPos<=pSe
260f0 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  g->pLeaf->szLeaf
26100 20 0a 20 20 29 7b 0a 20 20 20 20 75 38 20 2a 70   .  ){.    u8 *p
26110 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  Pos = &pSeg->pLe
26120 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
26130 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66  fOffset];.    if
26140 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c 20  ( pColset==0 || 
26150 70 49 74 65 72 2d 3e 62 46 69 6c 74 65 72 65 64  pIter->bFiltered
26160 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20   ){.      *pn = 
26170 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20  pSeg->nPos;.    
26180 20 20 2a 70 70 20 3d 20 70 50 6f 73 3b 0a 20 20    *pp = pPos;.  
26190 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
261a0 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a  set->nCol==1 ){.
261b0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 50 6f 73        *pp = pPos
261c0 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 66 74  ;.      *pn = ft
261d0 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
261e0 6c 28 70 70 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  l(pp, pSeg->nPos
261f0 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  , pColset->aiCol
26200 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
26210 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
26220 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
26230 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74  slist);.      ft
26240 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
26250 6c 73 65 74 28 70 43 6f 6c 73 65 74 2c 20 70 50  lset(pColset, pP
26260 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20  os, pSeg->nPos, 
26270 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
26280 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 49  ;.      *pp = pI
26290 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
262a0 20 20 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65        *pn = pIte
262b0 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20  r->poslist.n;.  
262c0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
262d0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
262e0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
262f0 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65  ;.    fts5Segite
26300 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e  rPoslist(pIter->
26310 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 43  pIndex, pSeg, pC
26320 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70  olset, &pIter->p
26330 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  oslist);.    if(
26340 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
26350 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20  ETAIL_FULL ){.  
26360 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d      *pp = pIter-
26370 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20  >poslist.p;.    
26380 7d 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65  }.    *pn = pIte
26390 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20  r->poslist.n;.  
263a0 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  }.  return fts5I
263b0 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
263c0 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 69 6e  ->pIndex);.}..in
263d0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
263e0 72 43 6f 6c 6c 69 73 74 28 0a 20 20 46 74 73 35  rCollist(.  Fts5
263f0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
26400 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a  , .  const u8 **
26410 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pp,             
26420 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
26430 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e  nter to position
26440 2d 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20  -list data */.  
26450 69 6e 74 20 2a 70 6e 20 20 20 20 20 20 20 20 20  int *pn         
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26470 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
26480 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e  position-list in
26490 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 61   bytes */.){.  a
264a0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49  ssert( pIter->pI
264b0 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  ndex->pConfig->e
264c0 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
264d0 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20  AIL_COLUMNS );. 
264e0 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pp = pIter->po
264f0 73 6c 69 73 74 2e 70 3b 0a 20 20 2a 70 6e 20 3d  slist.p;.  *pn =
26500 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
26510 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  n;.  return SQLI
26520 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26530 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26540 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
26550 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
26560 73 74 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  st(), except tha
26570 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  t it.** copies t
26580 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
26590 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
265a0 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
265b0 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75   second .** argu
265c0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
265d0 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
265e0 69 73 74 42 75 66 66 65 72 28 46 74 73 35 49 6e  istBuffer(Fts5In
265f0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
26600 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
26610 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  ){.  Fts5Index *
26620 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
26630 78 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  x;.  Fts5SegIter
26640 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
26650 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
26660 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
26670 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
26680 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
26690 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
266a0 28 70 42 75 66 29 3b 0a 20 20 66 74 73 35 53 65  (pBuf);.  fts5Se
266b0 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20  giterPoslist(p, 
266c0 70 53 65 67 2c 20 30 2c 20 70 42 75 66 29 3b 0a  pSeg, 0, pBuf);.
266d0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
266e0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
266f0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69  /*.** Close an i
26700 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62  terator opened b
26710 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
26720 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  l to sqlite3Fts5
26730 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f  IndexQuery()..*/
26740 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
26750 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49  5IterClose(Fts5I
26760 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
26770 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
26780 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
26790 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e  pIndex = pIter->
267a0 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
267b0 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
267c0 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
267d0 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f  er);.    fts5Clo
267e0 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78 29  seReader(pIndex)
267f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
26800 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74  ead and decode t
26810 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65  he "averages" re
26820 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64 61  cord from the da
26830 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50  tabase. .**.** P
26840 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65 20  arameter anSize 
26850 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
26860 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e   array of size n
26870 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20  Col, where nCol 
26880 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  is.** the number
26890 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64   of user defined
268a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
268b0 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  FTS table..*/.in
268c0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
268d0 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74  exGetAverages(Ft
268e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
268f0 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53  *pnRow, i64 *anS
26900 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c  ize){.  int nCol
26910 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   = p->pConfig->n
26920 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61 20  Col;.  Fts5Data 
26930 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f  *pData;..  *pnRo
26940 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  w = 0;.  memset(
26950 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f  anSize, 0, sizeo
26960 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a  f(i64) * nCol);.
26970 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
26980 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 41  taRead(p, FTS5_A
26990 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a  VERAGES_ROWID);.
269a0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
269b0 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d  ITE_OK && pData-
269c0 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >nn ){.    int i
269d0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43   = 0;.    int iC
269e0 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73  ol;.    i += fts
269f0 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
26a00 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70  a->p[i], (u64*)p
26a10 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28 69  nRow);.    for(i
26a20 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e  Col=0; i<pData->
26a30 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b  nn && iCol<nCol;
26a40 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
26a50 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
26a60 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c  nt(&pData->p[i],
26a70 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69   (u64*)&anSize[i
26a80 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Col]);.    }.  }
26a90 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
26aa0 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65  ase(pData);.  re
26ab0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
26ac0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
26ad0 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75  * Replace the cu
26ae0 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22  rrent "averages"
26af0 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65   record with the
26b00 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
26b10 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70   buffer .** supp
26b20 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  lied as the seco
26b30 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
26b40 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
26b50 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28  ndexSetAverages(
26b60 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f  Fts5Index *p, co
26b70 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69  nst u8 *pData, i
26b80 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73  nt nData){.  ass
26b90 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
26ba0 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44  TE_OK );.  fts5D
26bb0 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
26bc0 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c  _AVERAGES_ROWID,
26bd0 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a   pData, nData);.
26be0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
26bf0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
26c00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26c10 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
26c20 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64   blocks this mod
26c30 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f  ule has read fro
26c40 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20  m the %_data.** 
26c50 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77  table since it w
26c60 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69  as created..*/.i
26c70 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
26c80 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64  dexReads(Fts5Ind
26c90 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ex *p){.  return
26ca0 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a   p->nRead;.}../*
26cb0 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62  .** Set the 32-b
26cc0 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  it cookie value 
26cd0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
26ce0 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63  art of all struc
26cf0 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73  ture .** records
26d00 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
26d10 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
26d20 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
26d30 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
26d40 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
26d50 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
26d60 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
26d70 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
26d80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26d90 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b  Fts5IndexSetCook
26da0 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ie(Fts5Index *p,
26db0 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e   int iNew){.  in
26dc0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26de0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
26df0 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69  e */.  Fts5Confi
26e00 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
26e10 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43  pConfig;    /* C
26e20 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
26e30 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f  ect */.  u8 aCoo
26e40 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20  kie[4];         
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26e60 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e   Binary represen
26e70 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a  tation of iNew *
26e80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
26e90 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20   *pBlob = 0;..  
26ea0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
26eb0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
26ec0 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61  lite3Fts5Put32(a
26ed0 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a  Cookie, iNew);..
26ee0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
26ef0 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
26f00 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  ->db, pConfig->z
26f10 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c  Db, p->zDataTbl,
26f20 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c   .      "block",
26f30 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
26f40 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62  ROWID, 1, &pBlob
26f50 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
26f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26f70 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
26f80 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b  ite(pBlob, aCook
26f90 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72  ie, 4, 0);.    r
26fa0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
26fb0 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20  _close(pBlob);. 
26fc0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
26fd0 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
26fe0 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66  ts5IndexLoadConf
26ff0 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ig(Fts5Index *p)
27000 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
27010 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53  e *pStruct;.  pS
27020 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
27030 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
27040 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
27050 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
27060 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
27070 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a  xReturn(p);.}...
27080 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
27090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
270d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
270f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27110 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
27120 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
27130 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
27140 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  of the integrity
27150 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74  -check .** funct
27160 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a  ionality..*/../*
27170 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d  .** Return a sim
27180 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  ple checksum val
27190 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ue based on the 
271a0 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36  arguments..*/.u6
271b0 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  4 sqlite3Fts5Ind
271c0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20  exEntryCksum(.  
271d0 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69  i64 iRowid, .  i
271e0 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20  nt iCol, .  int 
271f0 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64  iPos, .  int iId
27200 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
27210 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54  *pTerm,.  int nT
27220 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erm.){.  int i;.
27230 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77    u64 ret = iRow
27240 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  id;.  ret += (re
27250 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20  t<<3) + iCol;.  
27260 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
27270 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49  + iPos;.  if( iI
27280 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28  dx>=0 ) ret += (
27290 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f  ret<<3) + (FTS5_
272a0 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49  MAIN_PREFIX + iI
272b0 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  dx);.  for(i=0; 
272c0 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65  i<nTerm; i++) re
272d0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
272e0 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75  pTerm[i];.  retu
272f0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65  rn ret;.}..#ifde
27300 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
27310 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27320 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20  on is purely an 
27330 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
27340 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
27350 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
27360 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
27370 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
27380 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
27390 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
273a0 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73  nstead, it tests
273b0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
273c0 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64  et of pgno/rowid
273d0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
273e0 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65  e .** visited re
273f0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
27400 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  her the doclist-
27410 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64  index identified
27420 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a   by parameters.*
27430 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69  * iSegid/iLeaf i
27440 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f  s iterated in fo
27450 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73  rwards or revers
27460 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  e order..*/.stat
27470 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
27480 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20 20  DlidxReverse(.  
27490 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
274a0 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
274b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274c0 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74   /* Segment id t
274d0 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o load from */. 
274e0 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20   int iLeaf      
274f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27500 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74   /* Load doclist
27510 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20  -index for this 
27520 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  leaf */.){.  Fts
27530 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
27540 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b  dx = 0;.  u64 ck
27550 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34  sum1 = 13;.  u64
27560 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20   cksum2 = 13;.. 
27570 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
27580 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
27590 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61   0, iSegid, iLea
275a0 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  f);.      fts5Dl
275b0 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
275c0 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
275d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
275e0 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29  t(p, pDlidx).  )
275f0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
27600 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
27610 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20  Rowid(pDlidx);. 
27620 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74     int pgno = ft
27630 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
27640 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73  pDlidx);.    ass
27650 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20  ert( pgno>iLeaf 
27660 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d  );.    cksum1 +=
27670 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29   iRowid + ((i64)
27680 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20  pgno<<32);.  }. 
27690 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
276a0 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
276b0 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  lidx = 0;..  for
276c0 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
276d0 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20  xIterInit(p, 1, 
276e0 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a  iSegid, iLeaf);.
276f0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
27700 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
27710 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
27720 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c  DlidxIterPrev(p,
27730 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20   pDlidx).  ){.  
27740 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66    i64 iRowid = f
27750 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
27760 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69  d(pDlidx);.    i
27770 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c  nt pgno = fts5Dl
27780 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
27790 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dx);.    assert(
277a0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
277b0 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66  no(pDlidx)>iLeaf
277c0 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b   );.    cksum2 +
277d0 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
277e0 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
277f0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
27800 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
27810 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66  Dlidx = 0;..  if
27820 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
27830 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b  OK && cksum1!=ck
27840 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46  sum2 ) p->rc = F
27850 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a  TS5_CORRUPT;.}..
27860 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51  static int fts5Q
27870 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73  ueryCksum(.  Fts
27880 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
27890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
278a0 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63  Fts5 index objec
278b0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
278c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
278d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
278e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20     /* Index key 
278f0 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
27900 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27920 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64    /* Size of ind
27930 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20  ex key in bytes 
27940 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
27950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27960 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
27970 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  r Fts5IndexQuery
27980 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75   */.  u64 *pCksu
27990 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
279a0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
279b0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
279c0 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 63 6b 73 75  */.){.  u64 cksu
279d0 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46  m = *pCksum;.  F
279e0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
279f0 64 78 49 74 65 72 20 3d 20 30 3b 0a 20 20 46 74  dxIter = 0;.  Ft
27a00 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b  s5Buffer buf = {
27a10 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 69 6e 74 20  0, 0, 0};.  int 
27a20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
27a30 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20 7a 2c  IndexQuery(p, z,
27a40 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c 20 26 70   n, flags, 0, &p
27a50 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 77 68 69  IdxIter);..  whi
27a60 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
27a70 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46  K && 0==sqlite3F
27a80 74 73 35 49 74 65 72 45 6f 66 28 70 49 64 78 49  ts5IterEof(pIdxI
27a90 74 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20  ter) ){.    i64 
27aa0 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46  rowid = sqlite3F
27ab0 74 73 35 49 74 65 72 52 6f 77 69 64 28 70 49 64  ts5IterRowid(pId
27ac0 78 49 74 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  xIter);.    rc =
27ad0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
27ae0 50 6f 73 6c 69 73 74 42 75 66 66 65 72 28 70 49  PoslistBuffer(pI
27af0 64 78 49 74 65 72 2c 20 26 62 75 66 29 3b 0a 20  dxIter, &buf);. 
27b00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27b10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
27b20 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
27b30 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 66  sReader;.      f
27b40 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35 50 6f  or(sqlite3Fts5Po
27b50 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28  slistReaderInit(
27b60 62 75 66 2e 70 2c 20 62 75 66 2e 6e 2c 20 26 73  buf.p, buf.n, &s
27b70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20  Reader);.       
27b80 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d     sReader.bEof=
27b90 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  =0;.          sq
27ba0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
27bb0 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61  ReaderNext(&sRea
27bc0 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  der).      ){.  
27bd0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
27be0 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
27bf0 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a  (sReader.iPos);.
27c00 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
27c10 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
27c20 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29  ET(sReader.iPos)
27c30 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
27c40 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
27c50 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f  dexEntryCksum(ro
27c60 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c  wid, iCol, iOff,
27c70 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20   iIdx, z, n);.  
27c80 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
27c90 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
27ca0 4e 65 78 74 28 70 49 64 78 49 74 65 72 29 3b 0a  Next(pIdxIter);.
27cb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
27cc0 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
27cd0 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20 66 74  (pIdxIter);.  ft
27ce0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
27cf0 66 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d  f);..  *pCksum =
27d00 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e   cksum;.  return
27d10 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
27d20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27d30 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20 69  also purely an i
27d40 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74  nternal test. It
27d50 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
27d60 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20  bute to .** FTS 
27d70 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f  functionality, o
27d80 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67  r even the integ
27d90 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61  rity-check, in a
27da0 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69  ny way..*/.stati
27db0 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 54  c void fts5TestT
27dc0 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
27dd0 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66 66   *p, .  Fts5Buff
27de0 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20 20  er *pPrev,      
27df0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
27e00 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f  ous term */.  co
27e10 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
27e20 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a   n,           /*
27e30 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74 65   Possibly new te
27e40 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  rm to test */.  
27e50 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20 20  u64 expected,.  
27e60 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20  u64 *pCksum.){. 
27e70 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
27e80 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e 3d  .  if( pPrev->n=
27e90 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  =0 ){.    fts5Bu
27ea0 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72  fferSet(&rc, pPr
27eb0 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38  ev, n, (const u8
27ec0 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  *)z);.  }else.  
27ed0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27ee0 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21 3d  K && (pPrev->n!=
27ef0 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72 65  n || memcmp(pPre
27f00 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a  v->p, z, n)) ){.
27f10 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d      u64 cksum3 =
27f20 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63 6f   *pCksum;.    co
27f30 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
27f40 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26  = (const char*)&
27f50 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a  pPrev->p[1];  /*
27f60 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66 69   term sans prefi
27f70 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  x-byte */.    in
27f80 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76 2d  t nTerm = pPrev-
27f90 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  >n-1;           
27fa0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72   /* Size of zTer
27fb0 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
27fc0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70 50    int iIdx = (pP
27fd0 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53 35  rev->p[0] - FTS5
27fe0 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a 20  _MAIN_PREFIX);. 
27ff0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
28000 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54  iIdx==0 ? 0 : FT
28010 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52  S5INDEX_QUERY_PR
28020 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20 63  EFIX);.    u64 c
28030 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34 20  k1 = 0;.    u64 
28040 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ck2 = 0;..    /*
28050 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
28060 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64  results returned
28070 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45 53   for ASC and DES
28080 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20 20  C queries are.  
28090 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 49    ** the same. I
280a0 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73  f not, call this
280b0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
280c0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75  .    rc = fts5Qu
280d0 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
280e0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
280f0 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20  flags, &ck1);.  
28100 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28110 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
28120 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
28130 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b  NDEX_QUERY_DESC;
28140 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35  .      rc = fts5
28150 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
28160 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
28170 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
28180 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
28190 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d  LITE_OK && ck1!=
281a0 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ck2 ) rc = FTS5_
281b0 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f 2a  CORRUPT;..    /*
281c0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70 72   If this is a pr
281d0 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65 63  efix query, chec
281e0 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  k that the resul
281f0 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  ts returned if t
28200 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  he.    ** the in
28210 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64 20  dex is disabled 
28220 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49 6e  are the same. In
28230 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44 45   both ASC and DE
28240 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20 2a  SC order. .    *
28250 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63 68  *.    ** This ch
28260 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  eck may only be 
28270 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65  performed if the
28280 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 65   hash table is e
28290 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20 2a  mpty. This.    *
282a0 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  * is because the
282b0 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c 79   hash table only
282c0 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67   supports a sing
282d0 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20 61 74  le scan query at
282e0 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c 20  .    ** a time, 
282f0 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69 74  and the multi-it
28300 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68 69  er loop from whi
28310 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ch this function
28320 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a   is called.    *
28330 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70 65 72  * is already per
28340 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20 73  forming such a s
28350 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
28360 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
28370 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
28380 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
28390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
283a0 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
283b0 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
283c0 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20  _TEST_NOIDX;.   
283d0 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20       ck2 = 0;.  
283e0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
283f0 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
28400 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
28410 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20   f, &ck2);.     
28420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28430 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
28440 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
28450 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
28460 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26      if( iIdx>0 &
28470 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
28480 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
28490 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44   = flags|FTS5IND
284a0 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  EX_QUERY_TEST_NO
284b0 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  IDX|FTS5INDEX_QU
284c0 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20  ERY_DESC;.      
284d0 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20    ck2 = 0;.     
284e0 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
284f0 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
28500 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c  zTerm, nTerm, f,
28510 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20   &ck2);.        
28520 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28530 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
28540 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
28550 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
28560 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20  ..    cksum3 ^= 
28570 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ck1;.    fts5Buf
28580 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72 65  ferSet(&rc, pPre
28590 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a  v, n, (const u8*
285a0 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  )z);..    if( rc
285b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
285c0 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64 20  ksum3!=expected 
285d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46 54  ){.      rc = FT
285e0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
285f0 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d 20  }.    *pCksum = 
28600 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d  cksum3;.  }.  p-
28610 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65  >rc = rc;.}. .#e
28620 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
28630 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73  5TestDlidxRevers
28640 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69 6e  e(x,y,z).# defin
28650 65 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 75  e fts5TestTerm(u
28660 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  ,v,w,x,y,z).#end
28670 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
28680 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  that:.**.**   1)
28690 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70   All leaves of p
286a0 53 65 67 20 62 65 74 77 65 65 6e 20 69 46 69 72  Seg between iFir
286b0 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e  st and iLast (in
286c0 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61  clusive) exist a
286d0 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  nd.**      conta
286e0 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a 2a  in zero terms..*
286f0 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76 65  *   2) All leave
28700 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65  s of pSeg betwee
28710 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20 69  n iNoRowid and i
28720 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29  Last (inclusive)
28730 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20   exist and.**   
28740 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20     contain zero 
28750 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  rowids..*/.stati
28760 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
28770 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d  IntegrityCheckEm
28780 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  pty(.  Fts5Index
28790 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75 63   *p,.  Fts5Struc
287a0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
287b0 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g,     /* Segmen
287c0 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72  t to check inter
287d0 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  nal consistency 
287e0 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
287f0 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64 2c  .  int iNoRowid,
28800 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b 0a  .  int iLast.){.
28810 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4e    int i;..  /* N
28820 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
28830 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65  e iter.nEmpty le
28840 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  aves following t
28850 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a  he current leaf.
28860 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61    ** (a) exist a
28870 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e  nd (b) contain n
28880 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66 6f  o terms. */.  fo
28890 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e 72  r(i=iFirst; p->r
288a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
288b0 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a  i<=iLast; i++){.
288c0 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
288d0 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
288e0 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
288f0 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
28900 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20 20  Segid, i));.    
28910 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
28920 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61 66     if( !fts5Leaf
28930 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66  IsTermless(pLeaf
28940 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  ) ) p->rc = FTS5
28950 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
28960 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64 20  if( i>=iNoRowid 
28970 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46 69  && 0!=fts5LeafFi
28980 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
28990 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  f) ) p->rc = FTS
289a0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
289b0 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
289c0 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d  ease(pLeaf);.  }
289d0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
289e0 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68 65  fts5IntegrityChe
289f0 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64 65  ckPgidx(Fts5Inde
28a00 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20 2a  x *p, Fts5Data *
28a10 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69 54  pLeaf){.  int iT
28a20 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69 6e  ermOff = 0;.  in
28a30 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75 66  t ii;..  Fts5Buf
28a40 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30 2c  fer buf1 = {0,0,
28a50 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  0};.  Fts5Buffer
28a60 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b   buf2 = {0,0,0};
28a70 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d 3e  ..  ii = pLeaf->
28a80 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65 28  szLeaf;.  while(
28a90 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26 26   ii<pLeaf->nn &&
28aa0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
28ab0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  K ){.    int res
28ac0 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ;.    int iOff;.
28ad0 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 0a      int nIncr;..
28ae0 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47 65      ii += fts5Ge
28af0 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
28b00 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29 3b  ->p[ii], nIncr);
28b10 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d  .    iTermOff +=
28b20 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66 66   nIncr;.    iOff
28b30 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20   = iTermOff;..  
28b40 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61    if( iOff>=pLea
28b50 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
28b60 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
28b70 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c  CORRUPT;.    }el
28b80 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 3d  se if( iTermOff=
28b90 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20 20  =nIncr ){.      
28ba0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  int nByte;.     
28bb0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
28bc0 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
28bd0 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  >p[iOff], nByte)
28be0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66  ;.      if( (iOf
28bf0 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e  f+nByte)>pLeaf->
28c00 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
28c10 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
28c20 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65  ORRUPT;.      }e
28c30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
28c40 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
28c50 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c  c, &buf1, nByte,
28c60 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d   &pLeaf->p[iOff]
28c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
28c90 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20 20  nKeep, nByte;.  
28ca0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
28cb0 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
28cc0 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65  af->p[iOff], nKe
28cd0 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  ep);.      iOff 
28ce0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
28cf0 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
28d00 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
28d10 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66 31    if( nKeep>buf1
28d20 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79 74  .n || (iOff+nByt
28d30 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  e)>pLeaf->szLeaf
28d40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
28d50 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
28d60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28d70 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d 20         buf1.n = 
28d80 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66  nKeep;.        f
28d90 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
28da0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
28db0 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66  1, nByte, &pLeaf
28dc0 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  ->p[iOff]);.    
28dd0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
28de0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
28df0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
28e00 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
28e10 72 65 28 26 62 75 66 31 2c 20 26 62 75 66 32 29  re(&buf1, &buf2)
28e20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
28e30 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  s<=0 ) p->rc = F
28e40 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
28e50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
28e60 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
28e70 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66 31  >rc, &buf2, buf1
28e80 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20 7d  .n, buf1.p);.  }
28e90 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ..  fts5BufferFr
28ea0 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74 73  ee(&buf1);.  fts
28eb0 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
28ec0 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  2);.}..static vo
28ed0 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65  id fts5IndexInte
28ee0 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e  grityCheckSegmen
28ef0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
28f00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
28f10 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
28f20 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
28f30 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
28f40 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20  gment *pSeg     
28f50 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63   /* Segment to c
28f60 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f  heck internal co
28f70 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a  nsistency */.){.
28f80 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
28f90 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
28fa0 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ig;.  sqlite3_st
28fb0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
28fc0 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74 20   int rc2;.  int 
28fd0 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70  iIdxPrevLeaf = p
28fe0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31  Seg->pgnoFirst-1
28ff0 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50 72  ;.  int iDlidxPr
29000 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  evLeaf = pSeg->p
29010 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28 20  gnoLast;..  if( 
29020 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d  pSeg->pgnoFirst=
29030 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
29040 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
29050 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c 20  Stmt(p, &pStmt, 
29060 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
29070 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73  .      "SELECT s
29080 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67 6e  egid, term, (pgn
29090 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29 20  o>>1), (pgno&1) 
290a0 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78 27  FROM %Q.'%q_idx'
290b0 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64 22   WHERE segid=%d"
290c0 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ,.      pConfig-
290d0 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
290e0 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65 67  Name, pSeg->iSeg
290f0 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  id.  ));..  /* I
29100 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
29110 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
29120 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c 65  chy.  */.  while
29130 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
29140 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
29150 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
29160 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36 34  Stmt) ){.    i64
29170 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   iRow;          
29180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
29190 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65 61  wid for this lea
291a0 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74  f */.    Fts5Dat
291b0 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
291c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
291d0 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
291e0 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65 72  .    int nIdxTer
291f0 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
29200 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
29210 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
29220 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20 28  ar *zIdxTerm = (
29230 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
29240 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
29250 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69  pStmt, 1);.    i
29260 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73 71  nt iIdxLeaf = sq
29270 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
29280 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
29290 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d 20  int bIdxDlidx = 
292a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
292b0 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20  nt(pStmt, 3);.. 
292c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61     /* If the lea
292d0 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61  f in question ha
292e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74  s already been t
292f0 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20  rimmed from the 
29300 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a  segment, .    **
29310 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74   ignore this b-t
29320 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72  ree entry. Other
29330 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e  wise, load it in
29340 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20  to memory. */.  
29350 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c 70    if( iIdxLeaf<p
29360 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  Seg->pgnoFirst )
29370 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
29380 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Row = FTS5_SEGME
29390 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
293a0 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
293b0 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
293c0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
293d0 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ow);.    if( pLe
293e0 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  af==0 ) break;..
293f0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
29400 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61  t the leaf conta
29410 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
29420 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20   term, and that 
29430 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20  it is equal.    
29440 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20  ** to or larger 
29450 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b  than the split-k
29460 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e 20  ey in zIdxTerm. 
29470 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
29480 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a   if there.    **
29490 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69 64   is also a rowid
294a0 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e 20   pointer within 
294b0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68 65  the leaf page he
294c0 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73 20  ader, it points 
294d0 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63 61  to a.    ** loca
294e0 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tion before the 
294f0 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66  term.  */.    if
29500 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c 65  ( pLeaf->nn<=pLe
29510 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
29520 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
29530 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
29540 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
29550 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
29560 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
29570 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20 6f   of first term o
29580 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20  n leaf */.      
29590 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20 20  int iRowidOff;  
295a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
295b0 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 72  ffset of first r
295c0 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a  owid on leaf */.
295d0 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
295e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
29600 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74  m on leaf in byt
29610 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
29620 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
29630 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
29640 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e  rison of term an
29650 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a  d split-key */..
29660 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
29670 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
29680 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
29690 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
296a0 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
296b0 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
296c0 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 69  if( iRowidOff>=i
296d0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Off ){.        p
296e0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
296f0 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
29700 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
29710 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
29720 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
29730 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  ], nTerm);.     
29740 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
29750 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
29760 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28 6e   zIdxTerm, MIN(n
29770 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29 29  Term, nIdxTerm))
29780 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
29790 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54 65  s==0 ) res = nTe
297a0 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a 20  rm - nIdxTerm;. 
297b0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30         if( res<0
297c0 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
297d0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
297e0 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e 74 65  ..      fts5Inte
297f0 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78 28  grityCheckPgidx(
29800 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d  p, pLeaf);.    }
29810 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
29820 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ease(pLeaf);.   
29830 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
29840 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ak;..    /* Now 
29850 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  check that the i
29860 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65  ter.nEmpty leave
29870 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
29880 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 20  current leaf.   
29890 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e   ** (a) exist an
298a0 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f  d (b) contain no
298b0 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66   terms. */.    f
298c0 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
298d0 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 20  yCheckEmpty(.   
298e0 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20 69 49       p, pSeg, iI
298f0 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 44  dxPrevLeaf+1, iD
29900 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20  lidxPrevLeaf+1, 
29910 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20 20 29  iIdxLeaf-1.    )
29920 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
29930 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
29940 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
29950 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63 68  oclist-index, ch
29960 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b  eck that it look
29970 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  s right. */.    
29980 69 66 28 20 62 49 64 78 44 6c 69 64 78 20 29 7b  if( bIdxDlidx ){
29990 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
299a0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
299b0 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74  ;  /* For iterat
299c0 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63 6c  ing through docl
299d0 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist index */.   
299e0 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61 66     int iPrevLeaf
299f0 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 20   = iIdxLeaf;.   
29a00 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
29a10 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
29a20 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 30 3b      int iPg = 0;
29a30 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79 3b  .      i64 iKey;
29a40 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c 69  ..      for(pDli
29a50 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
29a60 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69  Init(p, 0, iSegi
29a70 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20  d, iIdxLeaf);.  
29a80 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
29a90 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
29aa0 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  dx)==0;.        
29ab0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
29ac0 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  ext(p, pDlidx). 
29ad0 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20       ){..       
29ae0 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f   /* Check any ro
29af0 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74  wid-less pages t
29b00 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65  hat occur before
29b10 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
29b20 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  f. */.        fo
29b30 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b  r(iPg=iPrevLeaf+
29b40 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69 64 78  1; iPg<fts5Dlidx
29b50 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
29b60 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iPg++){.      
29b70 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f      iKey = FTS5_
29b80 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
29b90 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20 20 20  egid, iPg);.    
29ba0 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
29bb0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
29bc0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
29bd0 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
29be0 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
29bf0 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
29c00 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20 70 2d  f(pLeaf)!=0 ) p-
29c10 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
29c20 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
29c30 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
29c40 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
29c50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29c60 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66 20        iPrevLeaf 
29c70 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
29c80 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20  gno(pDlidx);..  
29c90 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
29ca0 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61 67  hat the leaf pag
29cb0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
29cc0 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 6c  he iterator real
29cd0 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  ly does.        
29ce0 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  ** contain the r
29cf0 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20 62  owid suggested b
29d00 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  y the same. */. 
29d10 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
29d20 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
29d30 28 69 53 65 67 69 64 2c 20 69 50 72 65 76 4c 65  (iSegid, iPrevLe
29d40 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  af);.        pLe
29d50 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
29d60 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
29d70 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
29d80 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
29d90 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Rowid;.         
29da0 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d   int iRowidOff =
29db0 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
29dc0 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20  widOff(pLeaf);. 
29dd0 20 20 20 20 20 20 20 20 20 41 53 53 45 52 54 5f           ASSERT_
29de0 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29  SZLEAF_OK(pLeaf)
29df0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29e00 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61 66  iRowidOff>=pLeaf
29e10 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
29e20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
29e30 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
29e40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29e50 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 47             fts5G
29e60 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
29e70 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28  >p[iRowidOff], (
29e80 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
29e90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
29ea0 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69 64 78  Rowid!=fts5Dlidx
29eb0 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
29ec0 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  ) ) p->rc = FTS5
29ed0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
29ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29ef0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
29f00 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
29f10 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
29f20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20   iDlidxPrevLeaf 
29f30 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66 74 73  = iPg;.      fts
29f40 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
29f50 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74  Dlidx);.      ft
29f60 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
29f70 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69 49  se(p, iSegid, iI
29f80 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d 65 6c  dxLeaf);.    }el
29f90 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69 64 78  se{.      iDlidx
29fa0 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
29fb0 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20  >pgnoLast;.     
29fc0 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
29fd0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f 63 6c  there is no docl
29fe0 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ist index */.   
29ff0 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72 65 76   }..    iIdxPrev
2a000 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b  Leaf = iIdxLeaf;
2a010 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71  .  }..  rc2 = sq
2a020 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2a030 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Stmt);.  if( p->
2a040 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
2a050 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20  p->rc = rc2;..  
2a060 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69 4c 65  /* Page iter.iLe
2a070 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65 20 74  af must now be t
2a080 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c 65 61  he rightmost lea
2a090 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20 73 65  f-page in the se
2a0a0 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30 0a 20  gment */.#if 0. 
2a0b0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2a0c0 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69 4c  TE_OK && iter.iL
2a0d0 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  eaf!=pSeg->pgnoL
2a0e0 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ast ){.    p->rc
2a0f0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2a100 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  .  }.#endif.}...
2a110 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e  /*.** Run intern
2a120 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e 73  al checks to ens
2a130 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54 53  ure that the FTS
2a140 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69 6e   index (a) is in
2a150 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e  ternally .** con
2a160 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29 20  sistent and (b) 
2a170 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
2a180 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 58   for which the X
2a190 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73  OR of the checks
2a1a0 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c  ums.** as calcul
2a1b0 61 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 46  ated by sqlite3F
2a1c0 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2a1d0 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a  um() is cksum..*
2a1e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2a1f0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
2a200 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  y of the interna
2a210 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f  l checks fail, o
2a220 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63  r if the.** chec
2a230 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ksum does not ma
2a240 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  tch. Return SQLI
2a250 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65  TE_OK if all che
2a260 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74  cks pass without
2a270 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f  .** error, or so
2a280 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
2a290 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
2a2a0 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67  other error (e.g
2a2b0 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73  . OOM).** occurs
2a2c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a2d0 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
2a2e0 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
2a2f0 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29  x *p, u64 cksum)
2a300 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  {.  u64 cksum2 =
2a310 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a320 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
2a330 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
2a340 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
2a350 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
2a360 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  list = {0,0,0}; 
2a370 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
2a380 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69   to hold a posli
2a390 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  st */.  Fts5Inde
2a3a0 78 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20  xIter *pIter;   
2a3b0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2a3c0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2a3d0 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20  gh entire index 
2a3e0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2a3f0 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
2a400 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
2a410 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64  ructure */..#ifd
2a420 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2a430 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74    /* Used by ext
2a440 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  ra internal test
2a450 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44  s only run if ND
2a460 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
2a470 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  ned */.  u64 cks
2a480 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um3 = 0;        
2a490 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2a4a0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
2a4b0 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
2a4c0 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
2a4d0 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d  r term = {0,0,0}
2a4e0 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  ;      /* Buffer
2a4f0 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f   used to hold mo
2a500 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a  st recent term *
2a510 2f 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a  /.#endif.  .  /*
2a520 20 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e   Load the FTS in
2a530 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
2a540 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
2a550 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
2a560 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
2a570 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
2a580 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73   nodes of each s
2a590 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65  egment match the
2a5a0 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28   leaves */.  if(
2a5b0 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
2a5c0 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
2a5d0 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
2a5e0 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
2a5f0 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
2a600 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
2a610 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
2a620 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
2a630 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
2a640 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
2a650 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
2a660 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
2a670 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
2a680 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49  ];.        fts5I
2a690 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2a6a0 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65  ckSegment(p, pSe
2a6b0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2a6c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
2a6d0 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70  cksum argument p
2a6e0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
2a6f0 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63  nction is a chec
2a700 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a  ksum calculated.
2a710 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c    ** based on al
2a720 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69  l expected entri
2a730 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  es in the FTS in
2a740 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70  dex (including p
2a750 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a  refix index.  **
2a760 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20   entries). This 
2a770 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61  block checks tha
2a780 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  t a checksum cal
2a790 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  culated based on
2a7a0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
2a7b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53   contents of FTS
2a7c0 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69   index is identi
2a7d0 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cal..  **.  ** T
2a7e0 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
2a7f0 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d  he same checksum
2a800 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e   are calculated.
2a810 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63   The first (stac
2a820 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  k.  ** variable 
2a830 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e  cksum2) based on
2a840 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74   entries extract
2a850 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c  ed from the full
2a860 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a  -text index.  **
2a870 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c   while doing a l
2a880 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61  inear scan of ea
2a890 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e  ch individual in
2a8a0 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20  dex in turn. .  
2a8b0 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20  **.  ** As each 
2a8c0 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20  term visited by 
2a8d0 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73  the linear scans
2a8e0 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65  , a separate que
2a8f0 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ry for the.  ** 
2a900 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72  same term is per
2a910 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69  formed. cksum3 i
2a920 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  s calculated bas
2a930 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65  ed on the entrie
2a940 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64  s.  ** extracted
2a950 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65   by these querie
2a960 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74  s..  */.  for(ft
2a970 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
2a980 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c  , pStruct, 0, 0,
2a990 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70   0, 0, -1, 0, &p
2a9a0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
2a9b0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
2a9c0 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
2a9d0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
2a9e0 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
2a9f0 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74   0).  ){.    int
2aa00 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
2aa10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2aa20 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
2aa30 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f  s */.    i64 iPo
2aa40 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2aa50 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
2aa60 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69   read from posli
2aa70 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  st */.    int iO
2aa80 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
2aa90 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2aaa0 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a  within poslist *
2aab0 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
2aac0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
2aad0 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
2aae0 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
2aaf0 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
2ab00 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b  Term(pIter, &n);
2ab10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2ab20 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20   is a new term, 
2ab30 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70  query for it. Up
2ab40 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68  date cksum3 with
2ab50 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f   the results. */
2ab60 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72  .    fts5TestTer
2ab70 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e  m(p, &term, z, n
2ab80 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d  , cksum2, &cksum
2ab90 33 29 3b 0a 0a 20 20 20 20 70 6f 73 6c 69 73 74  3);..    poslist
2aba0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35  .n = 0;.    fts5
2abb0 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
2abc0 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  , &pIter->aSeg[p
2abd0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
2abe0 69 46 69 72 73 74 5d 20 2c 20 30 2c 20 26 70 6f  iFirst] , 0, &po
2abf0 73 6c 69 73 74 29 3b 0a 20 20 20 20 77 68 69 6c  slist);.    whil
2ac00 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  e( 0==sqlite3Fts
2ac10 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 70  5PoslistNext64(p
2ac20 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73  oslist.p, poslis
2ac30 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f  t.n, &iOff, &iPo
2ac40 73 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  s) ){.      int 
2ac50 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32  iCol = FTS5_POS2
2ac60 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20  COLUMN(iPos);.  
2ac70 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20      int iTokOff 
2ac80 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45  = FTS5_POS2OFFSE
2ac90 54 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 63  T(iPos);.      c
2aca0 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33  ksum2 ^= sqlite3
2acb0 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  Fts5IndexEntryCk
2acc0 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c  sum(iRowid, iCol
2acd0 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a  , iTokOff, -1, z
2ace0 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , n);.    }.  }.
2acf0 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70    fts5TestTerm(p
2ad00 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63  , &term, 0, 0, c
2ad10 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b  ksum2, &cksum3);
2ad20 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
2ad30 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b  rFree(p, pIter);
2ad40 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
2ad50 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d  LITE_OK && cksum
2ad60 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63  !=cksum2 ) p->rc
2ad70 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2ad80 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ..  fts5Structur
2ad90 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
2ada0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2adb0 5f 44 45 42 55 47 0a 20 20 66 74 73 35 42 75 66  _DEBUG.  fts5Buf
2adc0 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
2add0 23 65 6e 64 69 66 0a 20 20 66 74 73 35 42 75 66  #endif.  fts5Buf
2ade0 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74  ferFree(&poslist
2adf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
2ae00 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
2ae10 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
2ae20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2ae60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aea0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f  ********.** Belo
2aeb0 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  w this point is 
2aec0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2aed0 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64  on of the fts5_d
2aee0 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a  ecode() scalar.*
2aef0 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e  * function only.
2af00 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  .*/../*.** Decod
2af10 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61  e a segment-data
2af20 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20   rowid from the 
2af30 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68  %_data table. Th
2af40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
2af50 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f  * the opposite o
2af60 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47  f macro FTS5_SEG
2af70 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f  MENT_ROWID()..*/
2af80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2af90 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20  5DecodeRowid(.  
2afa0 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20  i64 iRowid,     
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afc0 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f  /* Rowid from %_
2afd0 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
2afe0 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20  int *piSegid,   
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20  /* OUT: Segment 
2b010 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44  id */.  int *pbD
2b020 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  lidx,           
2b030 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2b040 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20  Dlidx flag */.  
2b050 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20  int *piHeight,  
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a  /* OUT: Height *
2b080 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20  /.  int *piPgno 
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65      /* OUT: Page
2b0b0 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
2b0c0 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28  *piPgno = (int)(
2b0d0 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
2b0e0 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50  1 << FTS5_DATA_P
2b0f0 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  AGE_B) - 1));.  
2b100 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
2b110 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20  DATA_PAGE_B;..  
2b120 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74  *piHeight = (int
2b130 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
2b140 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
2b150 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29  _HEIGHT_B) - 1))
2b160 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
2b170 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
2b180 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d  B;..  *pbDlidx =
2b190 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
2b1a0 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69  0x0001);.  iRowi
2b1b0 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
2b1c0 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67  DLI_B;..  *piSeg
2b1d0 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  id = (int)(iRowi
2b1e0 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
2b1f0 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20  FTS5_DATA_ID_B) 
2b200 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  - 1));.}..static
2b210 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52   void fts5DebugR
2b220 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46  owid(int *pRc, F
2b230 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2b240 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e   i64 iKey){.  in
2b250 74 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  t iSegid, iHeigh
2b260 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78  t, iPgno, bDlidx
2b270 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
2b280 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20   compenents */. 
2b290 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
2b2a0 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20  (iKey, &iSegid, 
2b2b0 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68  &bDlidx, &iHeigh
2b2c0 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69  t, &iPgno);..  i
2b2d0 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a  f( iSegid==0 ){.
2b2e0 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54      if( iKey==FT
2b2f0 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
2b300 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
2b310 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2b320 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2b330 75 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20  uf, "{averages} 
2b340 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
2b350 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2b360 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2b370 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b  tf(pRc, pBuf, "{
2b380 73 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20  structure}");.  
2b390 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a    }.  }.  else{.
2b3a0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2b3b0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2b3c0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25  f(pRc, pBuf, "{%
2b3d0 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70  ssegid=%d h=%d p
2b3e0 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20  gno=%d}",.      
2b3f0 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64    bDlidx ? "dlid
2b400 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64  x " : "", iSegid
2b410 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f  , iHeight, iPgno
2b420 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  .    );.  }.}..s
2b430 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2b440 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a 20  ebugStructure(. 
2b450 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
2b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b470 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f   /* IN/OUT: erro
2b480 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
2b490 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20  Buffer *pBuf,.  
2b4a0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2b4b0 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  .){.  int iLvl, 
2b4c0 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
2b4d0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65        /* Iterate
2b4e0 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c   through levels,
2b4f0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20   segments */..  
2b500 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
2b510 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  <p->nLevel; iLvl
2b520 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  ++){.    Fts5Str
2b530 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
2b540 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69  l = &p->aLevel[i
2b550 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  Lvl];.    sqlite
2b560 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2b570 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2b580 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c  f, .        " {l
2b590 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20  vl=%d nMerge=%d 
2b5a0 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20  nSeg=%d", iLvl, 
2b5b0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c  pLvl->nMerge, pL
2b5c0 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a  vl->nSeg.    );.
2b5d0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
2b5e0 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
2b5f0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
2b600 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2b610 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
2b620 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
2b630 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2b640 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2b650 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2b660 20 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25   {id=%d leaves=%
2b670 64 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20  d..%d}", .      
2b680 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64      pSeg->iSegid
2b690 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  , pSeg->pgnoFirs
2b6a0 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  t, pSeg->pgnoLas
2b6b0 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
2b6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2b6d0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2b6e0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d  tf(pRc, pBuf, "}
2b6f0 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
2b700 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66   This is part of
2b710 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
2b720 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64  () debugging aid
2b730 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
2b740 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f  s pBlob/nBlob co
2b750 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a  ntain a serializ
2b760 65 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ed Fts5Structure
2b770 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a   object. This.**
2b780 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
2b790 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
2b7a0 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
2b7b0 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62  n of the same ob
2b7c0 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62  ject.** to the b
2b7d0 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20  uffer passed as 
2b7e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2b7f0 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ent. .*/.static 
2b800 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53  void fts5DecodeS
2b810 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20  tructure(.  int 
2b820 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
2b830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b840 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64  N/OUT: error cod
2b850 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
2b860 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74  r *pBuf,.  const
2b870 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20   u8 *pBlob, int 
2b880 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72  nBlob.){.  int r
2b890 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2b8b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
2b8c0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20  ts5Structure *p 
2b8d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2b8e0 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74  * Decoded struct
2b8f0 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  ure object */.. 
2b900 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74   rc = fts5Struct
2b910 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c  ureDecode(pBlob,
2b920 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a   nBlob, 0, &p);.
2b930 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b940 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20  _OK ){.    *pRc 
2b950 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
2b960 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62  ;.  }..  fts5Deb
2b970 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c  ugStructure(pRc,
2b980 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73   pBuf, p);.  fts
2b990 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
2b9a0 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  e(p);.}../*.** T
2b9b0 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74  his is part of t
2b9c0 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
2b9d0 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a   debugging aid..
2b9e0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20  **.** Arguments 
2b9f0 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74  pBlob/nBlob cont
2ba00 61 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73  ain an "averages
2ba10 22 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66  " record. This f
2ba20 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65  unction .** appe
2ba30 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  nds a human-read
2ba40 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
2ba50 69 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f  ion of record to
2ba60 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73   the buffer pass
2ba70 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65  ed .** as the se
2ba80 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a  cond argument. .
2ba90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2baa0 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65  ts5DecodeAverage
2bab0 73 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  s(.  int *pRc,  
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bad0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2bae0 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
2baf0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2bb00 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42  ,.  const u8 *pB
2bb10 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29  lob, int nBlob.)
2bb20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
2bb30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
2bb40 61 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69  ace = "";..  whi
2bb50 6c 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20  le( i<nBlob ){. 
2bb60 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20     u64 iVal;.   
2bb70 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   i += sqlite3Fts
2bb80 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f  5GetVarint(&pBlo
2bb90 62 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20  b[i], &iVal);.  
2bba0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2bbb0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2bbc0 70 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64  pRc, pBuf, "%s%d
2bbd0 22 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29  ", zSpace, (int)
2bbe0 69 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63  iVal);.    zSpac
2bbf0 65 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a  e = " ";.  }.}..
2bc00 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f  /*.** Buffer (a/
2bc10 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  n) is assumed to
2bc20 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20   contain a list 
2bc30 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  of serialized va
2bc40 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65  rints. Read.** e
2bc50 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61  ach varint and a
2bc60 70 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67  ppend its string
2bc70 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2bc80 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20  to buffer pBuf. 
2bc90 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20  Return.** after 
2bca0 65 69 74 68 65 72 20 74 68 65 20 69 6e 70 75 74  either the input
2bcb0 20 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75   buffer is exhau
2bcc0 73 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75  sted or a 0 valu
2bcd0 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  e is read..**.**
2bce0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2bcf0 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
2bd00 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72  of bytes read fr
2bd10 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  om the input buf
2bd20 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
2bd30 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73  nt fts5DecodePos
2bd40 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46  list(int *pRc, F
2bd50 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2bd60 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
2bd70 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  t n){.  int iOff
2bd80 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
2bd90 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74  Off<n ){.    int
2bda0 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20   iVal;.    iOff 
2bdb0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2bdc0 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61  32(&a[iOff], iVa
2bdd0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l);.    sqlite3F
2bde0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2bdf0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2be00 20 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20   " %d", iVal);. 
2be10 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66   }.  return iOff
2be20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
2be30 74 61 72 74 20 6f 66 20 62 75 66 66 65 72 20 28  tart of buffer (
2be40 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68  a/n) contains th
2be50 65 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63  e start of a doc
2be60 6c 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73  list. The doclis
2be70 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20  t.** may or may 
2be80 6e 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68 69  not finish withi
2be90 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  n the buffer. Th
2bea0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
2beb0 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65  nds a text.** re
2bec0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2bed0 74 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  the part of the 
2bee0 64 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73 20  doclist that is 
2bef0 70 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65  present to buffe
2bf00 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a  r.** pBuf. .**.*
2bf10 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2bf20 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
2bf30 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66   of bytes read f
2bf40 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75  rom the input bu
2bf50 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ffer..*/.static 
2bf60 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f  int fts5DecodeDo
2bf70 63 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20  clist(int *pRc, 
2bf80 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2bf90 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69  , const u8 *a, i
2bfa0 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f  nt n){.  i64 iDo
2bfb0 63 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  cid = 0;.  int i
2bfc0 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Off = 0;..  if( 
2bfd0 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20  n>0 ){.    iOff 
2bfe0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
2bff0 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29  Varint(a, (u64*)
2c000 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71  &iDocid);.    sq
2c010 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2c020 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2c030 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64   pBuf, " id=%lld
2c040 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a  ", iDocid);.  }.
2c050 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20    while( iOff<n 
2c060 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ){.    int nPos;
2c070 0a 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20  .    int bDel;. 
2c080 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2c090 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
2c0a0 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
2c0b0 62 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  bDel);.    sqlit
2c0c0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2c0d0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2c0e0 75 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73 22  uf, " nPos=%d%s"
2c0f0 2c 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22  , nPos, bDel?"*"
2c100 3a 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b  :"");.    iOff +
2c110 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  = fts5DecodePosl
2c120 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26  ist(pRc, pBuf, &
2c130 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69  a[iOff], MIN(n-i
2c140 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20  Off, nPos));.   
2c150 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20   if( iOff<n ){. 
2c160 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
2c170 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73  .      iOff += s
2c180 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2c190 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
2c1a0 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
2c1b0 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44      iDocid += iD
2c1c0 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69  elta;.      sqli
2c1d0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2c1e0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2c1f0 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c  Buf, " id=%lld",
2c200 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a   iDocid);.    }.
2c210 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f    }..  return iO
2c220 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ff;.}../*.** The
2c230 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2c240 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
2c250 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
2c260 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a  fts5_decode()..*
2c270 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2c280 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
2c290 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2c2a0 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
2c2b0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2c2c0 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
2c2d0 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2c300 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
2c310 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
2c320 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
2c330 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2c340 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2c350 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c370 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72    /* Rowid for r
2c380 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f  ecord being deco
2c390 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ded */.  int iSe
2c3a0 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e  gid,iHeight,iPgn
2c3b0 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69  o,bDlidx;/* Rowi
2c3c0 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a  d components */.
2c3d0 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f    const u8 *aBlo
2c3e0 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  b; int n;       
2c3f0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64    /* Record to d
2c400 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61  ecode */.  u8 *a
2c410 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66   = 0;.  Fts5Buff
2c420 65 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  er s;           
2c430 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64          /* Build
2c440 20 75 70 20 74 65 78 74 20 74 6f 20 72 65 74 75   up text to retu
2c450 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  rn here */.  int
2c460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c480 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2c490 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b   int nSpace = 0;
2c4a0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ..  assert( nArg
2c4b0 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==2 );.  memset(
2c4c0 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  &s, 0, sizeof(Ft
2c4d0 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52  s5Buffer));.  iR
2c4e0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
2c4f0 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c  alue_int64(apVal
2c500 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  [0]);..  /* Make
2c510 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
2c520 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28  econd argument (
2c530 61 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62  a blob) in aBlob
2c540 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a  []. The aBlob[].
2c550 20 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c    ** copy is fol
2c560 6c 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44 41  lowed by FTS5_DA
2c570 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20  TA_ZERO_PADDING 
2c580 30 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63  0x00 bytes, whic
2c590 68 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20  h prevents.  ** 
2c5a0 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
2c5b0 20 65 76 65 6e 20 69 66 20 74 68 65 20 72 65 63   even if the rec
2c5c0 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ord is corrupt. 
2c5d0 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65   */.  n = sqlite
2c5e0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70  3_value_bytes(ap
2c5f0 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62  Val[1]);.  aBlob
2c600 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2c610 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b  _blob(apVal[1]);
2c620 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20  .  nSpace = n + 
2c630 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
2c640 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75  ADDING;.  a = (u
2c650 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  8*)sqlite3Fts5Ma
2c660 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53  llocZero(&rc, nS
2c670 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d  pace);.  if( a==
2c680 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f  0 ) goto decode_
2c690 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c  out;.  memcpy(a,
2c6a0 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20 20   aBlob, n);...  
2c6b0 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
2c6c0 69 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64 2c  iRowid, &iSegid,
2c6d0 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67   &bDlidx, &iHeig
2c6e0 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
2c6f0 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26  fts5DebugRowid(&
2c700 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b  rc, &s, iRowid);
2c710 0a 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b  .  if( bDlidx ){
2c720 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 64 6c  .    Fts5Data dl
2c730 69 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  idx;.    Fts5Dli
2c740 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20  dxLvl lvl;..    
2c750 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20  dlidx.p = a;.   
2c760 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a   dlidx.nn = n;..
2c770 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c      memset(&lvl,
2c780 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
2c790 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c  lidxLvl));.    l
2c7a0 76 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69 64  vl.pData = &dlid
2c7b0 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66  x;.    lvl.iLeaf
2c7c0 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20  Pgno = iPgno;.. 
2c7d0 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78     for(fts5Dlidx
2c7e0 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c  LvlNext(&lvl); l
2c7f0 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35  vl.bEof==0; fts5
2c800 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76  DlidxLvlNext(&lv
2c810 6c 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l)){.      sqlit
2c820 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2c830 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73  ndPrintf(&rc, &s
2c840 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 25  , .          " %
2c850 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c  d(%lld)", lvl.iL
2c860 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f  eafPgno, lvl.iRo
2c870 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  wid.      );.   
2c880 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69   }.  }else if( i
2c890 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
2c8a0 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35  if( iRowid==FTS5
2c8b0 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
2c8c0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63  ){.      fts5Dec
2c8d0 6f 64 65 41 76 65 72 61 67 65 73 28 26 72 63 2c  odeAverages(&rc,
2c8e0 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20   &s, a, n);.    
2c8f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
2c900 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65  5DecodeStructure
2c910 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b  (&rc, &s, a, n);
2c920 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2c930 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
2c940 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2c950 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72    /* Current ter
2c960 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67 65  m read from page
2c970 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
2c980 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2c990 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2c9a0 6f 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d 20  of pgidx in a[] 
2c9b0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64  */.    int iPgid
2c9c0 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69 50  xOff;.    int iP
2c9d0 67 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20 20  gidxPrev = 0;   
2c9e0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
2c9f0 6f 75 73 20 76 61 6c 75 65 20 72 65 61 64 20 66  ous value read f
2ca00 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20 20  rom pgidx */.   
2ca10 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20   int iTermOff = 
2ca20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77 69  0;.    int iRowi
2ca30 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e  dOff = 0;.    in
2ca40 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20  t iOff;.    int 
2ca50 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d  nDoclist;..    m
2ca60 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
2ca70 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
2ca80 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3c  r));..    if( n<
2ca90 34 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4 ){.      sqlit
2caa0 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
2cab0 26 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f 6e  &rc, &s, 7, (con
2cac0 73 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22  st u8*)"corrupt"
2cad0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  );.      goto de
2cae0 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 65  code_out;.    }e
2caf0 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  lse{.      iRowi
2cb00 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  dOff = fts5GetU1
2cb10 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  6(&a[0]);.      
2cb20 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65  iPgidxOff = szLe
2cb30 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  af = fts5GetU16(
2cb40 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  &a[2]);.      if
2cb50 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b  ( iPgidxOff<n ){
2cb60 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74  .        fts5Get
2cb70 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
2cb80 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66  dxOff], iTermOff
2cb90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2cba0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
2cbb0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
2cbc0 74 20 74 61 69 6c 20 61 74 20 74 68 65 20 73 74  t tail at the st
2cbd0 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  art of the page 
2cbe0 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  */.    if( iRowi
2cbf0 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20  dOff!=0 ){.     
2cc00 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66   iOff = iRowidOf
2cc10 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  f;.    }else if(
2cc20 20 69 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b 0a   iTermOff!=0 ){.
2cc30 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65        iOff = iTe
2cc40 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65  rmOff;.    }else
2cc50 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 73  {.      iOff = s
2cc60 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20  zLeaf;.    }.   
2cc70 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
2cc80 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34  st(&rc, &s, &a[4
2cc90 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20  ], iOff-4);..   
2cca0 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 6d   /* Decode any m
2ccb0 6f 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74 61  ore doclist data
2ccc0 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e   that appears on
2ccd0 20 74 68 65 20 70 61 67 65 20 62 65 66 6f 72 65   the page before
2cce0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
2ccf0 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e  t term. */.    n
2cd00 44 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72 6d  Doclist = (iTerm
2cd10 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20 3a  Off ? iTermOff :
2cd20 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66 3b   szLeaf) - iOff;
2cd30 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 44  .    fts5DecodeD
2cd40 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
2cd50 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69  &a[iOff], nDocli
2cd60 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  st);..    while(
2cd70 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
2cd80 20 20 20 20 20 20 69 6e 74 20 62 46 69 72 73 74        int bFirst
2cd90 20 3d 20 28 69 50 67 69 64 78 4f 66 66 3d 3d 73   = (iPgidxOff==s
2cda0 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a 20 54  zLeaf);     /* T
2cdb0 72 75 65 20 66 6f 72 20 66 69 72 73 74 20 74 65  rue for first te
2cdc0 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  rm on page */.  
2cdd0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
2cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2ce00 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  es of data */.  
2ce10 20 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20      int iEnd;.  
2ce20 20 20 20 20 0a 20 20 20 20 20 20 69 50 67 69 64      .      iPgid
2ce30 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  xOff += fts5GetV
2ce40 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
2ce50 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
2ce60 20 20 20 20 20 69 50 67 69 64 78 50 72 65 76 20       iPgidxPrev 
2ce70 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  += nByte;.      
2ce80 69 4f 66 66 20 3d 20 69 50 67 69 64 78 50 72 65  iOff = iPgidxPre
2ce90 76 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 50  v;..      if( iP
2cea0 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  gidxOff<n ){.   
2ceb0 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
2cec0 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
2ced0 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
2cee0 20 20 20 20 69 45 6e 64 20 3d 20 69 50 67 69 64      iEnd = iPgid
2cef0 78 50 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a 20  xPrev + nByte;. 
2cf00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2cf10 20 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65 61      iEnd = szLea
2cf20 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  f;.      }..    
2cf30 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20    if( bFirst==0 
2cf40 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
2cf50 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2cf60 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79  32(&a[iOff], nBy
2cf70 74 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72  te);.        ter
2cf80 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  m.n = nByte;.   
2cf90 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 66 66 20     }.      iOff 
2cfa0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2cfb0 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79  32(&a[iOff], nBy
2cfc0 74 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  te);.      fts5B
2cfd0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
2cfe0 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74  &rc, &term, nByt
2cff0 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  e, &a[iOff]);.  
2d000 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74      iOff += nByt
2d010 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e;..      sqlite
2d020 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2d030 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  dPrintf(.       
2d040 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65     &rc, &s, " te
2d050 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e  rm=%.*s", term.n
2d060 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74  , (const char*)t
2d070 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20  erm.p.      );. 
2d080 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2d090 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26  5DecodeDoclist(&
2d0a0 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
2d0b0 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20 20  , iEnd-iOff);.  
2d0c0 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66    }..    fts5Buf
2d0d0 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
2d0e0 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f    }.  . decode_o
2d0f0 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
2d100 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  ee(a);.  if( rc=
2d110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d120 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2d130 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e  _text(pCtx, (con
2d140 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e  st char*)s.p, s.
2d150 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
2d160 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ENT);.  }else{. 
2d170 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2d180 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74  t_error_code(pCt
2d190 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74  x, rc);.  }.  ft
2d1a0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29  s5BufferFree(&s)
2d1b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
2d1c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2d1d0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63   user-defined sc
2d1e0 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74  alar function ft
2d1f0 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73  s5_rowid()..*/.s
2d200 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 52  tatic void fts5R
2d210 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20  owidFunction(.  
2d220 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2d230 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
2d240 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  /* Function call
2d250 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
2d260 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
2d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d280 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   Number of args 
2d290 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20  (always 2) */.  
2d2a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2d2b0 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
2d2c0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75  /* Function argu
2d2d0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ments */.){.  co
2d2e0 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a  nst char *zArg;.
2d2f0 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b    if( nArg==0 ){
2d300 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2d310 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
2d320 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35  "should be: fts5
2d330 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20  _rowid(subject, 
2d340 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d  ....)", -1);.  }
2d350 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d  else{.    zArg =
2d360 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2d370 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
2d380 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20  (apVal[0]);.    
2d390 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
2d3a0 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65  tricmp(zArg, "se
2d3b0 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  gment") ){.     
2d3c0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
2d3d0 20 20 20 69 6e 74 20 73 65 67 69 64 2c 20 70 67     int segid, pg
2d3e0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  no;.      if( nA
2d3f0 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg!=3 ){.       
2d400 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2d410 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20  error(pCtx, .   
2d420 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64           "should
2d430 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28   be: fts5_rowid(
2d440 27 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64  'segment', segid
2d450 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20  , pgno))", -1.  
2d460 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2d470 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
2d480 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  gid = sqlite3_va
2d490 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d  lue_int(apVal[1]
2d4a0 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20  );.        pgno 
2d4b0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2d4c0 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20  int(apVal[2]);. 
2d4d0 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20         iRowid = 
2d4e0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
2d4f0 49 44 28 73 65 67 69 64 2c 20 70 67 6e 6f 29 3b  ID(segid, pgno);
2d500 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d510 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
2d520 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  tx, iRowid);.   
2d530 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2d540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
2d550 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
2d560 20 0a 20 20 20 20 20 20 20 20 22 66 69 72 73 74   .        "first
2d570 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77   arg to fts5_row
2d580 69 64 28 29 20 6d 75 73 74 20 62 65 20 27 73 65  id() must be 'se
2d590 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20 20  gment'" , -1.   
2d5a0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
2d5b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
2d5c0 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
2d5d0 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67 20 74  of registering t
2d5e0 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77  he FTS5 module w
2d5f0 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ith database.** 
2d600 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49  connection db. I
2d610 74 20 72 65 67 69 73 74 65 72 73 20 73 65 76 65  t registers seve
2d620 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ral user-defined
2d630 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
2d640 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68  s useful.** with
2d650 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FTS5..**.** If 
2d660 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
2d670 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2d680 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
2d690 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65  ccurs, some othe
2d6a0 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  r.** SQLite erro
2d6b0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2d6c0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69  ed instead..*/.i
2d6d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2d6e0 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20  dexInit(sqlite3 
2d6f0 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *db){.  int rc =
2d700 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
2d710 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20  function(.      
2d720 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65  db, "fts5_decode
2d730 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
2d740 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65  8, 0, fts5Decode
2d750 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20  Function, 0, 0. 
2d760 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
2d770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
2d780 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
2d790 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
2d7a0 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 72       db, "fts5_r
2d7b0 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54  owid", -1, SQLIT
2d7c0 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35 52  E_UTF8, 0, fts5R
2d7d0 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  owidFunction, 0,
2d7e0 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20   0.    );.  }.  
2d7f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a        return rc;.}..