/ Hex Artifact Content
Login

Artifact 9f2eaae470461015ce175e8616c8b601e73b9bfc26e7d83afea1ec5242b3d0f8:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
4d20: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
4d30: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
4d40: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
4d50: 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 43  slist */.  Fts5C
4d60: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
4d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4d80: 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
4d90: 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
4da0: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64  */..  /* Invoked
4db0: 20 74 6f 20 73 65 74 20 6f 75 74 70 75 74 20 76   to set output v
4dc0: 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76  ariables. */.  v
4dd0: 6f 69 64 20 28 2a 78 53 65 74 4f 75 74 70 75 74  oid (*xSetOutput
4de0: 73 29 28 46 74 73 35 49 74 65 72 2a 2c 20 46 74  s)(Fts5Iter*, Ft
4df0: 73 35 53 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20  s5SegIter*);..  
4e00: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4e30: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4e40: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e60: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4e70: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4e80: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4e90: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4ea0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4eb0: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4ec0: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20  tries */..  i64 
4ed0: 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20  iSwitchRowid;   
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4ef0: 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66  irstest rowid of
4f00: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72   other than aFir
4f10: 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43  st[1] */.  Fts5C
4f20: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
4f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4f40: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
4f50: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
4f60: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61  .  Fts5SegIter a
4f70: 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Seg[1];         
4f80: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
4f90: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4fa0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
4fb0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
4fd0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72   is used to iter
4fe0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4ff0: 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61  contents.** of a
5000: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
5010: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61  ecord..**.** pDa
5020: 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20  ta:.**   Record 
5030: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
5040: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74  oclist-index dat
5050: 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a  a..**.** bEof:.*
5060: 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20  *   Set to true 
5070: 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61  once iterator ha
5080: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a  s reached EOF..*
5090: 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20  *.** iOff:.**   
50a0: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  Set to the curre
50b0: 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
50c0: 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a   record pData..*
50d0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  /.struct Fts5Dli
50e0: 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61  dxLvl {.  Fts5Da
50f0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
5100: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
5110: 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65  for current page
5120: 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a   of this level *
5130: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  /.  int iOff;   
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
5160: 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a  set into pData *
5170: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
51a0: 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ady */.  int iFi
51b0: 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  rstOff;         
51c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
51d0: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
51e0: 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ors */..  /* Out
51f0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
5200: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
5210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5220: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
5230: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
5240: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
5250: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5260: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5270: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5280: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73  LeafPgno */.};.s
5290: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
52a0: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c  ter {.  int nLvl
52b0: 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
52c0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61    Fts5DlidxLvl a
52d0: 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74  Lvl[1];.};..stat
52e0: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
52f0: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
5300: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
5310: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
5320: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
5330: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
5340: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
5350: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5360: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5370: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5380: 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a  In[1];.} ../*.**
5390: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
53a0: 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74  turn a buffer at
53b0: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
53c0: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
53d0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
53e0: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
53f0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
5400: 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  d set the error 
5410: 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  code in.** the F
5420: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20  ts5Index handle 
5430: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5440: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
5450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
5460: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35  s5IdxMalloc(Fts5
5470: 49 6e 64 65 78 20 2a 70 2c 20 73 71 6c 69 74 65  Index *p, sqlite
5480: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
5490: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
54a0: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
54b0: 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d  p->rc, nByte);.}
54c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
54d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
54e0: 74 68 65 20 70 4c 65 66 74 20 62 75 66 66 65 72  the pLeft buffer
54f0: 20 77 69 74 68 20 74 68 65 20 70 52 69 67 68 74   with the pRight
5500: 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a  /nRight blob..**
5510: 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69  .** Return -ve i
5520: 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c  f pLeft is small
5530: 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20  er than pRight, 
5540: 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71  0 if they are eq
5550: 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66  ual or.** +ve if
5560: 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c   pRight is small
5570: 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49  er than pLeft. I
5580: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a  n other words:.*
5590: 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a  *.**     res = *
55a0: 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a  pLeft - *pRight.
55b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
55c0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
55d0: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
55e0: 61 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42  areBlob(.  Fts5B
55f0: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20  uffer *pLeft,   
5600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
5610: 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft hand side of 
5620: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
5630: 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74  const u8 *pRight
5640: 2c 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20  , int nRight    
5650: 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73 69  /* Right hand si
5660: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
5670: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
5680: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
5690: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
56a0: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
56b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20  eft->p, pRight, 
56c0: 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  nCmp);.  return 
56d0: 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74  (res==0 ? (pLeft
56e0: 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20  ->n - nRight) : 
56f0: 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  res);.}.#endif..
5700: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
5710: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
5720: 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73  e two buffers us
5730: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ing memcmp(). If
5740: 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   one buffer.** i
5750: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
5760: 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63  e other, it is c
5770: 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65  onsidered the le
5780: 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sser..**.** Retu
5790: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
57a0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57b0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
57c0: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
57d0: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
57e0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57f0: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
5800: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
5810: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
5820: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
5830: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
5840: 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66  Compare(Fts5Buff
5850: 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42  er *pLeft, Fts5B
5860: 75 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a  uffer *pRight){.
5870: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
5880: 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68  (pLeft->n, pRigh
5890: 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73  t->n);.  int res
58a0: 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d   = memcmp(pLeft-
58b0: 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e  >p, pRight->p, n
58c0: 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmp);.  return (
58d0: 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d  res==0 ? (pLeft-
58e0: 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20  >n - pRight->n) 
58f0: 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69  : res);.}..stati
5900: 63 20 69 6e 74 20 66 74 73 35 4c 65 61 66 46 69  c int fts5LeafFi
5910: 72 73 74 54 65 72 6d 4f 66 66 28 46 74 73 35 44  rstTermOff(Fts5D
5920: 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69  ata *pLeaf){.  i
5930: 6e 74 20 72 65 74 3b 0a 20 20 66 74 73 35 47 65  nt ret;.  fts5Ge
5940: 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
5950: 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ->p[pLeaf->szLea
5960: 66 5d 2c 20 72 65 74 29 3b 0a 20 20 72 65 74 75  f], ret);.  retu
5970: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
5980: 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d   Close the read-
5990: 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65  only blob handle
59a0: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
59b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
59c0: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
59d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
59e0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20   if( p->pReader 
59f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
5a00: 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20 70  lob *pReader = p
5a10: 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 70  ->pReader;.    p
5a20: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
5a30: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
5a40: 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b 0a  close(pReader);.
5a50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
5a60: 72 69 65 76 65 20 61 20 72 65 63 6f 72 64 20 66  rieve a record f
5a70: 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
5a80: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  able..**.** If a
5a90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
5aa0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
5ab0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65   and an error le
5ac0: 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74  ft in the .** Ft
5ad0: 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a  s5Index object..
5ae0: 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 44 61  */.static Fts5Da
5af0: 74 61 20 2a 66 74 73 35 44 61 74 61 52 65 61 64  ta *fts5DataRead
5b00: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
5b10: 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46 74  64 iRowid){.  Ft
5b20: 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20 30  s5Data *pRet = 0
5b30: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
5b40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5b50: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5b60: 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  OK;..    if( p->
5b70: 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  pReader ){.     
5b80: 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
5b90: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
5ba0: 41 42 4f 52 54 20 69 66 20 74 68 65 72 65 20 68  ABORT if there h
5bb0: 61 73 20 62 65 65 6e 20 61 20 73 61 76 65 70 6f  as been a savepo
5bc0: 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  int.      ** rol
5bd0: 6c 62 61 63 6b 20 73 69 6e 63 65 20 69 74 20 77  lback since it w
5be0: 61 73 20 6c 61 73 74 20 75 73 65 64 2e 20 49 6e  as last used. In
5bf0: 20 74 68 69 73 20 63 61 73 65 20 61 20 6e 65 77   this case a new
5c00: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20   blob handle.   
5c10: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
5c20: 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  d.  */.      sql
5c30: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
5c40: 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20   = p->pReader;. 
5c50: 20 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20       p->pReader 
5c60: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
5c70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f  sqlite3_blob_reo
5c80: 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69  pen(pBlob, iRowi
5c90: 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
5ca0: 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
5cb0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  );.      p->pRea
5cc0: 64 65 72 20 3d 20 70 42 6c 6f 62 3b 0a 20 20 20  der = pBlob;.   
5cd0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
5ce0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
5cf0: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
5d00: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
5d10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5d20: 5f 41 42 4f 52 54 20 29 20 72 63 20 3d 20 53 51  _ABORT ) rc = SQ
5d30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
5d40: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 62 6c      /* If the bl
5d50: 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74  ob handle is not
5d60: 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f   open at this po
5d70: 69 6e 74 2c 20 6f 70 65 6e 20 69 74 20 61 6e 64  int, open it and
5d80: 20 73 65 65 6b 20 0a 20 20 20 20 2a 2a 20 74 6f   seek .    ** to
5d90: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 65   the requested e
5da0: 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ntry.  */.    if
5db0: 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
5dc0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
5dd0: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f   ){.      Fts5Co
5de0: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
5df0: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
5e00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5e10: 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
5e20: 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  ->db, .         
5e30: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
5e40: 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f  ->zDataTbl, "blo
5e50: 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20  ck", iRowid, 0, 
5e60: 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20  &p->pReader.    
5e70: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
5e80: 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  /* If either of 
5e90: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  the sqlite3_blob
5ea0: 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
5eb0: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29  e3_blob_reopen()
5ec0: 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61 62   calls.    ** ab
5ed0: 6f 76 65 20 72 65 74 75 72 6e 65 64 20 53 51 4c  ove returned SQL
5ee0: 49 54 45 5f 45 52 52 4f 52 2c 20 72 65 74 75 72  ITE_ERROR, retur
5ef0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
5f00: 5f 56 54 41 42 20 69 6e 73 74 65 61 64 2e 0a 20  _VTAB instead.. 
5f10: 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72 65     ** All the re
5f20: 61 73 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e 63  asons those func
5f30: 74 69 6f 6e 73 20 6d 69 67 68 74 20 72 65 74 75  tions might retu
5f40: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
5f50: 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a 2a  - missing.    **
5f60: 20 74 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67 20   table, missing 
5f70: 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74 65  row, non-blob/te
5f80: 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c 75  xt in block colu
5f90: 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65 20 0a 20  mn - indicate . 
5fa0: 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73 74     ** backing st
5fb0: 6f 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ore corruption. 
5fc0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
5fd0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 72  SQLITE_ERROR ) r
5fe0: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
5ff0: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
6000: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6010: 20 20 75 38 20 2a 61 4f 75 74 20 3d 20 30 3b 20    u8 *aOut = 0; 
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6030: 20 52 65 61 64 20 62 6c 6f 62 20 64 61 74 61 20   Read blob data 
6040: 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
6050: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
6060: 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  yte = sqlite3_bl
6070: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61  ob_bytes(p->pRea
6080: 64 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  der);.      sqli
6090: 74 65 33 5f 69 6e 74 36 34 20 6e 41 6c 6c 6f 63  te3_int64 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 36 34 28 6e 41 6c 6c 6f 63  _malloc64(nAlloc
6100: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
6110: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65  t ){.        pRe
6120: 74 2d 3e 6e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  t->nn = nByte;. 
6130: 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20 70 52         aOut = pR
6140: 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 52  et->p = (u8*)&pR
6150: 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  et[1];.      }el
6160: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
6170: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6180: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
6190: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
61a0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
61b0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
61c0: 64 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 61 4f  d(p->pReader, aO
61d0: 75 74 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20  ut, nByte, 0);. 
61e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
61f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6200: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6210: 33 5f 66 72 65 65 28 70 52 65 74 29 3b 0a 20 20  3_free(pRet);.  
6220: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
6230: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6240: 20 20 20 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 46       /* TODO1: F
6250: 69 78 20 74 68 69 73 20 2a 2f 0a 20 20 20 20 20  ix this */.     
6260: 20 20 20 70 52 65 74 2d 3e 70 5b 6e 42 79 74 65     pRet->p[nByte
6270: 5d 20 3d 20 30 78 30 30 3b 0a 20 20 20 20 20 20  ] = 0x00;.      
6280: 20 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 20 3d    pRet->szLeaf =
6290: 20 66 74 73 35 47 65 74 55 31 36 28 26 70 52 65   fts5GetU16(&pRe
62a0: 74 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 20 20  t->p[2]);.      
62b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  }.    }.    p->r
62c0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e  c = rc;.    p->n
62d0: 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61  Read++;.  }..  a
62e0: 73 73 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29  ssert( (pRet==0)
62f0: 3d 3d 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  ==(p->rc!=SQLITE
6300: 5f 4f 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  _OK) );.  return
6310: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
6320: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6330: 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f  nce to data reco
6340: 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  rd returned by a
6350: 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
6360: 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61  o.** fts5DataRea
6370: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
6380: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65  oid fts5DataRele
6390: 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44  ase(Fts5Data *pD
63a0: 61 74 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ata){.  sqlite3_
63b0: 66 72 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a  free(pData);.}..
63c0: 73 74 61 74 69 63 20 46 74 73 35 44 61 74 61 20  static Fts5Data 
63d0: 2a 66 74 73 35 4c 65 61 66 52 65 61 64 28 46 74  *fts5LeafRead(Ft
63e0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
63f0: 69 52 6f 77 69 64 29 7b 0a 20 20 46 74 73 35 44  iRowid){.  Fts5D
6400: 61 74 61 20 2a 70 52 65 74 20 3d 20 66 74 73 35  ata *pRet = fts5
6410: 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
6420: 69 64 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20  id);.  if( pRet 
6430: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d  ){.    if( pRet-
6440: 3e 73 7a 4c 65 61 66 3e 70 52 65 74 2d 3e 6e 6e  >szLeaf>pRet->nn
6450: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
6460: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
6470: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
6480: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
6490: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
64a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
64b0: 70 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  pRet;.}..static 
64c0: 69 6e 74 20 66 74 73 35 49 6e 64 65 78 50 72 65  int fts5IndexPre
64d0: 70 61 72 65 53 74 6d 74 28 0a 20 20 46 74 73 35  pareStmt(.  Fts5
64e0: 49 6e 64 65 78 20 2a 70 2c 0a 20 20 73 71 6c 69  Index *p,.  sqli
64f0: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
6500: 74 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a  t,.  char *zSql.
6510: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
6520: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6530: 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20   if( zSql ){.   
6540: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
6550: 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28 70 2d  e3_prepare_v3(p-
6560: 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53  >pConfig->db, zS
6570: 71 6c 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20  ql, -1,.        
6580: 20 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45    SQLITE_PREPARE
6590: 5f 50 45 52 53 49 53 54 45 4e 54 7c 53 51 4c 49  _PERSISTENT|SQLI
65a0: 54 45 5f 50 52 45 50 41 52 45 5f 4e 4f 5f 56 54  TE_PREPARE_NO_VT
65b0: 41 42 2c 0a 20 20 20 20 20 20 20 20 20 20 70 70  AB,.          pp
65c0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Stmt, 0);.    }e
65d0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  lse{.      p->rc
65e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
65f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
6600: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
6610: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
6620: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52  .}.../*.** INSER
6630: 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72  T OR REPLACE a r
6640: 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25  ecord into the %
6650: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  _data table..*/.
6660: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6670: 44 61 74 61 57 72 69 74 65 28 46 74 73 35 49 6e  DataWrite(Fts5In
6680: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
6690: 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  id, const u8 *pD
66a0: 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b  ata, int nData){
66b0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
66c0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
66d0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69  ;..  if( p->pWri
66e0: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74  ter==0 ){.    Ft
66f0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
6700: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
6710: 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65      fts5IndexPre
6720: 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e  pareStmt(p, &p->
6730: 70 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33  pWriter, sqlite3
6740: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6750: 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54      "REPLACE INT
6760: 4f 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27  O '%q'.'%q_data'
6770: 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55  (id, block) VALU
6780: 45 53 28 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20  ES(?,?)", .     
6790: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
67a0: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
67b0: 65 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66  e.    ));.    if
67c0: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
67d0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
67e0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
67f0: 57 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77 69  Writer, 1, iRowi
6800: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  d);.  sqlite3_bi
6810: 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74  nd_blob(p->pWrit
6820: 65 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e 44  er, 2, pData, nD
6830: 61 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ata, SQLITE_STAT
6840: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  IC);.  sqlite3_s
6850: 74 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  tep(p->pWriter);
6860: 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
6870: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72 69  e3_reset(p->pWri
6880: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ter);.  sqlite3_
6890: 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d 3e 70 57 72  bind_null(p->pWr
68a0: 69 74 65 72 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  iter, 2);.}../*.
68b0: 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66  ** Execute the f
68c0: 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a  ollowing SQL:.**
68d0: 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46  .**     DELETE F
68e0: 52 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45  ROM %_data WHERE
68f0: 20 69 64 20 42 45 54 57 45 45 4e 20 24 69 46 69   id BETWEEN $iFi
6900: 72 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a  rst AND $iLast.*
6910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6920: 73 35 44 61 74 61 44 65 6c 65 74 65 28 46 74 73  s5DataDelete(Fts
6930: 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
6940: 46 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74  First, i64 iLast
6950: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ){.  if( p->rc!=
6960: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
6970: 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44  rn;..  if( p->pD
6980: 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  eleter==0 ){.   
6990: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
69a0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
69b0: 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  g;.    char *zSq
69c0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
69d0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 44 45  ntf(.        "DE
69e0: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
69f0: 25 71 5f 64 61 74 61 27 20 57 48 45 52 45 20 69  %q_data' WHERE i
6a00: 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 2c  d>=? AND id<=?",
6a10: 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
6a20: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
6a30: 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  g->zName.    );.
6a40: 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65      if( fts5Inde
6a50: 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
6a60: 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 7a 53  &p->pDeleter, zS
6a70: 71 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ql) ) return;.  
6a80: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  }..  sqlite3_bin
6a90: 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65  d_int64(p->pDele
6aa0: 74 65 72 2c 20 31 2c 20 69 46 69 72 73 74 29 3b  ter, 1, iFirst);
6ab0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
6ac0: 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65  int64(p->pDelete
6ad0: 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a 20 20  r, 2, iLast);.  
6ae0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
6af0: 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 70 2d 3e  pDeleter);.  p->
6b00: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
6b10: 65 74 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  et(p->pDeleter);
6b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
6b30: 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61 73 73   all records ass
6b40: 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 65 67  ociated with seg
6b50: 6d 65 6e 74 20 69 53 65 67 69 64 2e 0a 2a 2f 0a  ment iSegid..*/.
6b60: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6b70: 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e  DataRemoveSegmen
6b80: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
6b90: 69 6e 74 20 69 53 65 67 69 64 29 7b 0a 20 20 69  int iSegid){.  i
6ba0: 36 34 20 69 46 69 72 73 74 20 3d 20 46 54 53 35  64 iFirst = FTS5
6bb0: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
6bc0: 53 65 67 69 64 2c 20 30 29 3b 0a 20 20 69 36 34  Segid, 0);.  i64
6bd0: 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f 53 45   iLast = FTS5_SE
6be0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
6bf0: 69 64 2b 31 2c 20 30 29 2d 31 3b 0a 20 20 66 74  id+1, 0)-1;.  ft
6c00: 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20  s5DataDelete(p, 
6c10: 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a  iFirst, iLast);.
6c20: 20 20 69 66 28 20 70 2d 3e 70 49 64 78 44 65 6c    if( p->pIdxDel
6c30: 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46  eter==0 ){.    F
6c40: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
6c50: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
6c60: 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
6c70: 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
6c80: 3e 70 49 64 78 44 65 6c 65 74 65 72 2c 20 73 71  >pIdxDeleter, sq
6c90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
6ca0: 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45           "DELETE
6cb0: 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69   FROM '%q'.'%q_i
6cc0: 64 78 27 20 57 48 45 52 45 20 73 65 67 69 64 3d  dx' WHERE segid=
6cd0: 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  ?",.          pC
6ce0: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e  onfig->zDb, pCon
6cf0: 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  fig->zName.    )
6d00: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
6d10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6d20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
6d30: 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 44 65 6c  d_int(p->pIdxDel
6d40: 65 74 65 72 2c 20 31 2c 20 69 53 65 67 69 64 29  eter, 1, iSegid)
6d50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
6d60: 65 70 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  ep(p->pIdxDelete
6d70: 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  r);.    p->rc = 
6d80: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
6d90: 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20  >pIdxDeleter);. 
6da0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
6db0: 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
6dc0: 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75 63 74  to an Fts5Struct
6dd0: 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74 75 72  ure object retur
6de0: 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
6df0: 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74  r .** call to ft
6e00: 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
6e10: 29 20 6f 72 20 66 74 73 35 53 74 72 75 63 74 75  ) or fts5Structu
6e20: 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73  reDecode()..*/.s
6e30: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
6e40: 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
6e50: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
6e60: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70  Struct){.  if( p
6e70: 53 74 72 75 63 74 20 26 26 20 30 3e 3d 28 2d 2d  Struct && 0>=(--
6e80: 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 29 20 29  pStruct->nRef) )
6e90: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
6ea0: 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
6eb0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
6ec0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72   for(i=0; i<pStr
6ed0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  uct->nLevel; i++
6ee0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6ef0: 5f 66 72 65 65 28 70 53 74 72 75 63 74 2d 3e 61  _free(pStruct->a
6f00: 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a  Level[i].aSeg);.
6f10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6f20: 33 5f 66 72 65 65 28 70 53 74 72 75 63 74 29 3b  3_free(pStruct);
6f30: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
6f40: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
6f50: 65 52 65 66 28 46 74 73 35 53 74 72 75 63 74 75  eRef(Fts5Structu
6f60: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
6f70: 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 2b 2b 3b  pStruct->nRef++;
6f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  .}../*.** Deseri
6f90: 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e  alize and return
6fa0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
6fb0: 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c 79 20  ecord currently 
6fc0: 73 74 6f 72 65 64 20 69 6e 20 73 65 72 69 61 6c  stored in serial
6fd0: 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20 77 69 74  ized.** form wit
6fe0: 68 69 6e 20 62 75 66 66 65 72 20 70 44 61 74 61  hin buffer pData
6ff0: 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  /nData..**.** Th
7000: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
7010: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
7020: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
7030: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
7040: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
7050: 6c 6f 63 61 74 65 64 20 62 79 20 6f 6e 65 20 73  located by one s
7060: 6c 6f 74 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  lot. This allows
7070: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63   the structure c
7080: 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f 20 62 65  ontents.** to be
7090: 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 65 64 69   more easily edi
70a0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
70b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
70c0: 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  ppOut is set to 
70d0: 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69  NULL and an SQLi
70e0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  te error code.**
70f0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
7100: 77 69 73 65 2c 20 2a 70 70 4f 75 74 20 69 73 20  wise, *ppOut is 
7110: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
7120: 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  the new object a
7130: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
7140: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
7150: 74 69 63 20 69 6e 74 20 66 74 73 35 53 74 72 75  tic int fts5Stru
7160: 63 74 75 72 65 44 65 63 6f 64 65 28 0a 20 20 63  ctureDecode(.  c
7170: 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7190: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
71a0: 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 73  ing serialized s
71b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
71c0: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71e0: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
71f0: 70 44 61 74 61 20 69 6e 20 62 79 74 65 73 20 2a  pData in bytes *
7200: 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6f 6b 69  /.  int *piCooki
7210: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7220: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61      /* Configura
7230: 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75  tion cookie valu
7240: 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  e */.  Fts5Struc
7250: 74 75 72 65 20 2a 2a 70 70 4f 75 74 20 20 20 20  ture **ppOut    
7260: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
7270: 65 73 65 72 69 61 6c 69 7a 65 64 20 6f 62 6a 65  eserialized obje
7280: 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ct */.){.  int r
7290: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
72a0: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
72b0: 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c  t iLvl;.  int nL
72c0: 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  evel = 0;.  int 
72d0: 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  nSegment = 0;.  
72e0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
72f0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
7300: 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
7310: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 74  e to allocate at
7320: 20 70 52 65 74 20 2a 2f 0a 20 20 46 74 73 35 53   pRet */.  Fts5S
7330: 74 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d  tructure *pRet =
7340: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74   0;        /* St
7350: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 74  ructure object t
7360: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f  o return */..  /
7370: 2a 20 47 72 61 62 20 74 68 65 20 63 6f 6f 6b 69  * Grab the cooki
7380: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28  e value */.  if(
7390: 20 70 69 43 6f 6f 6b 69 65 20 29 20 2a 70 69 43   piCookie ) *piC
73a0: 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 46  ookie = sqlite3F
73b0: 74 73 35 47 65 74 33 32 28 70 44 61 74 61 29 3b  ts5Get32(pData);
73c0: 0a 20 20 69 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20  .  i = 4;..  /* 
73d0: 52 65 61 64 20 74 68 65 20 74 6f 74 61 6c 20 6e  Read the total n
73e0: 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20  umber of levels 
73f0: 61 6e 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  and segments fro
7400: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
7410: 68 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  he.  ** structur
7420: 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20  e record.  */.  
7430: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7440: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7450: 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20  nLevel);.  i += 
7460: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7470: 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53 65 67 6d  &pData[i], nSegm
7480: 65 6e 74 29 3b 0a 20 20 69 66 28 20 6e 4c 65 76  ent);.  if( nLev
7490: 65 6c 3e 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  el>FTS5_MAX_SEGM
74a0: 45 4e 54 20 20 20 7c 7c 20 6e 4c 65 76 65 6c 3c  ENT   || nLevel<
74b0: 30 0a 20 20 20 7c 7c 20 6e 53 65 67 6d 65 6e 74  0.   || nSegment
74c0: 3e 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e  >FTS5_MAX_SEGMEN
74d0: 54 20 7c 7c 20 6e 53 65 67 6d 65 6e 74 3c 30 0a  T || nSegment<0.
74e0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
74f0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
7500: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  }.  nByte = (.  
7510: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7520: 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20  tructure) +     
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7540: 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65  * Main structure
7550: 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
7560: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
7570: 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2d 31  vel) * (nLevel-1
7580: 29 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d  )    /* aLevel[]
7590: 20 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20   array */.  );. 
75a0: 20 70 52 65 74 20 3d 20 28 46 74 73 35 53 74 72   pRet = (Fts5Str
75b0: 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46  ucture*)sqlite3F
75c0: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
75d0: 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66  c, nByte);..  if
75e0: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52  ( pRet ){.    pR
75f0: 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  et->nRef = 1;.  
7600: 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d    pRet->nLevel =
7610: 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52 65   nLevel;.    pRe
7620: 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53  t->nSegment = nS
7630: 65 67 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d  egment;.    i +=
7640: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
7650: 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c  arint(&pData[i],
7660: 20 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f   &pRet->nWriteCo
7670: 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72  unter);..    for
7680: 28 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c  (iLvl=0; rc==SQL
7690: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e  ITE_OK && iLvl<n
76a0: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
76b0: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
76c0: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
76d0: 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69   &pRet->aLevel[i
76e0: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Lvl];.      int 
76f0: 6e 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  nTotal = 0;.    
7700: 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20    int iSeg;..   
7710: 20 20 20 69 66 28 20 69 3e 3d 6e 44 61 74 61 20     if( i>=nData 
7720: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
7730: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
7740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7750: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
7760: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7770: 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29  ], pLvl->nMerge)
7780: 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66  ;.        i += f
7790: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
77a0: 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c  pData[i], nTotal
77b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
77c0: 54 6f 74 61 6c 3c 70 4c 76 6c 2d 3e 6e 4d 65 72  Total<pLvl->nMer
77d0: 67 65 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  ge ) rc = FTS5_C
77e0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
77f0: 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74  pLvl->aSeg = (Ft
7800: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7810: 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  nt*)sqlite3Fts5M
7820: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a  allocZero(&rc, .
7830: 20 20 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74              nTot
7840: 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  al * sizeof(Fts5
7850: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7860: 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
7870: 20 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2d 3d       nSegment -=
7880: 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 7d   nTotal;.      }
7890: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
78a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
78b0: 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20       pLvl->nSeg 
78c0: 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20  = nTotal;.      
78d0: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
78e0: 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b  eg<nTotal; iSeg+
78f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74  +){.          Ft
7900: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7910: 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
7920: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
7930: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e          if( i>=n
7940: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
7950: 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f      rc = FTS5_CO
7960: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
7970: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7980: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7990: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
79a0: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
79b0: 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
79c0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
79d0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
79e0: 44 61 74 61 5b 69 5d 2c 20 70 53 65 67 2d 3e 70  Data[i], pSeg->p
79f0: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
7a00: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
7a10: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
7a20: 5b 69 5d 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  [i], pSeg->pgnoL
7a30: 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ast);.          
7a40: 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  if( pSeg->pgnoLa
7a50: 73 74 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  st<pSeg->pgnoFir
7a60: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
7a70: 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52    rc = FTS5_CORR
7a80: 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UPT;.           
7a90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7aa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
7ab0: 20 20 20 20 20 20 69 66 28 20 69 4c 76 6c 3e 30        if( iLvl>0
7ac0: 20 26 26 20 70 4c 76 6c 5b 2d 31 5d 2e 6e 4d 65   && pLvl[-1].nMe
7ad0: 72 67 65 20 26 26 20 6e 54 6f 74 61 6c 3d 3d 30  rge && nTotal==0
7ae0: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
7af0: 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 69 66  RUPT;.        if
7b00: 28 20 69 4c 76 6c 3d 3d 6e 4c 65 76 65 6c 2d 31  ( iLvl==nLevel-1
7b10: 20 26 26 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65   && pLvl->nMerge
7b20: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
7b30: 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
7b40: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 67    }.    if( nSeg
7b50: 6d 65 6e 74 21 3d 30 20 26 26 20 72 63 3d 3d 53  ment!=0 && rc==S
7b60: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
7b70: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
7b80: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7b90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 74  E_OK ){.      ft
7ba0: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
7bb0: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  se(pRet);.      
7bc0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pRet = 0;.    }.
7bd0: 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20    }..  *ppOut = 
7be0: 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  pRet;.  return r
7bf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  c;.}../*.**.*/.s
7c00: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
7c10: 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
7c20: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53  (int *pRc, Fts5S
7c30: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
7c40: 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  uct){.  if( *pRc
7c50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7c60: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
7c70: 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
7c80: 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e  truct;.    int n
7c90: 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
7ca0: 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 73 71 6c  >nLevel;.    sql
7cb0: 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
7cc0: 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69 7a   = (.        siz
7cd0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
7ce0: 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  e) +            
7cf0: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
7d00: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
7d10: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
7d20: 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20  ructureLevel) * 
7d30: 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61  (nLevel+1)  /* a
7d40: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
7d50: 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53 74  .    );..    pSt
7d60: 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 72  ruct = sqlite3_r
7d70: 65 61 6c 6c 6f 63 36 34 28 70 53 74 72 75 63 74  ealloc64(pStruct
7d80: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
7d90: 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
7da0: 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75     memset(&pStru
7db0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65  ct->aLevel[nLeve
7dc0: 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  l], 0, sizeof(Ft
7dd0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7de0: 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  ));.      pStruc
7df0: 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20  t->nLevel++;.   
7e00: 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70     *ppStruct = p
7e10: 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73  Struct;.    }els
7e20: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
7e30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7e40: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7e50: 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c   Extend level iL
7e60: 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  vl so that there
7e70: 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20   is room for at 
7e80: 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72  least nExtra mor
7e90: 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  e.** segments..*
7ea0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7eb0: 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
7ec0: 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70  dLevel(.  int *p
7ed0: 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63  Rc, .  Fts5Struc
7ee0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a  ture *pStruct, .
7ef0: 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69    int iLvl, .  i
7f00: 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e  nt nExtra, .  in
7f10: 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69  t bInsert.){.  i
7f20: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
7f30: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  OK ){.    Fts5St
7f40: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
7f50: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
7f60: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
7f70: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
7f80: 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20  gment *aNew;.   
7f90: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
7fa0: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65  Byte;..    nByte
7fb0: 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b   = (pLvl->nSeg +
7fc0: 20 6e 45 78 74 72 61 29 20 2a 20 73 69 7a 65 6f   nExtra) * sizeo
7fd0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
7fe0: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65  egment);.    aNe
7ff0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
8000: 6c 6f 63 36 34 28 70 4c 76 6c 2d 3e 61 53 65 67  loc64(pLvl->aSeg
8010: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
8020: 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( aNew ){.      
8030: 69 66 28 20 62 49 6e 73 65 72 74 3d 3d 30 20 29  if( bInsert==0 )
8040: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
8050: 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65  (&aNew[pLvl->nSe
8060: 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  g], 0, sizeof(Ft
8070: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8080: 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20  nt) * nExtra);. 
8090: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
80a0: 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20      int nMove = 
80b0: 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a  pLvl->nSeg * siz
80c0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
80d0: 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20  eSegment);.     
80e0: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77     memmove(&aNew
80f0: 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20  [nExtra], aNew, 
8100: 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  nMove);.        
8110: 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20  memset(aNew, 0, 
8120: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
8130: 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e  tureSegment) * n
8140: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a  Extra);.      }.
8150: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67        pLvl->aSeg
8160: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c   = aNew;.    }el
8170: 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d  se{.      *pRc =
8180: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8190: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
81a0: 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ic Fts5Structure
81b0: 20 2a 66 74 73 35 53 74 72 75 63 74 75 72 65 52   *fts5StructureR
81c0: 65 61 64 55 6e 63 61 63 68 65 64 28 46 74 73 35  eadUncached(Fts5
81d0: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
81e0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74  5Structure *pRet
81f0: 20 3d 20 30 3b 0a 20 20 46 74 73 35 43 6f 6e 66   = 0;.  Fts5Conf
8200: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
8210: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20  >pConfig;.  int 
8220: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
8230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8240: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
8250: 6b 69 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  kie */.  Fts5Dat
8260: 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44 61  a *pData;..  pDa
8270: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
8280: 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54  d(p, FTS5_STRUCT
8290: 55 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66  URE_ROWID);.  if
82a0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
82b0: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44  OK ){.    /* TOD
82c0: 4f 3a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 68  O: Do we need th
82d0: 69 73 20 69 66 20 74 68 65 20 6c 65 61 66 2d 69  is if the leaf-i
82e0: 6e 64 65 78 20 69 73 20 61 70 70 65 6e 64 65 64  ndex is appended
82f0: 3f 20 50 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f  ? Probably... */
8300: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 44 61  .    memset(&pDa
8310: 74 61 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e 5d  ta->p[pData->nn]
8320: 2c 20 30 2c 20 46 54 53 35 5f 44 41 54 41 5f 50  , 0, FTS5_DATA_P
8330: 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 70 2d 3e  ADDING);.    p->
8340: 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
8350: 72 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e  reDecode(pData->
8360: 70 2c 20 70 44 61 74 61 2d 3e 6e 6e 2c 20 26 69  p, pData->nn, &i
8370: 43 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a  Cookie, &pRet);.
8380: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
8390: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e  QLITE_OK && pCon
83a0: 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43  fig->iCookie!=iC
83b0: 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 20 20 70  ookie ){.      p
83c0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
83d0: 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43 6f  s5ConfigLoad(pCo
83e0: 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a  nfig, iCookie);.
83f0: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61      }.    fts5Da
8400: 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
8410: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21  ;.    if( p->rc!
8420: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8430: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
8440: 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a  eRelease(pRet);.
8450: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
8460: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8470: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn pRet;.}..sta
8480: 74 69 63 20 69 36 34 20 66 74 73 35 49 6e 64 65  tic i64 fts5Inde
8490: 78 44 61 74 61 56 65 72 73 69 6f 6e 28 46 74 73  xDataVersion(Fts
84a0: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 36  5Index *p){.  i6
84b0: 34 20 69 56 65 72 73 69 6f 6e 20 3d 20 30 3b 0a  4 iVersion = 0;.
84c0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
84d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
84e0: 66 28 20 70 2d 3e 70 44 61 74 61 56 65 72 73 69  f( p->pDataVersi
84f0: 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  on==0 ){.      p
8500: 2d 3e 72 63 20 3d 20 66 74 73 35 49 6e 64 65 78  ->rc = fts5Index
8510: 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
8520: 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 2c  p->pDataVersion,
8530: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
8540: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
8550: 47 4d 41 20 25 51 2e 64 61 74 61 5f 76 65 72 73  GMA %Q.data_vers
8560: 69 6f 6e 22 2c 20 70 2d 3e 70 43 6f 6e 66 69 67  ion", p->pConfig
8570: 2d 3e 7a 44 62 29 0a 20 20 20 20 20 20 20 20 20  ->zDb).         
8580: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
8590: 3e 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >rc ) return 0;.
85a0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 53      }..    if( S
85b0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
85c0: 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 61 74 61  e3_step(p->pData
85d0: 56 65 72 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20  Version) ){.    
85e0: 20 20 69 56 65 72 73 69 6f 6e 20 3d 20 73 71 6c    iVersion = sql
85f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
8600: 34 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  4(p->pDataVersio
8610: 6e 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  n, 0);.    }.   
8620: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
8630: 5f 72 65 73 65 74 28 70 2d 3e 70 44 61 74 61 56  _reset(p->pDataV
8640: 65 72 73 69 6f 6e 29 3b 0a 20 20 7d 0a 0a 20 20  ersion);.  }..  
8650: 72 65 74 75 72 6e 20 69 56 65 72 73 69 6f 6e 3b  return iVersion;
8660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20  .}../*.** Read, 
8670: 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  deserialize and 
8680: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
8690: 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
86a0: 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63  ** The Fts5Struc
86b0: 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e  ture.aLevel[] an
86c0: 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63  d each Fts5Struc
86d0: 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d  tureLevel.aSeg[]
86e0: 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76   array.** are ov
86f0: 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20  er-allocated as 
8700: 64 65 73 63 72 69 62 65 64 20 66 6f 72 20 66 75  described for fu
8710: 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63  nction fts5Struc
8720: 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a  tureDecode() .**
8730: 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   above..**.** If
8740: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
8750: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
8760: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
8770: 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65  code left in the
8780: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61  .** Fts5Index ha
8790: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
87a0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
87b0: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
87c0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
87d0: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
87e0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
87f0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8800: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
8810: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  d(Fts5Index *p){
8820: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 72 75  ..  if( p->pStru
8830: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ct==0 ){.    p->
8840: 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 20 3d  iStructVersion =
8850: 20 66 74 73 35 49 6e 64 65 78 44 61 74 61 56 65   fts5IndexDataVe
8860: 72 73 69 6f 6e 28 70 29 3b 0a 20 20 20 20 69 66  rsion(p);.    if
8870: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8880: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  OK ){.      p->p
8890: 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
88a0: 75 63 74 75 72 65 52 65 61 64 55 6e 63 61 63 68  uctureReadUncach
88b0: 65 64 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ed(p);.    }.  }
88c0: 0a 0a 23 69 66 20 30 0a 20 20 65 6c 73 65 7b 0a  ..#if 0.  else{.
88d0: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
88e0: 65 20 2a 70 54 65 73 74 20 3d 20 66 74 73 35 53  e *pTest = fts5S
88f0: 74 72 75 63 74 75 72 65 52 65 61 64 55 6e 63 61  tructureReadUnca
8900: 63 68 65 64 28 70 29 3b 0a 20 20 20 20 69 66 28  ched(p);.    if(
8910: 20 70 54 65 73 74 20 29 7b 0a 20 20 20 20 20 20   pTest ){.      
8920: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
8930: 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53  assert_nc( p->pS
8940: 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d  truct->nSegment=
8950: 3d 70 54 65 73 74 2d 3e 6e 53 65 67 6d 65 6e 74  =pTest->nSegment
8960: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
8970: 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d  _nc( p->pStruct-
8980: 3e 6e 4c 65 76 65 6c 3d 3d 70 54 65 73 74 2d 3e  >nLevel==pTest->
8990: 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLevel );.      
89a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 65 73 74  for(i=0; i<pTest
89b0: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
89c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
89d0: 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61  c( p->pStruct->a
89e0: 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d  Level[i].nMerge=
89f0: 3d 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69  =pTest->aLevel[i
8a00: 5d 2e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20  ].nMerge );.    
8a10: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
8a20: 2d 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ->pStruct->aLeve
8a30: 6c 5b 69 5d 2e 6e 53 65 67 3d 3d 70 54 65 73 74  l[i].nSeg==pTest
8a40: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67  ->aLevel[i].nSeg
8a50: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
8a60: 6a 3d 30 3b 20 6a 3c 70 54 65 73 74 2d 3e 61 4c  j=0; j<pTest->aL
8a70: 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 20 6a 2b  evel[i].nSeg; j+
8a80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74  +){.          Ft
8a90: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8aa0: 6e 74 20 2a 70 31 20 3d 20 26 70 54 65 73 74 2d  nt *p1 = &pTest-
8ab0: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b  >aLevel[i].aSeg[
8ac0: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74  j];.          Ft
8ad0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8ae0: 6e 74 20 2a 70 32 20 3d 20 26 70 2d 3e 70 53 74  nt *p2 = &p->pSt
8af0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
8b00: 61 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  aSeg[j];.       
8b10: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31     assert_nc( p1
8b20: 2d 3e 69 53 65 67 69 64 3d 3d 70 32 2d 3e 69 53  ->iSegid==p2->iS
8b30: 65 67 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  egid );.        
8b40: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d    assert_nc( p1-
8b50: 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 70 32 2d 3e  >pgnoFirst==p2->
8b60: 70 67 6e 6f 46 69 72 73 74 20 29 3b 0a 20 20 20  pgnoFirst );.   
8b70: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
8b80: 28 20 70 31 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d  ( p1->pgnoLast==
8b90: 70 32 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a  p2->pgnoLast );.
8ba0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8bb0: 7d 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  }.      fts5Stru
8bc0: 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 54 65  ctureRelease(pTe
8bd0: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  st);.    }.  }.#
8be0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e  endif..  if( p->
8bf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8c00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
8c10: 72 74 28 20 70 2d 3e 69 53 74 72 75 63 74 56 65  rt( p->iStructVe
8c20: 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 61 73  rsion!=0 );.  as
8c30: 73 65 72 74 28 20 70 2d 3e 70 53 74 72 75 63 74  sert( p->pStruct
8c40: 21 3d 30 20 29 3b 0a 20 20 66 74 73 35 53 74 72  !=0 );.  fts5Str
8c50: 75 63 74 75 72 65 52 65 66 28 70 2d 3e 70 53 74  uctureRef(p->pSt
8c60: 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ruct);.  return 
8c70: 70 2d 3e 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73  p->pStruct;.}..s
8c80: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
8c90: 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
8ca0: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  te(Fts5Index *p)
8cb0: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 72 75  {.  if( p->pStru
8cc0: 63 74 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74  ct ){.    fts5St
8cd0: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
8ce0: 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  ->pStruct);.    
8cf0: 70 2d 3e 70 53 74 72 75 63 74 20 3d 20 30 3b 0a  p->pStruct = 0;.
8d00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
8d10: 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
8d20: 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
8d30: 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74   in index struct
8d40: 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 69  ure pStruct. Thi
8d50: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
8d60: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
8d70: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
8d80: 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  t() conditions..
8d90: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8da0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
8db0: 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43  t fts5StructureC
8dc0: 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73  ountSegments(Fts
8dd0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8de0: 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  uct){.  int nSeg
8df0: 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ment = 0;       
8e00: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8e10: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
8e20: 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  nts */.  if( pSt
8e30: 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
8e40: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
8e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8e60: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8e70: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
8e80: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
8e90: 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
8ea0: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
8eb0: 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20      nSegment += 
8ec0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8ed0: 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20  iLvl].nSeg;.    
8ee0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8ef0: 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64  nSegment;.}.#end
8f00: 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  if..#define fts5
8f10: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
8f20: 42 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62  Blob(pBuf, pBlob
8f30: 2c 20 6e 42 6c 6f 62 29 20 7b 20 20 20 20 20 5c  , nBlob) {     \
8f40: 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66  .  assert( (pBuf
8f50: 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 28 70 42 75  )->nSpace>=((pBu
8f60: 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20  f)->n+nBlob) ); 
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
8f80: 6d 65 6d 63 70 79 28 26 28 70 42 75 66 29 2d 3e  memcpy(&(pBuf)->
8f90: 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 70 42  p[(pBuf)->n], pB
8fa0: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20  lob, nBlob);    
8fb0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42           \.  (pB
8fc0: 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b  uf)->n += nBlob;
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69        \.}..#defi
9000: 6e 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66  ne fts5BufferSaf
9010: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42  eAppendVarint(pB
9020: 75 66 2c 20 69 56 61 6c 29 20 7b 20 20 20 20 20  uf, iVal) {     
9030: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28             \.  (
9040: 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 73 71 6c 69  pBuf)->n += sqli
9050: 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
9060: 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75  (&(pBuf)->p[(pBu
9070: 66 29 2d 3e 6e 5d 2c 20 28 69 56 61 6c 29 29 3b  f)->n], (iVal));
9080: 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70    \.  assert( (p
9090: 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 70  Buf)->nSpace>=(p
90a0: 42 75 66 29 2d 3e 6e 20 29 3b 20 20 20 20 20 20  Buf)->n );      
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20      \.}.../*.** 
90d0: 53 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 73 74  Serialize and st
90e0: 6f 72 65 20 74 68 65 20 22 73 74 72 75 63 74 75  ore the "structu
90f0: 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  re" record..**.*
9100: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
9110: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
9120: 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65  rror code in the
9130: 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63   Fts5Index objec
9140: 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f  t. If an.** erro
9150: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
9160: 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
9170: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
9180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9190: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
91a0: 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ite(Fts5Index *p
91b0: 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
91c0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  *pStruct){.  if(
91d0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
91e0: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66  K ){.    Fts5Buf
91f0: 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20  fer buf;        
9200: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
9210: 20 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65   to serialize re
9220: 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20  cord into */.   
9230: 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9250: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
9260: 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
9270: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f   */.    int iCoo
9280: 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  kie;            
9290: 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20        /* Cookie 
92a0: 76 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 2a  value to store *
92b0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
92c0: 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
92d0: 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43  ==fts5StructureC
92e0: 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74  ountSegments(pSt
92f0: 72 75 63 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d  ruct) );.    mem
9300: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
9310: 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
9320: 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  ;..    /* Append
9330: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
9340: 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69  figuration cooki
9350: 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65  e */.    iCookie
9360: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69   = p->pConfig->i
9370: 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20  Cookie;.    if( 
9380: 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f  iCookie<0 ) iCoo
9390: 6b 69 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  kie = 0;..    if
93a0: 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  ( 0==sqlite3Fts5
93b0: 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
93c0: 63 2c 20 26 62 75 66 2c 20 34 2b 39 2b 39 2b 39  c, &buf, 4+9+9+9
93d0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
93e0: 65 33 46 74 73 35 50 75 74 33 32 28 62 75 66 2e  e3Fts5Put32(buf.
93f0: 70 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20  p, iCookie);.   
9400: 20 20 20 62 75 66 2e 6e 20 3d 20 34 3b 0a 20 20     buf.n = 4;.  
9410: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
9420: 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  feAppendVarint(&
9430: 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  buf, pStruct->nL
9440: 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 66 74 73  evel);.      fts
9450: 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
9460: 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53  dVarint(&buf, pS
9470: 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29  truct->nSegment)
9480: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
9490: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
94a0: 6e 74 28 26 62 75 66 2c 20 28 69 36 34 29 70 53  nt(&buf, (i64)pS
94b0: 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75  truct->nWriteCou
94c0: 6e 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  nter);.    }..  
94d0: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
94e0: 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
94f0: 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
9500: 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20     int iSeg;    
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
9530: 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d  ate through segm
9540: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74  ents */.      Ft
9550: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9560: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
9570: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
9580: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
9590: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
95a0: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
95b0: 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20  ->nMerge);.     
95c0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
95d0: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
95e0: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67  &buf, pLvl->nSeg
95f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9600: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70   pLvl->nMerge<=p
9610: 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20  Lvl->nSeg );..  
9620: 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
9630: 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
9640: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
9650: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
9660: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
9670: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
9680: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
9690: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
96a0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
96b0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
96c0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
96d0: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
96e0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
96f0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
9700: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
9710: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73  eg[iSeg].pgnoLas
9720: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
9730: 7d 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61 57  }..    fts5DataW
9740: 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52  rite(p, FTS5_STR
9750: 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75  UCTURE_ROWID, bu
9760: 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
9770: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
9780: 26 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  &buf);.  }.}..#i
9790: 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20  f 0.static void 
97a0: 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
97b0: 72 65 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66  re(int*,Fts5Buff
97c0: 65 72 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72  er*,Fts5Structur
97d0: 65 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  e*);.static void
97e0: 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74   fts5PrintStruct
97f0: 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ure(const char *
9800: 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74  zCaption, Fts5St
9810: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
9820: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
9830: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42  LITE_OK;.  Fts5B
9840: 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
9850: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
9860: 65 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73  eof(buf));.  fts
9870: 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
9880: 26 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75  &rc, &buf, pStru
9890: 63 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  ct);.  fprintf(s
98a0: 74 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e  tdout, "%s: %s\n
98b0: 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66  ", zCaption, buf
98c0: 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74  .p);.  fflush(st
98d0: 64 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66  dout);.  fts5Buf
98e0: 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
98f0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
9900: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
9910: 72 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a  re(x,y).#endif..
9920: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
9930: 65 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53  egmentSize(Fts5S
9940: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
9950: 2a 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e  *pSeg){.  return
9960: 20 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   1 + pSeg->pgnoL
9970: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
9980: 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  First;.}../*.** 
9990: 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  Return a copy of
99a0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
99b0: 20 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74   pStruct. Except
99c0: 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e  , promote as man
99d0: 79 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61  y .** segments a
99e0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65  s possible to le
99f0: 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66  vel iPromote. If
9a00: 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20   an OOM occurs, 
9a10: 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75  NULL is .** retu
9a20: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
9a30: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
9a40: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46  rePromoteTo(.  F
9a50: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
9a60: 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69  nt iPromote,.  i
9a70: 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20  nt szPromote,.  
9a80: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
9a90: 53 74 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Struct.){.  int 
9aa0: 69 6c 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74  il, is;.  Fts5St
9ab0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f  ructureLevel *pO
9ac0: 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
9ad0: 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b  Level[iPromote];
9ae0: 0a 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d  ..  if( pOut->nM
9af0: 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  erge==0 ){.    f
9b00: 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31  or(il=iPromote+1
9b10: 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  ; il<pStruct->nL
9b20: 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20  evel; il++){.   
9b30: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
9b40: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
9b50: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9b60: 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  l];.      if( pL
9b70: 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74  vl->nMerge ) ret
9b80: 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  urn;.      for(i
9b90: 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20  s=pLvl->nSeg-1; 
9ba0: 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20  is>=0; is--){.  
9bb0: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66        int sz = f
9bc0: 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26  ts5SegmentSize(&
9bd0: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b  pLvl->aSeg[is]);
9be0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
9bf0: 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75  szPromote ) retu
9c00: 72 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  rn;.        fts5
9c10: 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
9c20: 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
9c30: 72 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20  ruct, iPromote, 
9c40: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  1, 1);.        i
9c50: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
9c60: 6e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  n;.        memcp
9c70: 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70  y(pOut->aSeg, &p
9c80: 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73  Lvl->aSeg[is], s
9c90: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
9ca0: 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20  ureSegment));.  
9cb0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67        pOut->nSeg
9cc0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c  ++;.        pLvl
9cd0: 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20  ->nSeg--;.      
9ce0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
9cf0: 2a 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65  *.** A new segme
9d00: 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  nt has just been
9d10: 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65   written to leve
9d20: 6c 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20  l iLvl of index 
9d30: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74  structure.** pSt
9d40: 72 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ruct. This funct
9d50: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69  ion determines i
9d60: 66 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73  f any segments s
9d70: 68 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65  hould be promote
9d80: 64 0a 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74  d.** as a result
9d90: 2e 20 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70  . Segments are p
9da0: 72 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73  romoted in two s
9db0: 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
9dc0: 20 20 61 29 20 49 66 20 74 68 65 20 73 65 67 6d    a) If the segm
9dd0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9de0: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
9df0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
9e00: 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69  ments.**      wi
9e10: 74 68 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  thin the previou
9e20: 73 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65  s populated leve
9e30: 6c 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65  l, it is promote
9e40: 64 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  d to the previou
9e50: 73 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61  s.**      popula
9e60: 74 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ted level..**.**
9e70: 20 20 20 62 29 20 49 66 20 74 68 65 20 73 65 67     b) If the seg
9e80: 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  ment just writte
9e90: 6e 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  n is larger than
9ea0: 20 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d   the newest segm
9eb0: 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74  ent on.**      t
9ec0: 68 65 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65  he next populate
9ed0: 64 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68  d level, then th
9ee0: 61 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20  at segment, and 
9ef0: 61 6e 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65  any other adjace
9f00: 6e 74 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65  nt.**      segme
9f10: 6e 74 73 20 74 68 61 74 20 61 72 65 20 61 6c 73  nts that are als
9f20: 6f 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  o smaller than t
9f30: 68 65 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74  he one just writ
9f40: 74 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20  ten, are .**    
9f50: 20 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a    promoted. .**.
9f60: 2a 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** If one or mor
9f70: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70  e segments are p
9f80: 72 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72  romoted, the str
9f90: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73  ucture object is
9fa0: 20 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72   updated.** to r
9fb0: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a  eflect this..*/.
9fc0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9fd0: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9fe0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
9ff0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a000: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
a010: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
a020: 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20  int iLvl,       
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a040: 2f 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a  /* Index level j
a050: 75 73 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20  ust updated */. 
a060: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
a070: 70 53 74 72 75 63 74 20 20 20 20 20 20 20 20 20  pStruct         
a080: 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
a090: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ure */.){.  if( 
a0a0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
a0b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74   ){.    int iTst
a0c0: 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f  ;.    int iPromo
a0d0: 74 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  te = -1;.    int
a0e0: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20   szPromote = 0; 
a0f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
a100: 6f 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74  omote anything t
a110: 68 69 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c  his size or smal
a120: 6c 65 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53  ler */.    Fts5S
a130: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
a140: 2a 70 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d  *pSeg;   /* Segm
a150: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
a160: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65   */.    int szSe
a170: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
a180: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
a190: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
a1a0: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
a1b0: 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d   nSeg = pStruct-
a1c0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
a1d0: 65 67 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 65  eg;..    if( nSe
a1e0: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  g==0 ) return;. 
a1f0: 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75     pSeg = &pStru
a200: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
a210: 2e 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61  .aSeg[pStruct->a
a220: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
a230: 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d  -1];.    szSeg =
a240: 20 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f   (1 + pSeg->pgno
a250: 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e  Last - pSeg->pgn
a260: 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a  oFirst);..    /*
a270: 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69   Check for condi
a280: 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20  tion (a) */.    
a290: 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b  for(iTst=iLvl-1;
a2a0: 20 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72   iTst>=0 && pStr
a2b0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74  uct->aLevel[iTst
a2c0: 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d  ].nSeg==0; iTst-
a2d0: 2d 29 3b 0a 20 20 20 20 69 66 28 20 69 54 73 74  -);.    if( iTst
a2e0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
a2f0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   i;.      int sz
a300: 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 46  Max = 0;.      F
a310: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
a320: 6c 20 2a 70 54 73 74 20 3d 20 26 70 53 74 72 75  l *pTst = &pStru
a330: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d  ct->aLevel[iTst]
a340: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a350: 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20  pTst->nMerge==0 
a360: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
a370: 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20  ; i<pTst->nSeg; 
a380: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
a390: 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65  t sz = pTst->aSe
a3a0: 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20  g[i].pgnoLast - 
a3b0: 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67  pTst->aSeg[i].pg
a3c0: 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20  noFirst + 1;.   
a3d0: 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61       if( sz>szMa
a3e0: 78 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a  x ) szMax = sz;.
a3f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a400: 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29  ( szMax>=szSeg )
a410: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  {.        /* Con
a420: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 74 72  dition (a) is tr
a430: 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65 20  ue. Promote the 
a440: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
a450: 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20 20 20 20  n level .       
a460: 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65   ** iLvl to leve
a470: 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20  l iTst.  */.    
a480: 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69      iPromote = i
a490: 54 73 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 50  Tst;.        szP
a4a0: 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a  romote = szMax;.
a4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a4c0: 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69     /* If conditi
a4d0: 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74 20 6d 65  on (a) is not me
a4e0: 74 2c 20 61 73 73 75 6d 65 20 28 62 29 20 69 73  t, assume (b) is
a4f0: 20 74 72 75 65 2e 20 53 74 72 75 63 74 75 72 65   true. Structure
a500: 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20  PromoteTo().    
a510: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ** is a no-op if
a520: 20 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a   it is not.  */.
a530: 20 20 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65      if( iPromote
a540: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 50 72 6f  <0 ){.      iPro
a550: 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  mote = iLvl;.   
a560: 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73     szPromote = s
a570: 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zSeg;.    }.    
a580: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
a590: 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f  moteTo(p, iPromo
a5a0: 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70  te, szPromote, p
a5b0: 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Struct);.  }.}..
a5c0: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
a5d0: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
a5e0: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
a5f0: 72 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  rgument. If the 
a600: 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64  end of the .** d
a610: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67  oclist-index pag
a620: 65 20 69 73 20 72 65 61 63 68 65 64 2c 20 72 65  e is reached, re
a630: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
a640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
a650: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74  5DlidxLvlNext(Ft
a660: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
a670: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
a680: 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61  Data = pLvl->pDa
a690: 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d  ta;..  if( pLvl-
a6a0: 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >iOff==0 ){.    
a6b0: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45  assert( pLvl->bE
a6c0: 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  of==0 );.    pLv
a6d0: 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20  l->iOff = 1;.   
a6e0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66   pLvl->iOff += f
a6f0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
a700: 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76  pData->p[1], pLv
a710: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  l->iLeafPgno);. 
a720: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d     pLvl->iOff +=
a730: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
a740: 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69  pData->p[pLvl->i
a750: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76  Off], (u64*)&pLv
a760: 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  l->iRowid);.    
a770: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
a780: 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20  = pLvl->iOff;.  
a790: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
a7a0: 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66  Off;.    for(iOf
a7b0: 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f  f=pLvl->iOff; iO
a7c0: 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f  ff<pData->nn; iO
a7d0: 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ff++){.      if(
a7e0: 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20   pData->p[iOff] 
a7f0: 29 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a  ) break; .    }.
a800: 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44  .    if( iOff<pD
a810: 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20  ata->nn ){.     
a820: 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20   i64 iVal;.     
a830: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a840: 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c   += (iOff - pLvl
a850: 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20  ->iOff) + 1;.   
a860: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
a870: 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
a880: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
a890: 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c  &iVal);.      pL
a8a0: 76 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56  vl->iRowid += iV
a8b0: 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  al;.      pLvl->
a8c0: 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20  iOff = iOff;.   
a8d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
a8e0: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
a8f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a900: 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a  n pLvl->bEof;.}.
a910: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
a920: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
a930: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
a940: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a950: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
a960: 49 74 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e  IterNextR(Fts5In
a970: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
a980: 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
a990: 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44  t iLvl){.  Fts5D
a9a0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
a9b0: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76  &pIter->aLvl[iLv
a9c0: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  l];..  assert( i
a9d0: 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  Lvl<pIter->nLvl 
a9e0: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  );.  if( fts5Dli
a9f0: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20  dxLvlNext(pLvl) 
aa00: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c  ){.    if( (iLvl
aa10: 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76  +1) < pIter->nLv
aa20: 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  l ){.      fts5D
aa30: 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c  lidxIterNextR(p,
aa40: 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b   pIter, iLvl+1);
aa50: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b  .      if( pLvl[
aa60: 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  1].bEof==0 ){.  
aa70: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
aa80: 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
aa90: 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  a);.        mems
aaa0: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
aab0: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
aac0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
aad0: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
aae0: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
aaf0: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
ab00: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
ab10: 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  egid, iLvl, pLvl
ab20: 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  [1].iLeafPgno). 
ab30: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
ab40: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
ab50: 61 20 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  a ) fts5DlidxLvl
ab60: 4e 65 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20  Next(pLvl);.    
ab70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
ab80: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
ab90: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73  Lvl[0].bEof;.}.s
aba0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
abb0: 69 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35  idxIterNext(Fts5
abc0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
abd0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
abe0: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c  .  return fts5Dl
abf0: 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20  idxIterNextR(p, 
ac00: 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  pIter, 0);.}../*
ac10: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
ac20: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
ac30: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61  irst argument ha
ac40: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
ac50: 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73  fields set.** as
ac60: 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66   follows. This f
ac70: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20  unction sets up 
ac80: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
ac90: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
aca0: 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f   it.** points to
acb0: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
acc0: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d   in the doclist-
acd0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70  index..**.**   p
ace0: 44 61 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69  Data:.**     poi
acf0: 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d  nter to doclist-
ad00: 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a  index record, .*
ad10: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
ad20: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
ad30: 64 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  d pIter->iLeafPg
ad40: 6e 6f 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  no is the page n
ad50: 75 6d 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63  umber the.** doc
ad60: 6c 69 73 74 20 69 73 20 61 73 73 6f 63 69 61 74  list is associat
ad70: 65 64 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65  ed with (the one
ad80: 20 66 65 61 74 75 72 69 6e 67 20 74 68 65 20 74   featuring the t
ad90: 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erm)..*/.static 
ada0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
adb0: 72 46 69 72 73 74 28 46 74 73 35 44 6c 69 64 78  rFirst(Fts5Dlidx
adc0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
add0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
ade0: 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
adf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44   i++){.    fts5D
ae00: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74  lidxLvlNext(&pIt
ae10: 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20  er->aLvl[i]);.  
ae20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  }.  return pIter
ae30: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
ae40: 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  }...static int f
ae50: 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
ae60: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ae70: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
ae80: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  er){.  return p-
ae90: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
aea0: 7c 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  | pIter->aLvl[0]
aeb0: 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63  .bEof;.}..static
aec0: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
aed0: 74 65 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65  terLast(Fts5Inde
aee0: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
aef0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
af00: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61  nt i;..  /* Adva
af10: 6e 63 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74  nce each level t
af20: 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
af30: 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67   on the last pag
af40: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74  e */.  for(i=pIt
af50: 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72  er->nLvl-1; p->r
af60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
af70: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
af80: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
af90: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
afa0: 6c 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[i];.    while(
afb0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
afc0: 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20  t(pLvl)==0 );.  
afd0: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30    pLvl->bEof = 0
afe0: 3b 0a 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29  ;..    if( i>0 )
aff0: 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  {.      Fts5Dlid
b000: 78 4c 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26  xLvl *pChild = &
b010: 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20  pLvl[-1];.      
b020: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
b030: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a  pChild->pData);.
b040: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68        memset(pCh
b050: 69 6c 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ild, 0, sizeof(F
b060: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
b070: 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61       pChild->pDa
b080: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
b090: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
b0a0: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
b0b0: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
b0c0: 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  i-1, pLvl->iLeaf
b0d0: 50 67 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20  Pgno).      );. 
b0e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
b0f0: 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
b100: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
b110: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
b120: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
b130: 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  entry..*/.static
b140: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76   int fts5DlidxLv
b150: 6c 50 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c  lPrev(Fts5DlidxL
b160: 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74  vl *pLvl){.  int
b170: 20 69 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f   iOff = pLvl->iO
b180: 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ff;..  assert( p
b190: 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a  Lvl->bEof==0 );.
b1a0: 20 20 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c    if( iOff<=pLvl
b1b0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
b1c0: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
b1d0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b1e0: 75 38 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44  u8 *a = pLvl->pD
b1f0: 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20  ata->p;.    i64 
b200: 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c  iVal;.    int iL
b210: 69 6d 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69  imit;.    int ii
b220: 3b 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20  ;.    int nZero 
b230: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72  = 0;..    /* Cur
b240: 72 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e  rently iOff poin
b250: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
b260: 62 79 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74  byte of a varint
b270: 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20  . This block .  
b280: 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20    ** decrements 
b290: 69 4f 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f  iOff until it po
b2a0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
b2b0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 72  t byte of the pr
b2c0: 65 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76  evious .    ** v
b2d0: 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61  arint. Taking ca
b2e0: 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61  re not to read a
b2f0: 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ny memory locati
b300: 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20  ons that occur. 
b310: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65     ** before the
b320: 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72   buffer in memor
b330: 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69  y.  */.    iLimi
b340: 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f  t = (iOff>9 ? iO
b350: 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66  ff-9 : 0);.    f
b360: 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e  or(iOff--; iOff>
b370: 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b  iLimit; iOff--){
b380: 0a 20 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f  .      if( (a[iO
b390: 66 66 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30  ff-1] & 0x80)==0
b3a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
b3b0: 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69  .    fts5GetVari
b3c0: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
b3d0: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70  4*)&iVal);.    p
b3e0: 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  Lvl->iRowid -= i
b3f0: 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  Val;.    pLvl->i
b400: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20  LeafPgno--;..   
b410: 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72   /* Skip backwar
b420: 64 73 20 70 61 73 74 20 61 6e 79 20 30 78 30 30  ds past any 0x00
b430: 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20   varints. */.   
b440: 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20   for(ii=iOff-1; 
b450: 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  ii>=pLvl->iFirst
b460: 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78  Off && a[ii]==0x
b470: 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20  00; ii--){.     
b480: 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a   nZero++;.    }.
b490: 20 20 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c      if( ii>=pLvl
b4a0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 28  ->iFirstOff && (
b4b0: 61 5b 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b  a[ii] & 0x80) ){
b4c0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79  .      /* The by
b4d0: 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  te immediately b
b4e0: 65 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30  efore the last 0
b4f0: 78 30 30 20 62 79 74 65 20 68 61 73 20 74 68 65  x00 byte has the
b500: 20 30 78 38 30 20 62 69 74 0a 20 20 20 20 20 20   0x80 bit.      
b510: 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c  ** set. So the l
b520: 61 73 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79  ast 0x00 is only
b530: 20 61 20 76 61 72 69 6e 74 20 30 20 69 66 20 74   a varint 0 if t
b540: 68 65 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20  here are 8 more 
b550: 30 78 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79  0x80.      ** by
b560: 74 65 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d  tes before a[ii]
b570: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  . */.      int b
b580: 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Zero = 0;       
b590: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
b5a0: 66 20 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e  f last 0x00 coun
b5b0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ts */.      if( 
b5c0: 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46  (ii-8)>=pLvl->iF
b5d0: 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20  irstOff ){.     
b5e0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
b5f0: 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20    for(j=1; j<=8 
b600: 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78  && (a[ii-j] & 0x
b610: 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20  80); j++);.     
b620: 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29     bZero = (j>8)
b630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b640: 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e  if( bZero==0 ) n
b650: 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Zero--;.    }.  
b660: 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e    pLvl->iLeafPgn
b670: 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20  o -= nZero;.    
b680: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  pLvl->iOff = iOf
b690: 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a  f - nZero;.  }..
b6a0: 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62    return pLvl->b
b6b0: 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Eof;.}..static i
b6c0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
b6d0: 50 72 65 76 52 28 46 74 73 35 49 6e 64 65 78 20  PrevR(Fts5Index 
b6e0: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
b6f0: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c  r *pIter, int iL
b700: 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  vl){.  Fts5Dlidx
b710: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  Lvl *pLvl = &pIt
b720: 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a  er->aLvl[iLvl];.
b730: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c  .  assert( iLvl<
b740: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20  pIter->nLvl );. 
b750: 20 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76   if( fts5DlidxLv
b760: 6c 50 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20  lPrev(pLvl) ){. 
b770: 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20     if( (iLvl+1) 
b780: 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b  < pIter->nLvl ){
b790: 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
b7a0: 49 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74  IterPrevR(p, pIt
b7b0: 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20  er, iLvl+1);.   
b7c0: 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62     if( pLvl[1].b
b7d0: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
b7e0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
b7f0: 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
b800: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
b810: 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Lvl, 0, sizeof(F
b820: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
b830: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61         pLvl->pDa
b840: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
b850: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
b860: 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
b870: 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64  ID(pIter->iSegid
b880: 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e  , iLvl, pLvl[1].
b890: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
b8a0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
b8b0: 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b  ( pLvl->pData ){
b8c0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
b8d0: 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ( fts5DlidxLvlNe
b8e0: 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20  xt(pLvl)==0 );. 
b8f0: 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62           pLvl->b
b900: 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Eof = 0;.       
b910: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b920: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
b930: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
b940: 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  of;.}.static int
b950: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
b960: 65 76 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ev(Fts5Index *p,
b970: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
b980: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
b990: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
b9a0: 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29  evR(p, pIter, 0)
b9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
b9c0: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
b9d0: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
b9e0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73  allocated by fts
b9f0: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29  5DlidxIterInit()
ba00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ba10: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
ba20: 65 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  ee(Fts5DlidxIter
ba30: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
ba40: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
ba50: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
ba60: 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
ba70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
ba80: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
ba90: 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61  r->aLvl[i].pData
baa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
bab0: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
bac0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
bad0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66  Fts5DlidxIter *f
bae0: 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
baf0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
bb00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bb10: 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b      /* Fts5 Back
bb20: 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
bb30: 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ithin */.  int b
bb40: 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
bb50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
bb60: 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20  ue for ORDER BY 
bb70: 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ASC */.  int iSe
bb80: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
bb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
bba0: 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
bbb0: 69 4c 65 61 66 50 67 20 20 20 20 20 20 20 20 20  iLeafPg         
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
bbd0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
bbe0: 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f  to load dlidx fo
bbf0: 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c  r */.){.  Fts5Dl
bc00: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  idxIter *pIter =
bc10: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
bc20: 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20  nt bDone = 0;.. 
bc30: 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
bc40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44  =SQLITE_OK && bD
bc50: 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  one==0; i++){.  
bc60: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
bc70: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
bc80: 74 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b 20  ts5DlidxIter) + 
bc90: 69 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 44  i * sizeof(Fts5D
bca0: 6c 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74  lidxLvl);.    Ft
bcb0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e 65  s5DlidxIter *pNe
bcc0: 77 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28  w;..    pNew = (
bcd0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29 73  Fts5DlidxIter*)s
bce0: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34  qlite3_realloc64
bcf0: 28 70 49 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a  (pIter, nByte);.
bd00: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
bd10: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
bd20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
bd30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bd40: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
bd50: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 69 53  5_DLIDX_ROWID(iS
bd60: 65 67 69 64 2c 20 69 2c 20 69 4c 65 61 66 50 67  egid, i, iLeafPg
bd70: 29 3b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69  );.      Fts5Dli
bd80: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
bd90: 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20  New->aLvl[i];.  
bda0: 20 20 20 20 70 49 74 65 72 20 3d 20 70 4e 65 77      pIter = pNew
bdb0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
bdc0: 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Lvl, 0, sizeof(F
bdd0: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
bde0: 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
bdf0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
be00: 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  p, iRowid);.    
be10: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
be20: 61 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74  a && (pLvl->pDat
be30: 61 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30 30 31  a->p[0] & 0x0001
be40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
be50: 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  bDone = 1;.     
be60: 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e   }.      pIter->
be70: 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20  nLvl = i+1;.    
be80: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
be90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bea0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53 65 67  .    pIter->iSeg
beb0: 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
bec0: 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a   if( bRev==0 ){.
bed0: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
bee0: 74 65 72 46 69 72 73 74 28 70 49 74 65 72 29 3b  terFirst(pIter);
bef0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bf00: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c    fts5DlidxIterL
bf10: 61 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ast(p, pIter);. 
bf20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
bf30: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
bf40: 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64   ){.    fts5Dlid
bf50: 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29  xIterFree(pIter)
bf60: 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b  ;.    pIter = 0;
bf70: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
bf80: 49 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Iter;.}..static 
bf90: 69 36 34 20 66 74 73 35 44 6c 69 64 78 49 74 65  i64 fts5DlidxIte
bfa0: 72 52 6f 77 69 64 28 46 74 73 35 44 6c 69 64 78  rRowid(Fts5Dlidx
bfb0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
bfc0: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
bfd0: 76 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a  vl[0].iRowid;.}.
bfe0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
bff0: 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 46 74 73  lidxIterPgno(Fts
c000: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
c010: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74  r){.  return pIt
c020: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61  er->aLvl[0].iLea
c030: 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fPgno;.}../*.** 
c040: 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65  Load the next le
c050: 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  af page into the
c060: 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
c070: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
c080: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
c090: 74 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64  tPage(.  Fts5Ind
c0a0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
c0b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
c0c0: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
c0d0: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
c0e0: 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
c0f0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
c100: 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e   to advance to n
c110: 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  ext page */.){. 
c120: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
c130: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
c140: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
c150: 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20   pIter->pSeg;.  
c160: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
c170: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
c180: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
c190: 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72  o++;.  if( pIter
c1a0: 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20  ->pNextLeaf ){. 
c1b0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
c1c0: 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  = pIter->pNextLe
c1d0: 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  af;.    pIter->p
c1e0: 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20  NextLeaf = 0;.  
c1f0: 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d  }else if( pIter-
c200: 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67  >iLeafPgno<=pSeg
c210: 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
c220: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
c230: 20 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c   fts5LeafRead(p,
c240: 20 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f 53   .        FTS5_S
c250: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
c260: 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72  g->iSegid, pIter
c270: 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ->iLeafPgno).   
c280: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
c290: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
c2a0: 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d  0;.  }.  pLeaf =
c2b0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a   pIter->pLeaf;..
c2c0: 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
c2d0: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
c2e0: 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  Off = pLeaf->szL
c2f0: 65 61 66 3b 0a 20 20 20 20 69 66 28 20 66 74 73  eaf;.    if( fts
c300: 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
c310: 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  pLeaf) ){.      
c320: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
c330: 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e  list = pLeaf->nn
c340: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
c350: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69       pIter->iPgi
c360: 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  dxOff += fts5Get
c370: 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
c380: 3e 70 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78  >p[pIter->iPgidx
c390: 4f 66 66 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  Off],.          
c3a0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
c3b0: 6c 69 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  list.      );.  
c3c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
c3d0: 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e   Argument p poin
c3e0: 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
c3f0: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69  ontaining a vari
c400: 6e 74 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72  nt to be interpr
c410: 65 74 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73  eted as a.** pos
c420: 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20  ition list size 
c430: 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20  field. Read the 
c440: 76 61 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72  varint and retur
c450: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
c460: 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42  bytes.** read. B
c470: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
c480: 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68   set *pnSz to th
c490: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
c4a0: 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f  s in the positio
c4b0: 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a  n.** list, and *
c4c0: 70 62 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66  pbDel to true if
c4d0: 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67   the delete flag
c4e0: 20 69 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73   is set, or fals
c4f0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
c500: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 47  static int fts5G
c510: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f  etPoslistSize(co
c520: 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a  nst u8 *p, int *
c530: 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c  pnSz, int *pbDel
c540: 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20  ){.  int nSz;.  
c550: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73  int n = 0;.  fts
c560: 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
c570: 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61  (p, n, nSz);.  a
c580: 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30  ssert_nc( nSz>=0
c590: 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53   );.  *pnSz = nS
c5a0: 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20  z/2;.  *pbDel = 
c5b0: 6e 53 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20  nSz & 0x0001;.  
c5c0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
c5d0: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
c5e0: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
c5f0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
c600: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c610: 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c   a.** position-l
c620: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
c630: 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
c640: 66 20 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20  f the field and 
c650: 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74  store it.** in t
c660: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
c670: 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  iables:.**.**   
c680: 46 74 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73  Fts5SegIter.nPos
c690: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
c6a0: 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61  r.bDel.**.** Lea
c6b0: 76 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ve Fts5SegIter.i
c6c0: 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74  LeafOffset point
c6d0: 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
c6e0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a   byte of the .**
c6f0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
c700: 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e  ontent (if any).
c710: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c720: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
c730: 50 6f 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Pos(Fts5Index *p
c740: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
c750: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Iter){.  if( p->
c760: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c770: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  .    int iOff = 
c780: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c790: 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  et;  /* Offset t
c7a0: 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20  o read at */.   
c7b0: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
c7c0: 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  K(pIter->pLeaf);
c7d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e  .    if( p->pCon
c7e0: 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
c7f0: 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
c800: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6f 64  {.      int iEod
c810: 20 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e 69 45   = MIN(pIter->iE
c820: 6e 64 6f 66 44 6f 63 6c 69 73 74 2c 20 70 49 74  ndofDoclist, pIt
c830: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
c840: 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  f);.      pIter-
c850: 3e 62 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >bDel = 0;.     
c860: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31   pIter->nPos = 1
c870: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
c880: 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d 3e  <iEod && pIter->
c890: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d  pLeaf->p[iOff]==
c8a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  0 ){.        pIt
c8b0: 65 72 2d 3e 62 44 65 6c 20 3d 20 31 3b 0a 20 20  er->bDel = 1;.  
c8c0: 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20        iOff++;.  
c8d0: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 69        if( iOff<i
c8e0: 45 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70 4c  Eod && pIter->pL
c8f0: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20  eaf->p[iOff]==0 
c900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
c910: 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20  er->nPos = 1;.  
c920: 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a          iOff++;.
c930: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c940: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
c950: 6e 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  nPos = 0;.      
c960: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
c980: 20 6e 53 7a 3b 0a 20 20 20 20 20 20 66 74 73 35   nSz;.      fts5
c990: 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
c9a0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c  pIter->pLeaf->p,
c9b0: 20 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a 20 20 20   iOff, nSz);.   
c9c0: 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d     pIter->bDel =
c9d0: 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b   (nSz & 0x0001);
c9e0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50  .      pIter->nP
c9f0: 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20  os = nSz>>1;.   
ca00: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49     assert_nc( pI
ca10: 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a  ter->nPos>=0 );.
ca20: 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d      }.    pIter-
ca30: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
ca40: 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  Off;.  }.}..stat
ca50: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
ca60: 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 46 74 73  terLoadRowid(Fts
ca70: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
ca80: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
ca90: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
caa0: 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20  >pLeaf->p;      
cab0: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72    /* Buffer to r
cac0: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f  ead data from */
cad0: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49  .  int iOff = pI
cae0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
caf0: 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  ;..  ASSERT_SZLE
cb00: 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65  AF_OK(pIter->pLe
cb10: 61 66 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e  af);.  if( iOff>
cb20: 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73  =pIter->pLeaf->s
cb30: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73  zLeaf ){.    fts
cb40: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
cb50: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
cb60: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
cb70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
cb80: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
cb90: 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  K ) p->rc = FTS5
cba0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
cbb0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
cbc0: 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20    iOff = 4;.    
cbd0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
cbe0: 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20  ->p;.  }.  iOff 
cbf0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
cc00: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
cc10: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
cc20: 69 52 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72  iRowid);.  pIter
cc30: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
cc40: 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  iOff;.}../*.** F
cc50: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
cc60: 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79  Offset currently
cc70: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
cc80: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
cc90: 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66   .** "nSuffix" f
cca0: 69 65 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20  ield of a term. 
ccb0: 46 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  Function paramet
ccc0: 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e  er nKeep contain
ccd0: 73 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  s the value.** o
cce0: 66 20 74 68 65 20 22 6e 50 72 65 66 69 78 22 20  f the "nPrefix" 
ccf0: 66 69 65 6c 64 20 28 69 66 20 74 68 65 72 65 20  field (if there 
cd00: 77 61 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20  was one - it is 
cd10: 70 61 73 73 65 64 20 30 20 69 66 20 74 68 69 73  passed 0 if this
cd20: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
cd30: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67   term in the seg
cd40: 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ment)..**.** Thi
cd50: 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c  s function popul
cd60: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74  ates:.**.**   Ft
cd70: 73 35 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a  s5SegIter.term.*
cd80: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
cd90: 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f  rowid.**.** acco
cda0: 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76  rdingly and leav
cdb0: 65 73 20 28 46 74 73 35 53 65 67 49 74 65 72 2e  es (Fts5SegIter.
cdc0: 69 4c 65 61 66 4f 66 66 73 65 74 29 20 73 65 74  iLeafOffset) set
cdd0: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   to the content 
cde0: 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  of.** the first 
cdf0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54  position list. T
ce00: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
ce10: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f   belonging to do
ce20: 63 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35  cument .** (Fts5
ce30: 53 65 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e  SegIter.iRowid).
ce40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ce50: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
ce60: 65 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70  erm(Fts5Index *p
ce70: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
ce80: 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29  Iter, int nKeep)
ce90: 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65  {.  u8 *a = pIte
cea0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20  r->pLeaf->p;    
ceb0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
cec0: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
ced0: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  */.  int iOff = 
cee0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
cef0: 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  et;  /* Offset t
cf00: 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69  o read at */.  i
cf10: 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf30: 2a 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64  * Bytes of new d
cf40: 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b  ata */..  iOff +
cf50: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
cf60: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77  2(&a[iOff], nNew
cf70: 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 2b 6e 4e  );.  if( iOff+nN
cf80: 65 77 3e 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  ew>pIter->pLeaf-
cf90: 3e 73 7a 4c 65 61 66 20 7c 7c 20 6e 4b 65 65 70  >szLeaf || nKeep
cfa0: 3e 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 29  >pIter->term.n )
cfb0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54  {.    p->rc = FT
cfc0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
cfd0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
cfe0: 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b  ter->term.n = nK
cff0: 65 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65  eep;.  fts5Buffe
d000: 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
d010: 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
d020: 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d  , nNew, &a[iOff]
d030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
d040: 65 72 2d 3e 74 65 72 6d 2e 6e 3c 3d 70 49 74 65  er->term.n<=pIte
d050: 72 2d 3e 74 65 72 6d 2e 6e 53 70 61 63 65 20 29  r->term.nSpace )
d060: 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77  ;.  iOff += nNew
d070: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
d080: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
d090: 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  f;.  pIter->iTer
d0a0: 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  mLeafPgno = pIte
d0b0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  r->iLeafPgno;.  
d0c0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d0d0: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66  et = iOff;..  if
d0e0: 28 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f  ( pIter->iPgidxO
d0f0: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
d100: 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  ->nn ){.    pIte
d110: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
d120: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
d130: 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >nn+1;.  }else{.
d140: 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a      int nExtra;.
d150: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
d160: 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  xOff += fts5GetV
d170: 61 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72  arint32(&a[pIter
d180: 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45  ->iPgidxOff], nE
d190: 78 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72  xtra);.    pIter
d1a0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
d1b0: 2b 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a  += nExtra;.  }..
d1c0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
d1d0: 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29  dRowid(p, pIter)
d1e0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
d1f0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d200: 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73  (Fts5Index*, Fts
d210: 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29  5SegIter*, int*)
d220: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ;.static void ft
d230: 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65  s5SegIterNext_Re
d240: 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 2a  verse(Fts5Index*
d250: 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20  , Fts5SegIter*, 
d260: 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  int*);.static vo
d270: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
d280: 78 74 5f 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65  xt_None(Fts5Inde
d290: 78 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a  x*, Fts5SegIter*
d2a0: 2c 20 69 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63  , int*);..static
d2b0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
d2c0: 72 53 65 74 4e 65 78 74 28 46 74 73 35 49 6e 64  rSetNext(Fts5Ind
d2d0: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
d2e0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
d2f0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
d300: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
d310: 56 45 52 53 45 20 29 7b 0a 20 20 20 20 70 49 74  VERSE ){.    pIt
d320: 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  er->xNext = fts5
d330: 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65  SegIterNext_Reve
d340: 72 73 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  rse;.  }else if(
d350: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
d360: 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
d370: 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49  L_NONE ){.    pI
d380: 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73  ter->xNext = fts
d390: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e  5SegIterNext_Non
d3a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
d3b0: 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66  pIter->xNext = f
d3c0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 3b 0a  ts5SegIterNext;.
d3d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
d3e0: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72  tialize the iter
d3f0: 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65  ator object pIte
d400: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
d410: 6f 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73  ough the entries
d420: 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70   in.** segment p
d430: 53 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f  Seg. The iterato
d440: 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
d450: 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
d460: 65 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74  entry when .** t
d470: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
d480: 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  urns..**.** If a
d490: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
d4a0: 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
d4b0: 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
d4c0: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
d4d0: 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
d4e0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
d4f0: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
d500: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d510: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
d520: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
d530: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e  id fts5SegIterIn
d540: 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
d550: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
d560: 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
d570: 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  ex object */.  F
d580: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
d590: 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f  ent *pSeg,     /
d5a0: 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
d5b0: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
d5c0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d5e0: 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
d5f0: 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ate */.){.  if( 
d600: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d  pSeg->pgnoFirst=
d610: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
d620: 73 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  s happens if the
d630: 20 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e   segment is bein
d640: 67 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70  g used as an inp
d650: 75 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65  ut to an increme
d660: 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67  ntal.    ** merg
d670: 65 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68  e and all data h
d680: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
d690: 22 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66  "trimmed". See f
d6a0: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66  unction.    ** f
d6b0: 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
d6c0: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49  ) for details. I
d6d0: 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76  n this case leav
d6e0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65  e the iterator e
d6f0: 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65  mpty..    ** The
d700: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65   caller will see
d710: 20 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65   the (pIter->pLe
d720: 61 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d  af==0) and assum
d730: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  e the iterator i
d740: 73 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20  s.    ** at EOF 
d750: 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20  already. */.    
d760: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
d770: 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Leaf==0 );.    r
d780: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
d790: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d7a0: 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  OK ){.    memset
d7b0: 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
d7c0: 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20  f(*pIter));.    
d7d0: 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
d7e0: 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  xt(p, pIter);.  
d7f0: 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
d800: 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d  pSeg;.    pIter-
d810: 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65  >iLeafPgno = pSe
d820: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a  g->pgnoFirst-1;.
d830: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
d840: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
d850: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
d860: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
d870: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  {.    pIter->iLe
d880: 61 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20  afOffset = 4;.  
d890: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74    assert_nc( pIt
d8a0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20  er->pLeaf->nn>4 
d8b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63  );.    assert_nc
d8c0: 28 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  ( fts5LeafFirstT
d8d0: 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c  ermOff(pIter->pL
d8e0: 65 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70  eaf)==4 );.    p
d8f0: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20  Iter->iPgidxOff 
d900: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d910: 73 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66 74  szLeaf+1;.    ft
d920: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
d930: 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  m(p, pIter, 0);.
d940: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
d950: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
d960: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
d970: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d980: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
d990: 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63  d on iterators c
d9a0: 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20  reated by calls 
d9b0: 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51  to.** Fts5IndexQ
d9c0: 75 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20  uery() with the 
d9d0: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
d9e0: 44 45 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a  DESC flag set..*
d9f0: 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
da00: 72 20 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75  r is in an unusu
da10: 61 6c 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  al state when th
da20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
da30: 61 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74  alled: the.** Ft
da40: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
da50: 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 20 69  ffset variable i
da60: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
da70: 73 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74  set of the start
da80: 20 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74   of.** the posit
da90: 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
daa0: 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69 72 73  eld for the firs
dab0: 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64  t relevant rowid
dac0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
dad0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77   Fts5SegIter.row
dae0: 69 64 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e  id is set, but n
daf0: 50 6f 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65  Pos and bDel are
db00: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   not..**.** This
db10: 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63   function advanc
db20: 65 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  es the iterator 
db30: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
db40: 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a  s to the last .*
db50: 2a 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64  * relevant rowid
db60: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
db70: 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
db80: 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
db90: 0a 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74  .** aRowidOffset
dba0: 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66  [] and iRowidOff
dbb0: 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41  set variables. A
dbc0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
dbd0: 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   iterator.** is 
dbe0: 69 6e 20 69 74 73 20 72 65 67 75 6c 61 72 20 73  in its regular s
dbf0: 74 61 74 65 20 2d 20 46 74 73 35 53 65 67 49 74  tate - Fts5SegIt
dc00: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
dc10: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
dc20: 73 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68  st.** byte of th
dc30: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
dc40: 63 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74  content associat
dc50: 65 64 20 77 69 74 68 20 73 61 69 64 20 72 6f 77  ed with said row
dc60: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  id..*/.static vo
dc70: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
dc80: 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 46 74  verseInitPage(Ft
dc90: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
dca0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
dcb0: 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d  .  int eDetail =
dcc0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
dcd0: 74 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  tail;.  int n = 
dce0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
dcf0: 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 20 3d 20  Leaf;.  int i = 
dd00: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
dd10: 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  et;.  u8 *a = pI
dd20: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
dd30: 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65   int iRowidOffse
dd40: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e  t = 0;..  if( n>
dd50: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
dd60: 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20  list ){.    n = 
dd70: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
dd80: 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41 53 53  list;.  }..  ASS
dd90: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49  ERT_SZLEAF_OK(pI
dda0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77  ter->pLeaf);.  w
ddb0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
ddc0: 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 0a  64 iDelta = 0;..
ddd0: 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d      if( eDetail=
dde0: 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
ddf0: 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f  E ){.      /* to
de00: 64 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  do */.      if( 
de10: 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29  i<n && a[i]==0 )
de20: 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  {.        i++;. 
de30: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26         if( i<n &
de40: 26 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b 2b 3b  & a[i]==0 ) i++;
de50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
de60: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50  se{.      int nP
de70: 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  os;.      int bD
de80: 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20 2b 3d  ummy;.      i +=
de90: 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
dea0: 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73  ize(&a[i], &nPos
deb0: 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
dec0: 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20    i += nPos;.   
ded0: 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20   }.    if( i>=n 
dee0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b  ) break;.    i +
def0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
df00: 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44  &a[i], (u64*)&iD
df10: 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72  elta);.    pIter
df20: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
df30: 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e  ta;..    /* If n
df40: 65 63 65 73 73 61 72 79 2c 20 67 72 6f 77 20 74  ecessary, grow t
df50: 68 65 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64  he pIter->aRowid
df60: 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79 2e 20  Offset[] array. 
df70: 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  */.    if( iRowi
df80: 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e  dOffset>=pIter->
df90: 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a  nRowidOffset ){.
dfa0: 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d        int nNew =
dfb0: 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66   pIter->nRowidOf
dfc0: 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20  fset + 8;.      
dfd0: 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74  int *aNew = (int
dfe0: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
dff0: 63 36 34 28 70 49 74 65 72 2d 3e 61 52 6f 77 69  c64(pIter->aRowi
e000: 64 4f 66 66 73 65 74 2c 6e 4e 65 77 2a 73 69 7a  dOffset,nNew*siz
e010: 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  eof(int));.     
e020: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
e030: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
e040: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e060: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72     }.      pIter
e070: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->aRowidOffset =
e080: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74   aNew;.      pIt
e090: 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74  er->nRowidOffset
e0a0: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a   = nNew;.    }..
e0b0: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
e0c0: 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66  dOffset[iRowidOf
e0d0: 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d  fset++] = pIter-
e0e0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
e0f0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e100: 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  fset = i;.  }.  
e110: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
e120: 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73  set = iRowidOffs
e130: 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65  et;.  fts5SegIte
e140: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
e150: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  er);.}../*.**.*/
e160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
e170: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
e180: 65 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  ewPage(Fts5Index
e190: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
e1a0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
e1b0: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
e1c0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
e1d0: 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73  REVERSE );.  ass
e1e0: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
e1f0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
e200: 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66  _ONETERM );..  f
e210: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
e220: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
e230: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
e240: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
e250: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
e260: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e  Iter->iLeafPgno>
e270: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
e280: 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35  Pgno ){.    Fts5
e290: 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Data *pNew;.    
e2a0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
e2b0: 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66  --;.    pNew = f
e2c0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
e2d0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
e2e0: 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  D(.          pIt
e2f0: 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
e300: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  , pIter->iLeafPg
e310: 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69  no.    ));.    i
e320: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
e330: 20 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66 66   /* iTermLeafOff
e340: 73 65 74 20 6d 61 79 20 62 65 20 65 71 75 61 6c  set may be equal
e350: 20 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74 68   to szLeaf if th
e360: 65 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61  e term is the la
e370: 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e  st.      ** thin
e380: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d 20  g on the page - 
e390: 69 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 72  i.e. the first r
e3a0: 6f 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20 66  owid is on the f
e3b0: 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a 20  ollowing page.. 
e3c0: 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
e3d0: 63 61 73 65 20 6c 65 61 76 65 20 70 49 74 65 72  case leave pIter
e3e0: 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69 73  ->pLeaf==0, this
e3f0: 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20   iterator is at 
e400: 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  EOF. */.      if
e410: 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ( pIter->iLeafPg
e420: 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d  no==pIter->iTerm
e430: 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
e440: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
e450: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  r->pLeaf==0 );. 
e460: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
e470: 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
e480: 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 29  t<pNew->szLeaf )
e490: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
e4a0: 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b  r->pLeaf = pNew;
e4b0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e4c0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
e4d0: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
e4e0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
e4f0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
e500: 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
e510: 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 52  dOff;.        iR
e520: 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65  owidOff = fts5Le
e530: 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
e540: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69  pNew);.        i
e550: 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a  f( iRowidOff ){.
e560: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e570: 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20  >pLeaf = pNew;. 
e580: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e590: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52  iLeafOffset = iR
e5a0: 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20  owidOff;.       
e5b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
e5c0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
e5d0: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  af ){.        u8
e5e0: 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c   *a = &pIter->pL
e5f0: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c  eaf->p[pIter->iL
e600: 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  eafOffset];.    
e610: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e620: 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65  Offset += fts5Ge
e630: 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a  tVarint(a, (u64*
e640: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
e650: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
e660: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e670: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
e680: 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
e690: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
e6a0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
e6b0: 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  af ){.    pIter-
e6c0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
e6d0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
e6e0: 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  n+1;.    fts5Seg
e6f0: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
e700: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
e710: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
e720: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
e730: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
e740: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
e750: 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a  ument currently.
e760: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64  ** points to a d
e770: 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20  elete marker. A 
e780: 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73  delete marker is
e790: 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
e7a0: 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74   0 byte.** posit
e7b0: 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion-list..*/.sta
e7c0: 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
e7d0: 69 49 74 65 72 49 73 45 6d 70 74 79 28 46 74 73  iIterIsEmpty(Fts
e7e0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
e7f0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
e800: 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
e810: 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
e820: 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
e830: 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75  .iFirst];.  retu
e840: 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
e850: 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c  E_OK && pSeg->pL
e860: 65 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f  eaf && pSeg->nPo
e870: 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s==0);.}../*.** 
e880: 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
e890: 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65   pIter to the ne
e8a0: 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  xt entry..**.** 
e8b0: 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
e8c0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
e8d0: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  ) is only used b
e8e0: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
e8f0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
e900: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
e910: 65 78 74 5f 52 65 76 65 72 73 65 28 0a 20 20 46  ext_Reverse(.  F
e920: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e940: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
e950: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
e960: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
e970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
e980: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
e990: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55 6e  e */.  int *pbUn
e9a0: 75 73 65 64 20 20 20 20 20 20 20 20 20 20 20 20  used            
e9b0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
e9c0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
e9d0: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
e9e0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
e9f0: 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74  ERSE );.  assert
ea00: 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
ea10: 61 66 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  af==0 );.  UNUSE
ea20: 44 5f 50 41 52 41 4d 28 70 62 55 6e 75 73 65 64  D_PARAM(pbUnused
ea30: 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d  );..  if( pIter-
ea40: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20  >iRowidOffset>0 
ea50: 29 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  ){.    u8 *a = p
ea60: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
ea70: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
ea80: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20    i64 iDelta;.. 
ea90: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
eaa0: 4f 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49  Offset--;.    pI
eab0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
eac0: 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64   = pIter->aRowid
ead0: 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52  Offset[pIter->iR
eae0: 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20  owidOffset];.   
eaf0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
eb00: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
eb10: 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72      iOff = pIter
eb20: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
eb30: 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69     if( p->pConfi
eb40: 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35  g->eDetail!=FTS5
eb50: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
eb60: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 49        iOff += pI
eb70: 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d  ter->nPos;.    }
eb80: 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69  .    fts5GetVari
eb90: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
eba0: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
ebb0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d   pIter->iRowid -
ebc0: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73  = iDelta;.  }els
ebd0: 65 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  e{.    fts5SegIt
ebe0: 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
ebf0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
ec00: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
ec10: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
ec20: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
ec30: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65  y..**.** This ve
ec40: 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67  rsion of fts5Seg
ec50: 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e  IterNext() is on
ec60: 6c 79 20 75 73 65 64 20 69 66 20 64 65 74 61 69  ly used if detai
ec70: 6c 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a  l=none and the.*
ec80: 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f  * iterator is no
ec90: 74 20 61 20 72 65 76 65 72 73 65 20 64 69 72 65  t a reverse dire
eca0: 63 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a  ction iterator..
ecb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
ecc0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e  ts5SegIterNext_N
ecd0: 6f 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  one(.  Fts5Index
ece0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
ecf0: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
ed00: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
ed10: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
ed20: 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
ed30: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
ed40: 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
ed50: 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20  nt *pbNewTerm   
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ed70: 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e  * OUT: Set for n
ed80: 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20  ew term */.){.  
ed90: 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73  int iOff;..  ass
eda0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
edb0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
edc0: 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  t( (pIter->flags
edd0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
ede0: 52 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20  REVERSE)==0 );. 
edf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e   assert( p->pCon
ee00: 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
ee10: 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
ee20: 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  ;..  ASSERT_SZLE
ee30: 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65  AF_OK(pIter->pLe
ee40: 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49  af);.  iOff = pI
ee50: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ee60: 3b 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  ;..  /* Next ent
ee70: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65 78  ry is on the nex
ee80: 74 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  t page */.  if( 
ee90: 70 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20 69  pIter->pSeg && i
eea0: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
eeb0: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
eec0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
eed0: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
eee0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c      if( p->rc ||
eef0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
ef00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
ef10: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30  Iter->iRowid = 0
ef20: 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a  ;.    iOff = 4;.
ef30: 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c    }..  if( iOff<
ef40: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
ef50: 6c 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  list ){.    /* N
ef60: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20  ext entry is on 
ef70: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
ef80: 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65 6c   */.    i64 iDel
ef90: 74 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  ta;.    iOff += 
efa0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
efb0: 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c 65  rint(&pIter->pLe
efc0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  af->p[iOff], (u6
efd0: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
efe0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
eff0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
f000: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
f010: 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65   iDelta;.  }else
f020: 20 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c 61   if( (pIter->fla
f030: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
f040: 52 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29 7b  R_ONETERM)==0 ){
f050: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
f060: 70 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e  pSeg ){.      in
f070: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20  t nKeep = 0;.   
f080: 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73     if( iOff!=fts
f090: 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
f0a0: 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 20  f(pIter->pLeaf) 
f0b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
f0c0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
f0d0: 33 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66  32(&pIter->pLeaf
f0e0: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  ->p[iOff], nKeep
f0f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f100: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f110: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
f120: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
f130: 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20  dTerm(p, pIter, 
f140: 6e 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c 73  nKeep);.    }els
f150: 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  e{.      const u
f160: 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
f170: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f180: 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20  zTerm = 0;.     
f190: 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20   int nList;.    
f1a0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
f1b0: 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61  hScanNext(p->pHa
f1c0: 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sh);.      sqlit
f1d0: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
f1e0: 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a  try(p->pHash, &z
f1f0: 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  Term, &pList, &n
f200: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  List);.      if(
f210: 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
f220: 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a   next_none_eof;.
f230: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f240: 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
f250: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
f260: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69  >pLeaf->nn = nLi
f270: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
f280: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d  >pLeaf->szLeaf =
f290: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
f2a0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
f2b0: 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  st = nList;.    
f2c0: 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
f2d0: 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26 70  ferSet(&p->rc,&p
f2e0: 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74  Iter->term, (int
f2f0: 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20  )strlen(zTerm), 
f300: 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20  (u8*)zTerm);.   
f310: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
f320: 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56  ffset = fts5GetV
f330: 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36  arint(pList, (u6
f340: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
f350: 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  d);.    }..    i
f360: 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a  f( pbNewTerm ) *
f370: 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20  pbNewTerm = 1;. 
f380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74 6f   }else{.    goto
f390: 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a   next_none_eof;.
f3a0: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
f3b0: 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
f3c0: 74 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b  ter);..  return;
f3d0: 0a 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a  . next_none_eof:
f3e0: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
f3f0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
f400: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ;.  pIter->pLeaf
f410: 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 0;.}.../*.** 
f420: 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
f430: 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65   pIter to the ne
f440: 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
f450: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
f460: 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
f470: 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
f480: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
f490: 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73   code. It .** is
f4a0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
f4b0: 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
f4c0: 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73  iterator reaches
f4d0: 20 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f   EOF. If an erro
f4e0: 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
f4f0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
f500: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
f510: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
f520: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
f530: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
f540: 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e  erNext(.  Fts5In
f550: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
f560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
f570: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
f580: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
f590: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
f5a0: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
f5b0: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
f5c0: 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d    int *pbNewTerm
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f    /* OUT: Set fo
f5f0: 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b  r new term */.){
f600: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
f610: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
f620: 66 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  f;.  int iOff;. 
f630: 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
f640: 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d  0;.  int nKeep =
f650: 20 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69   0;.  u8 *a;.  i
f660: 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt n;..  assert(
f670: 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c   pbNewTerm==0 ||
f680: 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29   *pbNewTerm==0 )
f690: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
f6a0: 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21  Config->eDetail!
f6b0: 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
f6c0: 45 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63  E );..  /* Searc
f6d0: 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  h for the end of
f6e0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
f6f0: 73 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  st within the cu
f700: 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20  rrent page. */. 
f710: 20 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20   a = pLeaf->p;. 
f720: 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65   n = pLeaf->szLe
f730: 61 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a  af;..  ASSERT_SZ
f740: 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a  LEAF_OK(pLeaf);.
f750: 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
f760: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49  iLeafOffset + pI
f770: 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66  ter->nPos;..  if
f780: 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
f790: 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72  /* The next entr
f7a0: 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72  y is on the curr
f7b0: 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ent page. */.   
f7c0: 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66   assert_nc( iOff
f7d0: 3c 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  <=pIter->iEndofD
f7e0: 6f 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69 66  oclist );.    if
f7f0: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69  ( iOff>=pIter->i
f800: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a  EndofDoclist ){.
f810: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
f820: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   1;.      if( iO
f830: 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73  ff!=fts5LeafFirs
f840: 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 20  tTermOff(pLeaf) 
f850: 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
f860: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
f870: 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65  32(&a[iOff], nKe
f880: 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ep);.      }.   
f890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 36   }else{.      u6
f8a0: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
f8b0: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
f8c0: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
f8d0: 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b  iOff], &iDelta);
f8e0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52  .      pIter->iR
f8f0: 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
f900: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
f910: 20 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20   iDelta>0 );.   
f920: 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c   }.    pIter->iL
f930: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
f940: 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ;..  }else if( p
f950: 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b  Iter->pSeg==0 ){
f960: 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
f970: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f  List = 0;.    co
f980: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
f990: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69  = 0;.    int nLi
f9a0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  st = 0;.    asse
f9b0: 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  rt( (pIter->flag
f9c0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
f9d0: 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e  _ONETERM) || pbN
f9e0: 65 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66  ewTerm );.    if
f9f0: 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61  ( 0==(pIter->fla
fa00: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
fa10: 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20  R_ONETERM) ){.  
fa20: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
fa30: 61 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70  ashScanNext(p->p
fa40: 48 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c  Hash);.      sql
fa50: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
fa60: 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20  Entry(p->pHash, 
fa70: 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20  &zTerm, &pList, 
fa80: 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  &nList);.    }. 
fa90: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
faa0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ){.      fts5Dat
fab0: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
fac0: 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49  pLeaf);.      pI
fad0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
fae0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
faf0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
fb00: 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20   = (u8*)pList;. 
fb10: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
fb20: 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20  f->nn = nList;. 
fb30: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
fb40: 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73  f->szLeaf = nLis
fb50: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
fb60: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
fb70: 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20 73  nList+1;.      s
fb80: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
fb90: 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
fba0: 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73  er->term, (int)s
fbb0: 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20  trlen(zTerm),.  
fbc0: 20 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54 65          (u8*)zTe
fbd0: 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  rm);.      pIter
fbe0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
fbf0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c  fts5GetVarint(pL
fc00: 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ist, (u64*)&pIte
fc10: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
fc20: 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31    *pbNewTerm = 1
fc30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
fc40: 0a 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20  .    iOff = 0;. 
fc50: 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
fc60: 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
fc70: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
fc80: 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d     while( iOff==
fc90: 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
fca0: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
fcb0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
fcc0: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
fcd0: 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28 20  Leaf;.      if( 
fce0: 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
fcf0: 3b 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53  ;.      ASSERT_S
fd00: 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b  ZLEAF_OK(pLeaf);
fd10: 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66  .      if( (iOff
fd20: 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
fd30: 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 29  RowidOff(pLeaf))
fd40: 20 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e   && iOff<pLeaf->
fd50: 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
fd60: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
fd70: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
fd80: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
fd90: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
fda0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70  owid);.        p
fdb0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
fdc0: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  t = iOff;..     
fdd0: 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e     if( pLeaf->nn
fde0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
fdf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
fe00: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70  r->iPgidxOff = p
fe10: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66  Leaf->szLeaf + f
fe20: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a  ts5GetVarint32(.
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
fe40: 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73  Leaf->p[pLeaf->s
fe50: 7a 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69  zLeaf], pIter->i
fe60: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20  EndofDoclist.   
fe70: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
fe80: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fe90: 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66    else if( pLeaf
fea0: 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ->nn>pLeaf->szLe
feb0: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  af ){.        pI
fec0: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
fed0: 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b   pLeaf->szLeaf +
fee0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
fef0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70  (.            &p
ff00: 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73  Leaf->p[pLeaf->s
ff10: 7a 4c 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20 20  zLeaf], iOff.   
ff20: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
ff30: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ff40: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
ff50: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
ff60: 44 6f 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b 0a  Doclist = iOff;.
ff70: 20 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d          bNewTerm
ff80: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
ff90: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
ffa0: 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  Off<pLeaf->szLea
ffb0: 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  f );.      if( i
ffc0: 4f 66 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  Off>pLeaf->szLea
ffd0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
ffe0: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
fff0: 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  T;.        retur
10000 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
10010 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
10020 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
10030 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20   is now at EOF. 
10040 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61  If so, return ea
10050 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49  rly. */.  if( pI
10060 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
10070 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29    if( bNewTerm )
10080 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
10090 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
100a0 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
100b0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  ){.        fts5D
100c0 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
100d0 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
100e0 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
100f0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
10100 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
10110 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20  IterLoadTerm(p, 
10120 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20  pIter, nKeep);. 
10130 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
10140 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
10150 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ter);.        if
10160 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70  ( pbNewTerm ) *p
10170 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
10180 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
10190 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
101a0 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62 65  llowing could be
101b0 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67   done by calling
101c0 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
101d0 4e 50 6f 73 28 29 2e 20 42 75 74 0a 20 20 20 20  NPos(). But.    
101e0 20 20 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20    ** this block 
101f0 69 73 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20  is particularly 
10200 70 65 72 66 6f 72 6d 61 6e 63 65 20 63 72 69 74  performance crit
10210 69 63 61 6c 2c 20 73 6f 20 65 71 75 69 76 61 6c  ical, so equival
10220 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ent.      ** cod
10230 65 20 69 73 20 69 6e 6c 69 6e 65 64 2e 20 0a 20  e is inlined. . 
10240 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10250 20 4c 61 74 65 72 3a 20 53 77 69 74 63 68 65 64   Later: Switched
10260 20 62 61 63 6b 20 74 6f 20 66 74 73 35 53 65 67   back to fts5Seg
10270 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 20 62  IterLoadNPos() b
10280 65 63 61 75 73 65 20 69 74 20 73 75 70 70 6f 72  ecause it suppor
10290 74 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 61  ts.      ** deta
102a0 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20 4e 6f  il=none mode. No
102b0 74 20 69 64 65 61 6c 2e 0a 20 20 20 20 20 20 2a  t ideal..      *
102c0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b  /.      int nSz;
102d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
102e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
102f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10300 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
10310 73 65 74 3c 3d 70 49 74 65 72 2d 3e 70 4c 65 61  set<=pIter->pLea
10320 66 2d 3e 6e 6e 20 29 3b 0a 20 20 20 20 20 20 66  f->nn );.      f
10330 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
10340 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  32(pIter->pLeaf-
10350 3e 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  >p, pIter->iLeaf
10360 4f 66 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20 20  Offset, nSz);.  
10370 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20      pIter->bDel 
10380 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29  = (nSz & 0x0001)
10390 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
103a0 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20  Pos = nSz>>1;.  
103b0 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
103c0 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b  Iter->nPos>=0 );
103d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64  .    }.  }.}..#d
103e0 65 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c  efine SWAPVAL(T,
103f0 20 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20   a, b) { T tmp; 
10400 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d  tmp=a; a=b; b=tm
10410 70 3b 20 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74  p; }..#define ft
10420 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e  s5IndexSkipVarin
10430 74 28 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20  t(a, iOff) {    
10440 20 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20          \.  int 
10450 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20  iEnd = iOff+9;  
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
10480 77 68 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b  while( (a[iOff++
10490 5d 20 26 20 30 78 38 30 29 20 26 26 20 69 4f 66  ] & 0x80) && iOf
104a0 66 3c 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20  f<iEnd );       
104b0 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  \.}../*.** Itera
104c0 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
104d0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
104e0 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  e first rowid in
104f0 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73   a doclist. This
10500 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  .** function set
10510 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75  s the iterator u
10520 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74  p so that iterat
10530 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
10540 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  der through.** t
10550 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73  he doclist..*/.s
10560 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
10570 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74  egIterReverse(Ft
10580 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
10590 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
105a0 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
105b0 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72   *pDlidx = pIter
105c0 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35  ->pDlidx;.  Fts5
105d0 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b  Data *pLast = 0;
105e0 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
105f0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69  = 0;..  if( pDli
10600 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  dx ){.    int iS
10610 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53  egid = pIter->pS
10620 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
10630 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44  pgnoLast = fts5D
10640 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
10650 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20  idx);.    pLast 
10660 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
10670 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
10680 4f 57 49 44 28 69 53 65 67 69 64 2c 20 70 67 6e  OWID(iSegid, pgn
10690 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65  oLast));.  }else
106a0 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
106b0 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
106c0 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  Leaf;         /*
106d0 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
106e0 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75  ta */..    /* Cu
106f0 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67  rrently, Fts5Seg
10700 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
10710 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
10720 69 72 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  irst byte of.   
10730 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73   ** position-lis
10740 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68  t content for th
10750 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e  e current rowid.
10760 20 42 61 63 6b 20 69 74 20 75 70 20 73 6f 20 74   Back it up so t
10770 68 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f  hat it.    ** po
10780 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72  ints to the star
10790 74 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  t of the positio
107a0 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
107b0 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50  d. */.    int iP
107c0 6f 73 6c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  oslist;.    if( 
107d0 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
107e0 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno==pIter->iLe
107f0 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
10800 69 50 6f 73 6c 69 73 74 20 3d 20 70 49 74 65 72  iPoslist = pIter
10810 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
10820 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
10830 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 34      iPoslist = 4
10840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
10850 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28  IndexSkipVarint(
10860 70 4c 65 61 66 2d 3e 70 2c 20 69 50 6f 73 6c 69  pLeaf->p, iPosli
10870 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  st);.    pIter->
10880 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 50  iLeafOffset = iP
10890 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20 2f 2a 20  oslist;..    /* 
108a0 49 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  If this conditio
108b0 6e 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 74  n is true then t
108c0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64  he largest rowid
108d0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
108e0 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79  .    ** term may
108f0 20 6e 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f   not be stored o
10900 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
10910 67 65 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f  ge. So search fo
10920 72 77 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20  rward to.    ** 
10930 73 65 65 20 77 68 65 72 65 20 73 61 69 64 20 72  see where said r
10940 6f 77 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20  owid really is. 
10950 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
10960 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
10970 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  >=pLeaf->szLeaf 
10980 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e  ){.      int pgn
10990 6f 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  o;.      Fts5Str
109a0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
109b0 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  Seg = pIter->pSe
109c0 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  g;..      /* The
109d0 20 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74   last rowid in t
109e0 68 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e  he doclist may n
109f0 6f 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72  ot be on the cur
10a00 72 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63  rent page. Searc
10a10 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61  h.      ** forwa
10a20 72 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70  rd to find the p
10a30 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
10a40 68 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20  he last rowid.  
10a50 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70 67 6e  */.      for(pgn
10a60 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o=pIter->iLeafPg
10a70 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20 26 26 20  no+1; !p->rc && 
10a80 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f  pgno<=pSeg->pgno
10a90 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20  Last; pgno++){. 
10aa0 20 20 20 20 20 20 20 69 36 34 20 69 41 62 73 20         i64 iAbs 
10ab0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
10ac0 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69  OWID(pSeg->iSegi
10ad0 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  d, pgno);.      
10ae0 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
10af0 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
10b00 70 2c 20 69 41 62 73 29 3b 0a 20 20 20 20 20 20  p, iAbs);.      
10b10 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
10b20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
10b30 69 64 2c 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20  id, bTermless;. 
10b40 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20           iRowid 
10b50 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
10b60 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20  owidOff(pNew);. 
10b70 20 20 20 20 20 20 20 20 20 62 54 65 72 6d 6c 65           bTermle
10b80 73 73 20 3d 20 66 74 73 35 4c 65 61 66 49 73 54  ss = fts5LeafIsT
10b90 65 72 6d 6c 65 73 73 28 70 4e 65 77 29 3b 0a 20  ermless(pNew);. 
10ba0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
10bb0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
10bc0 20 20 20 53 57 41 50 56 41 4c 28 46 74 73 35 44     SWAPVAL(Fts5D
10bd0 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73  ata*, pNew, pLas
10be0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
10bf0 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b  pgnoLast = pgno;
10c00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10c10 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
10c20 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
10c30 20 20 20 20 20 20 20 20 69 66 28 20 62 54 65 72          if( bTer
10c40 6d 6c 65 73 73 3d 3d 30 20 29 20 62 72 65 61 6b  mless==0 ) break
10c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10c60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10c70 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20   /* If pLast is 
10c80 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
10c90 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  nt, then the las
10ca0 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73  t rowid for this
10cb0 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69   doclist.  ** li
10cc0 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63  es on the page c
10cd0 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74  urrently indicat
10ce0 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
10cf0 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
10d00 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c   .  ** pIter->iL
10d10 65 61 66 4f 66 66 73 65 74 20 69 73 20 61 6c 72  eafOffset is alr
10d20 65 61 64 79 20 73 65 74 20 74 6f 20 70 6f 69 6e  eady set to poin
10d30 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  t to the positio
10d40 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a  n-list size.  **
10d50 20 66 69 65 6c 64 20 61 73 73 6f 63 69 61 74 65   field associate
10d60 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
10d70 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
10d80 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  on the page..  *
10d90 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c  *.  ** Or, if pL
10da0 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ast is non-NULL,
10db0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
10dc0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
10dd0 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a  ns the last.  **
10de0 20 72 6f 77 69 64 2e 20 49 6e 20 74 68 69 73 20   rowid. In this 
10df0 63 61 73 65 20 63 6f 6e 66 69 67 75 72 65 20 74  case configure t
10e00 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
10e10 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
10e20 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
10e30 72 6f 77 69 64 20 6f 6e 20 74 68 69 73 20 70 61  rowid on this pa
10e40 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
10e50 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Last ){.    int 
10e60 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61  iOff;.    fts5Da
10e70 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
10e80 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
10e90 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73  er->pLeaf = pLas
10ea0 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  t;.    pIter->iL
10eb0 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61  eafPgno = pgnoLa
10ec0 73 74 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 66  st;.    iOff = f
10ed0 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
10ee0 64 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20  dOff(pLast);.   
10ef0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
10f00 56 61 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70  Varint(&pLast->p
10f10 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
10f20 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
10f30 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
10f40 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20  ffset = iOff;.. 
10f50 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49     if( fts5LeafI
10f60 73 54 65 72 6d 6c 65 73 73 28 70 4c 61 73 74 29  sTermless(pLast)
10f70 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
10f80 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
10f90 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20   pLast->nn+1;.  
10fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10fb0 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
10fc0 69 73 74 20 3d 20 66 74 73 35 4c 65 61 66 46 69  ist = fts5LeafFi
10fd0 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 61 73 74  rstTermOff(pLast
10fe0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20  );.    }..  }.. 
10ff0 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
11000 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
11010 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Iter);.}../*.** 
11020 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63  Iterator pIter c
11030 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
11040 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
11050 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e  id of a doclist.
11060 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 64  .** There is a d
11070 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73  oclist-index ass
11080 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
11090 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74   final term on t
110a0 68 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70  he current .** p
110b0 61 67 65 2e 20 49 66 20 74 68 65 20 63 75 72 72  age. If the curr
110c0 65 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65 20  ent term is the 
110d0 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  last term on the
110e0 20 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20   page, load the 
110f0 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  .** doclist-inde
11100 78 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20  x from disk and 
11110 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74  initialize an it
11120 65 72 61 74 6f 72 20 61 74 20 28 70 49 74 65 72  erator at (pIter
11130 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74  ->pDlidx)..*/.st
11140 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
11150 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46  gIterLoadDlidx(F
11160 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
11170 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
11180 7b 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70  {.  int iSeg = p
11190 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67  Iter->pSeg->iSeg
111a0 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d  id;.  int bRev =
111b0 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
111c0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
111d0 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61  VERSE);.  Fts5Da
111e0 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
111f0 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72  r->pLeaf; /* Cur
11200 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a  rent leaf data *
11210 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  /..  assert( pIt
11220 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
11230 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
11240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
11250 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29  ter->pDlidx==0 )
11260 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
11270 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
11280 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69  list ends on thi
11290 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f  s page. If it do
112a0 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  es, return.  ** 
112b0 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f  early without lo
112c0 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73  ading the doclis
112d0 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62  t-index (as it b
112e0 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66  elongs to a diff
112f0 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e  erent.  ** term.
11300 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d   */.  if( pIter-
11310 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d  >iTermLeafPgno==
11320 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
11330 20 0a 20 20 20 26 26 20 70 49 74 65 72 2d 3e 69   .   && pIter->i
11340 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 4c 65  EndofDoclist<pLe
11350 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 29 7b  af->szLeaf .  ){
11360 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11370 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  ..  pIter->pDlid
11380 78 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  x = fts5DlidxIte
11390 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c 20 69  rInit(p, bRev, i
113a0 53 65 67 2c 20 70 49 74 65 72 2d 3e 69 54 65 72  Seg, pIter->iTer
113b0 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f  mLeafPgno);.}../
113c0 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
113d0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
113e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
113f0 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
11400 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20   contains.** no 
11410 76 61 6c 69 64 20 76 61 6c 75 65 73 20 65 78 63  valid values exc
11420 65 70 74 20 66 6f 72 20 74 68 65 20 46 74 73 35  ept for the Fts5
11430 53 65 67 49 74 65 72 2e 70 4c 65 61 66 20 6d 65  SegIter.pLeaf me
11440 6d 62 65 72 20 76 61 72 69 61 62 6c 65 2e 20 54  mber variable. T
11450 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
11460 73 65 61 72 63 68 65 73 20 74 68 65 20 6c 65 61  searches the lea
11470 66 20 70 61 67 65 20 66 6f 72 20 61 20 74 65 72  f page for a ter
11480 6d 20 6d 61 74 63 68 69 6e 67 20 28 70 54 65 72  m matching (pTer
11490 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20  m/nTerm)..**.** 
114a0 49 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  If the specified
114b0 20 74 65 72 6d 20 69 73 20 66 6f 75 6e 64 20 6f   term is found o
114c0 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
114d0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
114e0 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e   left.** pointin
114f0 67 20 74 6f 20 69 74 2e 20 49 66 20 61 72 67 75  g to it. If argu
11500 6d 65 6e 74 20 62 47 65 20 69 73 20 7a 65 72 6f  ment bGe is zero
11510 20 61 6e 64 20 74 68 65 20 74 65 72 6d 20 69 73   and the term is
11520 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74   not found,.** t
11530 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
11540 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
11550 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47  EOF..**.** If bG
11560 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  e is non-zero an
11570 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
11580 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e  term is not foun
11590 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69  d, then the.** i
115a0 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
115b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
115c0 73 6d 61 6c 6c 65 73 74 20 74 65 72 6d 20 69 6e  smallest term in
115d0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 74 68 61   the segment tha
115e0 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74  t.** is larger t
115f0 68 61 6e 20 74 68 65 20 73 70 65 63 69 66 69 65  han the specifie
11600 64 20 74 65 72 6d 2c 20 65 76 65 6e 20 69 66 20  d term, even if 
11610 74 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  this term is not
11620 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   on the.** curre
11630 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  nt page..*/.stat
11640 69 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66  ic void fts5Leaf
11650 53 65 65 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  Seek(.  Fts5Inde
11660 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
11670 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
11680 20 61 6e 79 20 65 72 72 6f 72 20 63 6f 64 65 20   any error code 
11690 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 47  here */.  int bG
116a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
116b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
116c0 65 20 66 6f 72 20 61 20 3e 3d 20 73 65 61 72 63  e for a >= searc
116d0 68 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  h */.  Fts5SegIt
116e0 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
116f0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
11700 6f 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20  or to seek */.  
11710 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
11720 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20   int nTerm      
11730 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63  /* Term to searc
11740 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  h for */.){.  in
11750 74 20 69 4f 66 66 3b 0a 20 20 63 6f 6e 73 74 20  t iOff;.  const 
11760 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
11770 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 73  Leaf->p;.  int s
11780 7a 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  zLeaf = pIter->p
11790 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
117a0 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70  int n = pIter->p
117b0 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 75 33 32  Leaf->nn;..  u32
117c0 20 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 75   nMatch = 0;.  u
117d0 33 32 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20  32 nKeep = 0;.  
117e0 75 33 32 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20  u32 nNew = 0;.  
117f0 75 33 32 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  u32 iTermOff;.  
11800 69 6e 74 20 69 50 67 69 64 78 3b 20 20 20 20 20  int iPgidx;     
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  /* Current offse
11830 74 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20  t in pgidx */.  
11840 69 6e 74 20 62 45 6e 64 4f 66 50 61 67 65 20 3d  int bEndOfPage =
11850 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
11860 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11870 29 3b 0a 0a 20 20 69 50 67 69 64 78 20 3d 20 73  );..  iPgidx = s
11880 7a 4c 65 61 66 3b 0a 20 20 69 50 67 69 64 78 20  zLeaf;.  iPgidx 
11890 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
118a0 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 69  32(&a[iPgidx], i
118b0 54 65 72 6d 4f 66 66 29 3b 0a 20 20 69 4f 66 66  TermOff);.  iOff
118c0 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69   = iTermOff;.  i
118d0 66 28 20 69 4f 66 66 3e 6e 20 29 7b 0a 20 20 20  f( iOff>n ){.   
118e0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
118f0 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72  RRUPT;.    retur
11900 6e 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  n;.  }..  while(
11910 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69   1 ){..    /* Fi
11920 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
11930 79 20 6e 65 77 20 62 79 74 65 73 20 61 72 65 20  y new bytes are 
11940 69 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  in this term */.
11950 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56      fts5FastGetV
11960 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c  arint32(a, iOff,
11970 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   nNew);.    if( 
11980 6e 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a  nKeep<nMatch ){.
11990 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
119a0 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  h_failed;.    }.
119b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
119c0 65 70 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20  ep>=nMatch );.  
119d0 20 20 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61    if( nKeep==nMa
119e0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 75 33 32  tch ){.      u32
119f0 20 6e 43 6d 70 3b 0a 20 20 20 20 20 20 75 33 32   nCmp;.      u32
11a00 20 69 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d   i;.      nCmp =
11a10 20 28 75 33 32 29 4d 49 4e 28 6e 4e 65 77 2c 20   (u32)MIN(nNew, 
11a20 6e 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20  nTerm-nMatch);. 
11a30 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11a40 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCmp; i++){.    
11a50 20 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69      if( a[iOff+i
11a60 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b  ]!=pTerm[nMatch+
11a70 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  i] ) break;.    
11a80 20 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68    }.      nMatch
11a90 20 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66   += i;..      if
11aa0 28 20 28 75 33 32 29 6e 54 65 72 6d 3d 3d 6e 4d  ( (u32)nTerm==nM
11ab0 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
11ac0 69 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20  if( i==nNew ){. 
11ad0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
11ae0 61 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20 20  arch_success;.  
11af0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11b00 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72         goto sear
11b10 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  ch_failed;.     
11b20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
11b30 20 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20 61   if( i<nNew && a
11b40 5b 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e  [iOff+i]>pTerm[n
11b50 4d 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20 20  Match] ){.      
11b60 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61    goto search_fa
11b70 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
11b80 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50 67    }..    if( iPg
11b90 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  idx>=n ){.      
11ba0 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b 0a  bEndOfPage = 1;.
11bb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11bc0 20 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20 2b   }..    iPgidx +
11bd0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
11be0 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 4b  2(&a[iPgidx], nK
11bf0 65 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f  eep);.    iTermO
11c00 66 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20 20  ff += nKeep;.   
11c10 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
11c20 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  ;..    if( iOff>
11c30 3d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =n ){.      p->r
11c40 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
11c50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
11c60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
11c70 61 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65  ad the nKeep fie
11c80 6c 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  ld of the next t
11c90 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  erm. */.    fts5
11ca0 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
11cb0 61 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b  a, iOff, nKeep);
11cc0 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61  .  }.. search_fa
11cd0 69 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d  iled:.  if( bGe=
11ce0 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61  =0 ){.    fts5Da
11cf0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
11d00 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
11d10 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
11d20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
11d30 73 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67  se if( bEndOfPag
11d40 65 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e ){.    do {.  
11d50 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
11d60 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
11d70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
11d80 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72  er->pLeaf==0 ) r
11d90 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d  eturn;.      a =
11da0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
11db0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  ;.      if( fts5
11dc0 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
11dd0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20  Iter->pLeaf)==0 
11de0 29 7b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64  ){.        iPgid
11df0 78 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  x = pIter->pLeaf
11e00 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20  ->szLeaf;.      
11e10 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
11e20 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
11e30 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67  er->pLeaf->p[iPg
11e40 69 64 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20  idx], iOff);.   
11e50 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20       if( iOff<4 
11e60 7c 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  || iOff>=pIter->
11e70 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
11e80 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
11e90 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
11ea0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
11eb0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
11ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65  {.          nKee
11ed0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  p = 0;.         
11ee0 20 69 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66 66   iTermOff = iOff
11ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20  ;.          n = 
11f00 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
11f10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
11f20 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
11f30 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e  t32(&a[iOff], nN
11f40 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ew);.          b
11f50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
11f60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
11f70 6c 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73  le( 1 );.  }.. s
11f80 65 61 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 20  earch_success:. 
11f90 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
11fa0 73 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65  set = iOff + nNe
11fb0 77 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  w;.  if( pIter->
11fc0 69 4c 65 61 66 4f 66 66 73 65 74 3e 6e 20 29 7b  iLeafOffset>n ){
11fd0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
11fe0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
11ff0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74  eturn;.  }.  pIt
12000 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
12010 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  set = pIter->iLe
12020 61 66 4f 66 66 73 65 74 3b 0a 20 20 70 49 74 65  afOffset;.  pIte
12030 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
12040 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50   = pIter->iLeafP
12050 67 6e 6f 3b 0a 0a 20 20 66 74 73 35 42 75 66 66  gno;..  fts5Buff
12060 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
12070 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65  Iter->term, nKee
12080 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 66 74 73  p, pTerm);.  fts
12090 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
120a0 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  b(&p->rc, &pIter
120b0 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61  ->term, nNew, &a
120c0 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20 69 66 28 20  [iOff]);..  if( 
120d0 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20  iPgidx>=n ){.   
120e0 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
120f0 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
12100 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
12110 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
12120 74 72 61 3b 0a 20 20 20 20 69 50 67 69 64 78 20  tra;.    iPgidx 
12130 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
12140 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e  32(&a[iPgidx], n
12150 45 78 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65  Extra);.    pIte
12160 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
12170 20 3d 20 69 54 65 72 6d 4f 66 66 20 2b 20 6e 45   = iTermOff + nE
12180 78 74 72 61 3b 0a 20 20 7d 0a 20 20 70 49 74 65  xtra;.  }.  pIte
12190 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 69  r->iPgidxOff = i
121a0 50 67 69 64 78 3b 0a 0a 20 20 66 74 73 35 53 65  Pgidx;..  fts5Se
121b0 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70  gIterLoadRowid(p
121c0 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35  , pIter);.  fts5
121d0 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
121e0 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74  p, pIter);.}..st
121f0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d  atic sqlite3_stm
12200 74 20 2a 66 74 73 35 49 64 78 53 65 6c 65 63 74  t *fts5IdxSelect
12210 53 74 6d 74 28 46 74 73 35 49 6e 64 65 78 20 2a  Stmt(Fts5Index *
12220 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  p){.  if( p->pId
12230 78 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  xSelect==0 ){.  
12240 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
12250 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
12260 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65  ig;.    fts5Inde
12270 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
12280 26 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20  &p->pIdxSelect, 
12290 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
122a0 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
122b0 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 27 25 71  CT pgno FROM '%q
122c0 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45  '.'%q_idx' WHERE
122d0 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 73 65   ".          "se
122e0 67 69 64 3d 3f 20 41 4e 44 20 74 65 72 6d 3c 3d  gid=? AND term<=
122f0 3f 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  ? ORDER BY term 
12300 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20  DESC LIMIT 1",. 
12310 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
12320 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
12330 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
12340 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 49  }.  return p->pI
12350 64 78 53 65 6c 65 63 74 3b 0a 7d 0a 0a 2f 2a 0a  dxSelect;.}../*.
12360 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
12370 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  e object pIter t
12380 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20  o point to term 
12390 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68  pTerm/nTerm with
123a0 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53  in segment.** pS
123b0 65 67 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  eg. If there is 
123c0 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20  no such term in 
123d0 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69  the index, the i
123e0 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  terator is set t
123f0 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  o EOF..**.** If 
12400 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
12410 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73   Fts5Index.rc is
12420 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f   set to an appro
12430 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
12440 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  e. If .** an err
12450 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
12460 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
12470 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12480 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
12490 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
124a0 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 53  oid fts5SegIterS
124b0 65 65 6b 49 6e 69 74 28 0a 20 20 46 74 73 35 49  eekInit(.  Fts5I
124c0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
124d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
124e0 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20  S5 backend */.  
124f0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
12500 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
12510 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
12520 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
12530 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
12540 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
12550 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
12560 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
12570 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
12580 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
12590 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
125a0 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
125b0 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
125c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
125d0 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
125e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67   */.){.  int iPg
125f0 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20   = 1;.  int bGe 
12600 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  = (flags & FTS5I
12610 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
12620 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d  ;.  int bDlidx =
12630 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12640 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
12650 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
12660 74 2d 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c  t-index */.  sql
12670 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 53  ite3_stmt *pIdxS
12680 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 61 73  elect = 0;..  as
12690 73 65 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20  sert( bGe==0 || 
126a0 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
126b0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 3d 3d  EX_QUERY_DESC)==
126c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
126d0 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b  Term && nTerm );
126e0 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
126f0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
12700 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53  r));.  pIter->pS
12710 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a  eg = pSeg;..  /*
12720 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73   This block sets
12730 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20   stack variable 
12740 69 50 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20  iPg to the leaf 
12750 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
12760 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69   may.  ** contai
12770 6e 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54  n term (pTerm/nT
12780 65 72 6d 29 2c 20 69 66 20 69 74 20 69 73 20 70  erm), if it is p
12790 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 65  resent in the se
127a0 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 70 49 64 78  gment. */.  pIdx
127b0 53 65 6c 65 63 74 20 3d 20 66 74 73 35 49 64 78  Select = fts5Idx
127c0 53 65 6c 65 63 74 53 74 6d 74 28 70 29 3b 0a 20  SelectStmt(p);. 
127d0 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
127e0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  urn;.  sqlite3_b
127f0 69 6e 64 5f 69 6e 74 28 70 49 64 78 53 65 6c 65  ind_int(pIdxSele
12800 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65  ct, 1, pSeg->iSe
12810 67 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  gid);.  sqlite3_
12820 62 69 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53 65  bind_blob(pIdxSe
12830 6c 65 63 74 2c 20 32 2c 20 70 54 65 72 6d 2c 20  lect, 2, pTerm, 
12840 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f 53 54  nTerm, SQLITE_ST
12850 41 54 49 43 29 3b 0a 20 20 69 66 28 20 53 51 4c  ATIC);.  if( SQL
12860 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
12870 5f 73 74 65 70 28 70 49 64 78 53 65 6c 65 63 74  _step(pIdxSelect
12880 29 20 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c  ) ){.    i64 val
12890 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
128a0 6e 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74  n_int(pIdxSelect
128b0 2c 20 30 29 3b 0a 20 20 20 20 69 50 67 20 3d 20  , 0);.    iPg = 
128c0 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29 3b 0a 20  (int)(val>>1);. 
128d0 20 20 20 62 44 6c 69 64 78 20 3d 20 28 76 61 6c     bDlidx = (val
128e0 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 7d 0a   & 0x0001);.  }.
128f0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
12900 33 5f 72 65 73 65 74 28 70 49 64 78 53 65 6c 65  3_reset(pIdxSele
12910 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  ct);.  sqlite3_b
12920 69 6e 64 5f 6e 75 6c 6c 28 70 49 64 78 53 65 6c  ind_null(pIdxSel
12930 65 63 74 2c 20 32 29 3b 0a 0a 20 20 69 66 28 20  ect, 2);..  if( 
12940 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  iPg<pSeg->pgnoFi
12950 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d  rst ){.    iPg =
12960 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
12970 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30  ;.    bDlidx = 0
12980 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  ;.  }..  pIter->
12990 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20  iLeafPgno = iPg 
129a0 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74  - 1;.  fts5SegIt
129b0 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
129c0 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74  ter);..  if( pIt
129d0 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
129e0 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70 2c   fts5LeafSeek(p,
129f0 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54 65   bGe, pIter, pTe
12a00 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a  rm, nTerm);.  }.
12a10 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
12a20 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d  LITE_OK && bGe==
12a30 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  0 ){.    pIter->
12a40 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
12a50 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
12a60 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
12a70 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28  eaf ){.      if(
12a80 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
12a90 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
12aa0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
12ab0 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
12ac0 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
12ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12ae0 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20   bDlidx ){.     
12af0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
12b00 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65 72  adDlidx(p, pIter
12b10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12b20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
12b30 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
12b40 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  C ){.        fts
12b50 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
12b60 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
12b70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12b80 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
12b90 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  xt(p, pIter);.. 
12ba0 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a   /* Either:.  **
12bb0 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72  .  **   1) an er
12bc0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
12bd0 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74  , or.  **   2) t
12be0 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
12bf0 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20  ts to EOF, or.  
12c00 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72  **   3) the iter
12c10 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ator points to a
12c20 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72  n entry with ter
12c30 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
12c40 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68   or.  **   4) th
12c50 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
12c60 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20  Y_SCAN flag was 
12c70 73 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72  set and the iter
12c80 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  ator points.  **
12c90 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72        to an entr
12ca0 79 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72  y with a term gr
12cb0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
12cc0 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54  ual to (pTerm/nT
12cd0 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  erm)..  */.  ass
12ce0 65 72 74 5f 6e 63 28 20 70 2d 3e 72 63 21 3d 53  ert_nc( p->rc!=S
12cf0 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d20 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74  * 1 */.   || pIt
12d30 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20  er->pLeaf==0    
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20             /* 2 
12d70 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66  */.   || fts5Buf
12d80 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
12d90 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
12da0 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20  rm, nTerm)==0   
12db0 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20         /* 3 */. 
12dc0 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73    || (bGe && fts
12dd0 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
12de0 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
12df0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30   pTerm, nTerm)>0
12e00 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a  )  /* 4 */.  );.
12e10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
12e20 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
12e30 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
12e40 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
12e50 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
12e60 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
12e70 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  able. If there i
12e80 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
12e90 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
12ea0 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
12eb0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
12ec0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
12ed0 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
12ee0 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
12ef0 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
12f00 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
12f10 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
12f20 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
12f30 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
12f40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
12f50 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
12f60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12f70 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
12f80 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
12f90 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12fa0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
12fb0 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ckend */.  const
12fc0 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
12fd0 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
12fe0 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
12ff0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
13020 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
13030 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
13040 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
13050 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
13060 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
13070 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  ){.  const u8 *p
13080 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  List = 0;.  int 
13090 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  nList = 0;.  con
130a0 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20  st u8 *z = 0;.  
130b0 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73  int n = 0;..  as
130c0 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29  sert( p->pHash )
130d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
130e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
130f0 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
13100 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
13110 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
13120 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
13130 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
13140 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73  ScanInit(p->pHas
13150 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
13160 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
13170 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
13180 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
13190 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
131a0 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
131b0 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
131c0 20 28 7a 20 3f 20 28 69 6e 74 29 73 74 72 6c 65   (z ? (int)strle
131d0 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  n((const char*)z
131e0 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ) : 0);.  }else{
131f0 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
13200 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
13210 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73  R_ONETERM;.    s
13220 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75  qlite3Fts5HashQu
13230 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63  ery(p->pHash, (c
13240 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d  onst char*)pTerm
13250 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c  , nTerm, &pList,
13260 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20   &nList);.    z 
13270 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d  = pTerm;.    n =
13280 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69   nTerm;.  }..  i
13290 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
132a0 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
132b0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
132c0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
132d0 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
132e0 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66  n, z);.    pLeaf
132f0 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63   = fts5IdxMalloc
13300 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
13310 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ata));.    if( p
13320 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
13330 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d  ;.    pLeaf->p =
13340 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
13350 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65   pLeaf->nn = pLe
13360 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
13370 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  st;.    pIter->p
13380 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20  Leaf = pLeaf;.  
13390 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
133a0 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
133b0 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28  rint(pLeaf->p, (
133c0 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
133d0 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  wid);.    pIter-
133e0 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
133f0 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 20   pLeaf->nn;..   
13400 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
13410 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
13420 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  C ){.      pIter
13430 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
13440 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b  SEGITER_REVERSE;
13450 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
13460 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
13470 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
13480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
13490 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
134a0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
134b0 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65   }.  }..  fts5Se
134c0 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
134d0 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
134e0 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61 74   Zero the iterat
134f0 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
13500 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
13510 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
13520 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
13530 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
13540 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  er){.  fts5Buffe
13550 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65  rFree(&pIter->te
13560 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52  rm);.  fts5DataR
13570 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
13580 65 61 66 29 3b 0a 20 20 66 74 73 35 44 61 74 61  eaf);.  fts5Data
13590 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
135a0 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 66 74 73  NextLeaf);.  fts
135b0 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
135c0 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20  Iter->pDlidx);. 
135d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
135e0 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
135f0 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  t);.  memset(pIt
13600 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
13610 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a  s5SegIter));.}..
13620 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
13630 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BUG../*.** This 
13640 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
13650 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
13660 62 69 67 20 61 73 73 65 72 74 28 29 20 70 72 6f  big assert() pro
13670 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74  cedure implement
13680 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41 73 73  ed by.** fts5Ass
13690 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
136a0 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65 73 20  p(). It ensures 
136b0 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
136c0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
136d0 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69 73 20  .** in *pRes is 
136e0 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
136f0 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
13700 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
13710 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tions of the.** 
13720 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  two iterators..*
13730 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
13740 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73  s5AssertComparis
13750 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74 73 35  onResult(.  Fts5
13760 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
13770 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 2c  Fts5SegIter *p1,
13780 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
13790 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73 75 6c  p2,.  Fts5CResul
137a0 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74  t *pRes.){.  int
137b0 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74 65 72   i1 = p1 - pIter
137c0 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20 69 32  ->aSeg;.  int i2
137d0 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d 3e 61   = p2 - pIter->a
137e0 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e  Seg;..  if( p1->
137f0 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65  pLeaf || p2->pLe
13800 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31  af ){.    if( p1
13810 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
13820 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
13830 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
13840 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32      }else if( p2
13850 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
13860 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
13870 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a  ->iFirst==i1 );.
13880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13890 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28   int nMin = MIN(
138a0 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e  p1->term.n, p2->
138b0 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69  term.n);.      i
138c0 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
138d0 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e  p1->term.p, p2->
138e0 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20  term.p, nMin);. 
138f0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
13900 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d  ) res = p1->term
13910 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b  .n - p2->term.n;
13920 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ..      if( res=
13930 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
13940 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
13950 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  mEq==1 );.      
13960 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e 69 52    assert( p1->iR
13970 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64  owid!=p2->iRowid
13980 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20   );.        res 
13990 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e  = ((p1->iRowid >
139a0 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49   p2->iRowid)==pI
139b0 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20  ter->bRev) ? -1 
139c0 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : 1;.      }else
139d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
139e0 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
139f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
13a00 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
13a10 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13a20 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d  ( pRes->iFirst==
13a30 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  i1 );.      }els
13a40 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
13a50 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
13a60 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  =i2 );.      }. 
13a70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13a80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13a90 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
13aa0 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  s SQLITE_DEBUG i
13ab0 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74  s defined when t
13ac0 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73  his module.** is
13ad0 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68   compiled. In th
13ae0 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 66 75  at case, this fu
13af0 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65 6e 74  nction is essent
13b00 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72 74 28  ially an assert(
13b10 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ) .** statement 
13b20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  used to verify t
13b30 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
13b40 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
13b50 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a  First[] array.**
13b60 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f   are correct..*/
13b70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
13b80 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
13b90 53 65 74 75 70 28 46 74 73 35 49 6e 64 65 78 20  Setup(Fts5Index 
13ba0 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
13bb0 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
13bc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13bd0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13be0 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74 65 72  *pFirst = &pIter
13bf0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
13c00 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
13c10 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ];.    int i;.. 
13c20 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
13c30 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70  st->pLeaf==0)==p
13c40 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20  Iter->base.bEof 
13c50 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
13c60 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69 53 77   that pIter->iSw
13c70 69 74 63 68 52 6f 77 69 64 20 69 73 20 73 65 74  itchRowid is set
13c80 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
13c90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
13ca0 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
13cb0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13cc0 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13cd0 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20  >aSeg[i];.      
13ce0 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46 69 72  assert( p1==pFir
13cf0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  st .           |
13d00 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a  | p1->pLeaf==0 .
13d10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 74             || ft
13d20 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
13d30 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26  &pFirst->term, &
13d40 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20 20  p1->term) .     
13d50 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f        || p1->iRo
13d60 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69  wid==pIter->iSwi
13d70 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20 20 20  tchRowid.       
13d80 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77      || (p1->iRow
13d90 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63  id<pIter->iSwitc
13da0 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  hRowid)==pIter->
13db0 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a 20 20  bRev.      );.  
13dc0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
13dd0 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
13de0 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74   i+=2){.      Ft
13df0 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
13e00 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
13e10 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13e20 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d  er *p2 = &pIter-
13e30 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20  >aSeg[i+1];.    
13e40 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
13e50 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
13e60 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65  irst[(pIter->nSe
13e70 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20  g + i) / 2];.   
13e80 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d     fts5AssertCom
13e90 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49  parisonResult(pI
13ea0 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65  ter, p1, p2, pRe
13eb0 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  s);.    }..    f
13ec0 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74 65 72  or(i=1; i<(pIter
13ed0 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d  ->nSeg / 2); i+=
13ee0 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
13ef0 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
13f00 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13f10 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69  >aFirst[i*2].iFi
13f20 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73  rst ];.      Fts
13f30 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26  5SegIter *p2 = &
13f40 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
13f50 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31  er->aFirst[i*2+1
13f60 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
13f70 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
13f80 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
13f90 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66  irst[i];.      f
13fa0 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
13fb0 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
13fc0 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
13fd0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
13fe0 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 41  e.# define fts5A
13ff0 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
14000 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  tup(x,y).#endif.
14010 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f  ./*.** Do the co
14020 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61  mparison necessa
14030 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70  ry to populate p
14040 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
14050 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  t]..**.** If the
14060 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
14070 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
14080 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65  n it is the inde
14090 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  x of an entry.**
140a0 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
140b0 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74  Seg[] array that
140c0 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45   is (a) not at E
140d0 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e  OF, and (b) poin
140e0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79  ting.** to a key
140f0 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69   that is a dupli
14100 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c  cate of another,
14110 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79   higher priority
14120 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74  , .** segment-it
14130 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53  erator in the pS
14140 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  eg->aSeg[] array
14150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14160 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
14170 6f 6d 70 61 72 65 28 46 74 73 35 49 74 65 72 20  ompare(Fts5Iter 
14180 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74  *pIter, int iOut
14190 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20  ){.  int i1;    
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
141c0 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   left-hand Fts5S
141d0 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
141e0 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i2;             
141f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14200 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61  ndex of right-ha
14210 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
14220 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20  /.  int iRes;.  
14230 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b  Fts5SegIter *p1;
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14250 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73  /* Left-hand Fts
14260 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
14270 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20  s5SegIter *p2;  
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14290 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   Right-hand Fts5
142a0 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73  SegIter */.  Fts
142b0 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
142c0 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
142d0 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iOut];..  assert
142e0 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53  ( iOut<pIter->nS
142f0 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a  eg && iOut>0 );.
14300 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
14310 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65  >bRev==0 || pIte
14320 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20  r->bRev==1 );.. 
14330 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65   if( iOut>=(pIte
14340 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20  r->nSeg/2) ){.  
14350 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70    i1 = (iOut - p
14360 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20  Iter->nSeg/2) * 
14370 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b  2;.    i2 = i1 +
14380 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
14390 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69   i1 = pIter->aFi
143a0 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72  rst[iOut*2].iFir
143b0 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74  st;.    i2 = pIt
143c0 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
143d0 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d  2+1].iFirst;.  }
143e0 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  .  p1 = &pIter->
143f0 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d  aSeg[i1];.  p2 =
14400 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32   &pIter->aSeg[i2
14410 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72  ];..  pRes->bTer
14420 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  mEq = 0;.  if( p
14430 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  1->pLeaf==0 ){  
14440 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
14450 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  1 is at EOF */. 
14460 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
14470 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
14480 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a  eaf==0 ){     /*
14490 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f 46   If p2 is at EOF
144a0 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
144b0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
144c0 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42 75  int res = fts5Bu
144d0 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d  fferCompare(&p1-
144e0 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d  >term, &p2->term
144f0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  );.    if( res==
14500 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
14510 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20  t( i2>i1 );.    
14520 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30 20    assert( i2!=0 
14530 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62  );.      pRes->b
14540 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20  TermEq = 1;.    
14550 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64    if( p1->iRowid
14560 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ==p2->iRowid ){.
14570 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c          p1->bDel
14580 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20   = p2->bDel;.   
14590 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a       return i2;.
145a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
145b0 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
145c0 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
145d0 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
145e0 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  1 : +1;.    }.  
145f0 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30    assert( res!=0
14600 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c   );.    if( res<
14610 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20  0 ){.      iRes 
14620 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = i1;.    }else{
14630 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 32  .      iRes = i2
14640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
14650 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75  Res->iFirst = (u
14660 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74 75 72  16)iRes;.  retur
14670 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  n 0;.}../*.** Mo
14680 76 65 20 74 68 65 20 73 65 67 2d 69 74 65 72 20  ve the seg-iter 
14690 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
146a0 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
146b0 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c 65  owid on page iLe
146c0 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73  afPgno..** It is
146d0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65 61   an error if lea
146e0 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73  f iLeafPgno does
146f0 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
14700 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73  ntains no rowids
14710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14720 20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f   fts5SegIterGoto
14730 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
14740 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
14750 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
14760 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
14770 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
14780 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
14790 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
147a0 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
147b0 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b  int iLeafPgno.){
147c0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66  .  assert( iLeaf
147d0 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
147e0 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20  fPgno );..  if( 
147f0 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
14800 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  >pSeg->pgnoLast 
14810 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
14820 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  TS5_CORRUPT;.  }
14830 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44 61  else{.    fts5Da
14840 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
14850 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20  >pNextLeaf);.   
14860 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
14870 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72  f = 0;.    pIter
14880 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c  ->iLeafPgno = iL
14890 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66  eafPgno-1;.    f
148a0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
148b0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
148c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
148d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49  =SQLITE_OK || pI
148e0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d  ter->iLeafPgno==
148f0 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
14900 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14910 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14920 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
14930 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
14940 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
14950 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
14960 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20  eaf->szLeaf;..  
14970 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c      iOff = fts5L
14980 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
14990 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
149a0 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34        if( iOff<4
149b0 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20   || iOff>=n ){. 
149c0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
149d0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
149e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
149f0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
14a00 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
14a10 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
14a20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
14a30 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
14a40 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
14a50 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
14a60 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
14a70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14a80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
14a90 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
14aa0 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
14ab0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14ac0 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20   until it is at 
14ad0 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69  or .** past rowi
14ae0 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c  d iFrom. Regardl
14af0 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
14b00 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69   of iFrom, the i
14b10 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c  terator is.** al
14b20 77 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74  ways advanced at
14b30 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a   least once..*/.
14b40 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14b50 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
14b60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b80 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
14b90 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
14ba0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
14bb0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
14bc0 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
14bd0 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69  vance */.  i64 i
14be0 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20  Match           
14bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
14c00 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61  vance iterator a
14c10 74 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72  t least this far
14c20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65   */.){.  int bRe
14c30 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  v = (pIter->flag
14c40 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
14c50 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73  _REVERSE);.  Fts
14c60 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
14c70 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69  dx = pIter->pDli
14c80 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50  dx;.  int iLeafP
14c90 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
14ca0 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d  afPgno;.  int bM
14cb0 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  ove = 1;..  asse
14cc0 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
14cd0 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
14ce0 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
14cf0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
14d00 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dx );.  assert( 
14d10 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a  pIter->pLeaf );.
14d20 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29  .  if( bRev==0 )
14d30 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74  {.    while( !ft
14d40 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
14d50 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61  , pDlidx) && iMa
14d60 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65  tch>fts5DlidxIte
14d70 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
14d80 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e  {.      iLeafPgn
14d90 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
14da0 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
14db0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
14dc0 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78  erNext(p, pDlidx
14dd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
14de0 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e  ert_nc( iLeafPgn
14df0 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o>=pIter->iLeafP
14e00 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a  gno || p->rc );.
14e10 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
14e20 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o>pIter->iLeafPg
14e30 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  no ){.      fts5
14e40 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28  SegIterGotoPage(
14e50 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50  p, pIter, iLeafP
14e60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76  gno);.      bMov
14e70 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
14e80 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
14e90 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
14ea0 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  af==0 );.    ass
14eb0 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65  ert( iMatch<pIte
14ec0 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  r->iRowid );.   
14ed0 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69   while( !fts5Dli
14ee0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
14ef0 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66  idx) && iMatch<f
14f00 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
14f10 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20  d(pDlidx) ){.   
14f20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
14f30 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b  Prev(p, pDlidx);
14f40 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66  .    }.    iLeaf
14f50 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  Pgno = fts5Dlidx
14f60 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
14f70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  ;..    assert( f
14f80 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
14f90 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c  p, pDlidx) || iL
14fa0 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e  eafPgno<=pIter->
14fb0 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
14fc0 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c    if( iLeafPgno<
14fd0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14fe0 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
14ff0 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
15000 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20  afPgno+1;.      
15010 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
15020 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
15030 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  er);.      bMove
15040 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
15050 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 62  .  do{.    if( b
15060 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53  Move && p->rc==S
15070 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49 74 65 72  QLITE_OK ) pIter
15080 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49 74 65 72  ->xNext(p, pIter
15090 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49  , 0);.    if( pI
150a0 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  ter->pLeaf==0 ) 
150b0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
150c0 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d  Rev==0 && pIter-
150d0 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20  >iRowid>=iMatch 
150e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
150f0 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74 65   bRev!=0 && pIte
15100 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63  r->iRowid<=iMatc
15110 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62  h ) break;.    b
15120 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69  Move = 1;.  }whi
15130 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
15140 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  E_OK );.}.../*.*
15150 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72 61  * Free the itera
15160 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
15170 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
15180 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
15190 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
151a0 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35 49  tiIterFree(Fts5I
151b0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
151c0 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
151d0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
151e0 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
151f0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  g; i++){.      f
15200 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
15210 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29  &pIter->aSeg[i])
15220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
15230 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65  BufferFree(&pIte
15240 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
15250 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
15260 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
15270 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
15280 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 0a  tiIterAdvanced(.
15290 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
152c0 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
152d0 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 49 74 65  hin */.  Fts5Ite
152e0 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
152f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
15300 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61  ator to update a
15310 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f  First[] array fo
15320 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e  r */.  int iChan
15330 67 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ged,            
15340 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
15350 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20  of sub-iterator 
15360 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f  just advanced */
15370 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20  .  int iMinset  
15380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15390 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e     /* Minimum en
153a0 74 72 79 20 69 6e 20 61 46 69 72 73 74 5b 5d 20  try in aFirst[] 
153b0 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69  to set */.){.  i
153c0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70  nt i;.  for(i=(p
153d0 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e  Iter->nSeg+iChan
153e0 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73  ged)/2; i>=iMins
153f0 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  et && p->rc==SQL
15400 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a  ITE_OK; i=i/2){.
15410 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20      int iEq;.   
15420 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35   if( (iEq = fts5
15430 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
15440 72 65 28 70 49 74 65 72 2c 20 69 29 29 20 29 7b  re(pIter, i)) ){
15450 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
15460 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
15470 72 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20  r->aSeg[iEq];.  
15480 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
15490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
154a0 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78        pSeg->xNex
154b0 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20  t(p, pSeg, 0);. 
154c0 20 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e       i = pIter->
154d0 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20  nSeg + iEq;.    
154e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
154f0 75 62 2d 69 74 65 72 61 74 6f 72 20 69 43 68 61  ub-iterator iCha
15500 6e 67 65 64 20 6f 66 20 69 74 65 72 61 74 6f 72  nged of iterator
15510 20 70 49 74 65 72 20 68 61 73 20 6a 75 73 74 20   pIter has just 
15520 62 65 65 6e 20 61 64 76 61 6e 63 65 64 2e 20 49  been advanced. I
15530 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  t still.** point
15540 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 65  s to the same te
15550 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a 75 73 74  rm though - just
15560 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
15570 69 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  id. This functio
15580 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  n.** attempts to
15590 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74   update the cont
155a0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65  ents of the pIte
155b0 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 63 63 6f  r->aFirst[] acco
155c0 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69  rdingly..** If i
155d0 74 20 64 6f 65 73 20 73 6f 20 73 75 63 63 65 73  t does so succes
155e0 73 66 75 6c 6c 79 2c 20 30 20 69 73 20 72 65 74  sfully, 0 is ret
155f0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
15600 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e   1..**.** If non
15610 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
15620 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68  d, the caller sh
15630 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d 75  ould call fts5Mu
15640 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
15650 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65 72  ).** on the iter
15660 61 74 6f 72 20 69 6e 73 74 65 61 64 2e 20 54 68  ator instead. Th
15670 61 74 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  at function does
15680 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 69   the same as thi
15690 73 20 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a  s one, except.**
156a0 20 74 68 61 74 20 69 74 20 64 65 61 6c 73 20 77   that it deals w
156b0 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63  ith more complic
156c0 61 74 65 64 20 63 61 73 65 73 20 61 73 20 77 65  ated cases as we
156d0 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ll..*/ .static i
156e0 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
156f0 41 64 76 61 6e 63 65 52 6f 77 69 64 28 0a 20 20  AdvanceRowid(.  
15700 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75  /* Iterator to u
15730 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61  pdate aFirst[] a
15740 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  rray for */.  in
15750 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20  t iChanged,     
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15770 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74   Index of sub-it
15780 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61  erator just adva
15790 6e 63 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 65  nced */.  Fts5Se
157a0 67 49 74 65 72 20 2a 2a 70 70 46 69 72 73 74 0a  gIter **ppFirst.
157b0 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
157c0 20 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d   *pNew = &pIter-
157d0 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b  >aSeg[iChanged];
157e0 0a 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52  ..  if( pNew->iR
157f0 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77  owid==pIter->iSw
15800 69 74 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20  itchRowid.   || 
15810 28 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49  (pNew->iRowid<pI
15820 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
15830 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a  d)==pIter->bRev.
15840 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    ){.    int i;.
15850 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
15860 2a 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72  *pOther = &pIter
15870 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20  ->aSeg[iChanged 
15880 5e 20 30 78 30 30 30 31 5d 3b 0a 20 20 20 20 70  ^ 0x0001];.    p
15890 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
158a0 69 64 20 3d 20 70 49 74 65 72 2d 3e 62 52 65 76  id = pIter->bRev
158b0 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
158c0 34 20 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  4 : LARGEST_INT6
158d0 34 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 70 49  4;.    for(i=(pI
158e0 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67  ter->nSeg+iChang
158f0 65 64 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29  ed)/2; 1; i=i/2)
15900 7b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65 73  {.      Fts5CRes
15910 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74  ult *pRes = &pIt
15920 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a  er->aFirst[i];..
15930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
15940 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20  ew->pLeaf );.   
15950 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
15960 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70  >bTermEq==0 || p
15970 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a  Other->pLeaf );.
15980 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73 2d  .      if( pRes-
15990 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20  >bTermEq ){.    
159a0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52      if( pNew->iR
159b0 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52  owid==pOther->iR
159c0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
159d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
159e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
159f0 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e  Other->iRowid>pN
15a00 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74  ew->iRowid)==pIt
15a10 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20  er->bRev ){.    
15a20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77        pIter->iSw
15a30 69 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68  itchRowid = pOth
15a40 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20  er->iRowid;.    
15a50 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74        pNew = pOt
15a60 68 65 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  her;.        }el
15a70 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e  se if( (pOther->
15a80 69 52 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69 53  iRowid>pIter->iS
15a90 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74  witchRowid)==pIt
15aa0 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20  er->bRev ){.    
15ab0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77        pIter->iSw
15ac0 69 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68  itchRowid = pOth
15ad0 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20  er->iRowid;.    
15ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15af0 20 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74      pRes->iFirst
15b00 20 3d 20 28 75 31 36 29 28 70 4e 65 77 20 2d 20   = (u16)(pNew - 
15b10 70 49 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20  pIter->aSeg);.  
15b20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 62      if( i==1 ) b
15b30 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74  reak;..      pOt
15b40 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  her = &pIter->aS
15b50 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
15b60 74 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e 69 46  t[i ^ 0x0001].iF
15b70 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  irst ];.    }.  
15b80 7d 0a 0a 20 20 2a 70 70 46 69 72 73 74 20 3d 20  }..  *ppFirst = 
15b90 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 30  pNew;.  return 0
15ba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
15bb0 68 65 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 76  he pIter->bEof v
15bc0 61 72 69 61 62 6c 65 20 62 61 73 65 64 20 6f 6e  ariable based on
15bd0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
15be0 65 20 73 75 62 2d 69 74 65 72 61 74 6f 72 73 2e  e sub-iterators.
15bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15c00 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
15c10 45 6f 66 28 46 74 73 35 49 74 65 72 20 2a 70 49  Eof(Fts5Iter *pI
15c20 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49  ter){.  Fts5SegI
15c30 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
15c40 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
15c50 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15c60 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  t ];.  pIter->ba
15c70 73 65 2e 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e  se.bEof = pSeg->
15c80 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65  pLeaf==0;.  pIte
15c90 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
15ca0 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
15cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
15cc0 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
15cd0 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
15ce0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
15cf0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
15d00 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
15d10 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  n Fts5Index.rc. 
15d20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  It is not .** co
15d30 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
15d40 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
15d50 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f  r reaches EOF, o
15d60 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
15d70 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68  dy at .** EOF wh
15d80 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
15d90 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
15da0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
15db0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20  ultiIterNext(.  
15dc0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
15dd0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
15de0 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20  ,.  int bFrom,  
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
15e10 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73  rgument iFrom is
15e20 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20   valid */.  i64 
15e30 69 46 72 6f 6d 20 20 20 20 20 20 20 20 20 20 20  iFrom           
15e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15e50 64 76 61 6e 63 65 20 61 74 20 6c 65 61 73 74 20  dvance at least 
15e60 61 73 20 66 61 72 20 61 73 20 74 68 69 73 20 2a  as far as this *
15e70 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 55 73 65 46  /.){.  int bUseF
15e80 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 61  rom = bFrom;.  a
15e90 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 61  ssert( pIter->ba
15ea0 73 65 2e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  se.bEof==0 );.  
15eb0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
15ec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
15ed0 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74 65  nt iFirst = pIte
15ee0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
15ef0 72 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65  rst;.    int bNe
15f00 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 46  wTerm = 0;.    F
15f10 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
15f20 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
15f30 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 61 73 73  iFirst];.    ass
15f40 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
15f50 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28  TE_OK );.    if(
15f60 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70 53 65   bUseFrom && pSe
15f70 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20  g->pDlidx ){.   
15f80 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
15f90 78 74 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20  xtFrom(p, pSeg, 
15fa0 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  iFrom);.    }els
15fb0 65 7b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78  e{.      pSeg->x
15fc0 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
15fd0 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  NewTerm);.    }.
15fe0 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
15ff0 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54  Leaf==0 || bNewT
16000 65 72 6d 20 0a 20 20 20 20 20 7c 7c 20 66 74 73  erm .     || fts
16010 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
16020 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46  eRowid(pIter, iF
16030 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20  irst, &pSeg).   
16040 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75   ){.      fts5Mu
16050 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
16060 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
16070 2c 20 31 29 3b 0a 20 20 20 20 20 20 66 74 73 35  , 1);.      fts5
16080 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28  MultiIterSetEof(
16090 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70 53  pIter);.      pS
160a0 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
160b0 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  g[pIter->aFirst[
160c0 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  1].iFirst];.    
160d0 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
160e0 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  f==0 ) return;. 
160f0 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 41 73     }..    fts5As
16100 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
16110 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  up(p, pIter);.  
16120 20 20 61 73 73 65 72 74 28 20 70 53 65 67 3d 3d    assert( pSeg==
16130 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74  &pIter->aSeg[pIt
16140 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
16150 69 72 73 74 5d 20 26 26 20 70 53 65 67 2d 3e 70  irst] && pSeg->p
16160 4c 65 61 66 20 29 3b 0a 20 20 20 20 69 66 28 20  Leaf );.    if( 
16170 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74  pIter->bSkipEmpt
16180 79 3d 3d 30 20 7c 7c 20 70 53 65 67 2d 3e 6e 50  y==0 || pSeg->nP
16190 6f 73 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  os ){.      pIte
161a0 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70  r->xSetOutputs(p
161b0 49 74 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 20  Iter, pSeg);.   
161c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
161d0 0a 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20  .    bUseFrom = 
161e0 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
161f0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
16200 74 65 72 4e 65 78 74 32 28 0a 20 20 46 74 73 35  terNext2(.  Fts5
16210 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
16220 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  5Iter *pIter,.  
16230 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20  int *pbNewTerm  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20  /* OUT: True if 
16260 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65 77 20 74  *might* be new t
16270 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  erm */.){.  asse
16280 72 74 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70  rt( pIter->bSkip
16290 45 6d 70 74 79 20 29 3b 0a 20 20 69 66 28 20 70  Empty );.  if( p
162a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
162b0 29 7b 0a 20 20 20 20 2a 70 62 4e 65 77 54 65 72  ){.    *pbNewTer
162c0 6d 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20  m = 0;.    do{. 
162d0 20 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20       int iFirst 
162e0 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
162f0 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20  1].iFirst;.     
16300 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
16310 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
16320 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  g[iFirst];.     
16330 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
16340 30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  0;..      assert
16350 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16360 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67  OK );.      pSeg
16370 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
16380 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
16390 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
163a0 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72  af==0 || bNewTer
163b0 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73  m .       || fts
163c0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
163d0 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46  eRowid(pIter, iF
163e0 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20  irst, &pSeg).   
163f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74     ){.        ft
16400 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
16410 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46  ced(p, pIter, iF
16420 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  irst, 1);.      
16430 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53    fts5MultiIterS
16440 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20  etEof(pIter);.  
16450 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d        *pbNewTerm
16460 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
16470 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75      fts5AssertMu
16480 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20  ltiIterSetup(p, 
16490 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68  pIter);..    }wh
164a0 69 6c 65 28 20 66 74 73 35 4d 75 6c 74 69 49 74  ile( fts5MultiIt
164b0 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74  erIsEmpty(p, pIt
164c0 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  er) );.  }.}..st
164d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
164e0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f  erSetOutputs_Noo
164f0 70 28 46 74 73 35 49 74 65 72 20 2a 70 55 6e 75  p(Fts5Iter *pUnu
16500 73 65 64 31 2c 20 46 74 73 35 53 65 67 49 74 65  sed1, Fts5SegIte
16510 72 20 2a 70 55 6e 75 73 65 64 32 29 7b 0a 20 20  r *pUnused2){.  
16520 55 4e 55 53 45 44 5f 50 41 52 41 4d 32 28 70 55  UNUSED_PARAM2(pU
16530 6e 75 73 65 64 31 2c 20 70 55 6e 75 73 65 64 32  nused1, pUnused2
16540 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73  );.}..static Fts
16550 35 49 74 65 72 20 2a 66 74 73 35 4d 75 6c 74 69  5Iter *fts5Multi
16560 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73  IterAlloc(.  Fts
16570 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16590 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
165a0 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
165b0 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a  /.  int nSeg.){.
165c0 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77    Fts5Iter *pNew
165d0 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20  ;.  int nSlot;  
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20      /* Power of 
16600 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a  two >= nSeg */..
16610 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e    for(nSlot=2; n
16620 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74  Slot<nSeg; nSlot
16630 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e 65  =nSlot*2);.  pNe
16640 77 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f  w = fts5IdxMallo
16650 63 28 70 2c 20 0a 20 20 20 20 20 20 73 69 7a 65  c(p, .      size
16660 6f 66 28 46 74 73 35 49 74 65 72 29 20 2b 20 20  of(Fts5Iter) +  
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20  /* pNew */.     
16690 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49   sizeof(Fts5SegI
166a0 74 65 72 29 20 2a 20 28 6e 53 6c 6f 74 2d 31 29  ter) * (nSlot-1)
166b0 20 2b 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53   +   /* pNew->aS
166c0 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69  eg[] */.      si
166d0 7a 65 6f 66 28 46 74 73 35 43 52 65 73 75 6c 74  zeof(Fts5CResult
166e0 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20  ) * nSlot       
166f0 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73    /* pNew->aFirs
16700 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  t[] */.  );.  if
16710 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e  ( pNew ){.    pN
16720 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74  ew->nSeg = nSlot
16730 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72  ;.    pNew->aFir
16740 73 74 20 3d 20 28 46 74 73 35 43 52 65 73 75 6c  st = (Fts5CResul
16750 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e  t*)&pNew->aSeg[n
16760 53 6c 6f 74 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  Slot];.    pNew-
16770 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20  >pIndex = p;.   
16780 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74 70 75   pNew->xSetOutpu
16790 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74  ts = fts5IterSet
167a0 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 3b 0a 20 20  Outputs_Noop;.  
167b0 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
167c0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
167d0 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62  fts5PoslistCallb
167e0 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
167f0 20 2a 70 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f   *pUnused, .  vo
16800 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20  id *pContext, . 
16810 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e   const u8 *pChun
16820 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b  k, int nChunk.){
16830 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
16840 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65  pUnused);.  asse
16850 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30  rt_nc( nChunk>=0
16860 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b   );.  if( nChunk
16870 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  >0 ){.    fts5Bu
16880 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
16890 6f 62 28 28 46 74 73 35 42 75 66 66 65 72 2a 29  ob((Fts5Buffer*)
168a0 70 43 6f 6e 74 65 78 74 2c 20 70 43 68 75 6e 6b  pContext, pChunk
168b0 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d  , nChunk);.  }.}
168c0 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
168d0 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
168e0 43 74 78 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62  Ctx PoslistCallb
168f0 61 63 6b 43 74 78 3b 0a 73 74 72 75 63 74 20 50  ackCtx;.struct P
16900 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16910 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72  x {.  Fts5Buffer
16920 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20   *pBuf;         
16930 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
16940 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
16950 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
16960 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20  pColset;        
16970 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20      /* Restrict 
16980 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69 73 20  matches to this 
16990 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
169a0 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
169b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
169c0 65 65 20 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a  ee above */.};..
169d0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
169e0 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
169f0 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43   PoslistOffsetsC
16a00 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69  tx;.struct Posli
16a10 73 74 4f 66 66 73 65 74 73 43 74 78 20 7b 0a 20  stOffsetsCtx {. 
16a20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
16a30 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
16a40 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
16a50 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46  is buffer */.  F
16a60 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
16a70 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
16a80 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68  * Restrict match
16a90 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d  es to this colum
16aa0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 61 64  n */.  int iRead
16ab0 3b 0a 20 20 69 6e 74 20 69 57 72 69 74 65 3b 0a  ;.  int iWrite;.
16ac0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  };../*.** TODO: 
16ad0 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72 65 20 65  Make this more e
16ae0 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61  fficient!.*/.sta
16af0 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
16b00 78 43 6f 6c 73 65 74 54 65 73 74 28 46 74 73 35  xColsetTest(Fts5
16b10 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
16b20 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   int iCol){.  in
16b30 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
16b40 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b  i<pColset->nCol;
16b50 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
16b60 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d  Colset->aiCol[i]
16b70 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20  ==iCol ) return 
16b80 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
16b90 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
16ba0 64 20 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66  d fts5PoslistOff
16bb0 73 65 74 73 43 61 6c 6c 62 61 63 6b 28 0a 20 20  setsCallback(.  
16bc0 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73  Fts5Index *pUnus
16bd0 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  ed, .  void *pCo
16be0 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20  ntext, .  const 
16bf0 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20  u8 *pChunk, int 
16c00 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c  nChunk.){.  Posl
16c10 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 2a 70  istOffsetsCtx *p
16c20 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74 4f 66  Ctx = (PoslistOf
16c30 66 73 65 74 73 43 74 78 2a 29 70 43 6f 6e 74 65  fsetsCtx*)pConte
16c40 78 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  xt;.  UNUSED_PAR
16c50 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61  AM(pUnused);.  a
16c60 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b  ssert_nc( nChunk
16c70 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68  >=0 );.  if( nCh
16c80 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  unk>0 ){.    int
16c90 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c   i = 0;.    whil
16ca0 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20  e( i<nChunk ){. 
16cb0 20 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20       int iVal;. 
16cc0 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
16cd0 74 56 61 72 69 6e 74 33 32 28 26 70 43 68 75 6e  tVarint32(&pChun
16ce0 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  k[i], iVal);.   
16cf0 20 20 20 69 56 61 6c 20 2b 3d 20 70 43 74 78 2d     iVal += pCtx-
16d00 3e 69 52 65 61 64 20 2d 20 32 3b 0a 20 20 20 20  >iRead - 2;.    
16d10 20 20 70 43 74 78 2d 3e 69 52 65 61 64 20 3d 20    pCtx->iRead = 
16d20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  iVal;.      if( 
16d30 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
16d40 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
16d50 74 2c 20 69 56 61 6c 29 20 29 7b 0a 20 20 20 20  t, iVal) ){.    
16d60 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
16d70 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
16d80 43 74 78 2d 3e 70 42 75 66 2c 20 69 56 61 6c 20  Ctx->pBuf, iVal 
16d90 2b 20 32 20 2d 20 70 43 74 78 2d 3e 69 57 72 69  + 2 - pCtx->iWri
16da0 74 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 74  te);.        pCt
16db0 78 2d 3e 69 57 72 69 74 65 20 3d 20 69 56 61 6c  x->iWrite = iVal
16dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16dd0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
16de0 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69  id fts5PoslistFi
16df0 6c 74 65 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20  lterCallback(.  
16e00 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73  Fts5Index *pUnus
16e10 65 64 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  ed,.  void *pCon
16e20 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75  text, .  const u
16e30 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e  8 *pChunk, int n
16e40 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69  Chunk.){.  Posli
16e50 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70  stCallbackCtx *p
16e60 43 74 78 20 3d 20 28 50 6f 73 6c 69 73 74 43 61  Ctx = (PoslistCa
16e70 6c 6c 62 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74  llbackCtx*)pCont
16e80 65 78 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ext;.  UNUSED_PA
16e90 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  RAM(pUnused);.  
16ea0 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e  assert_nc( nChun
16eb0 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43  k>=0 );.  if( nC
16ec0 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  hunk>0 ){.    /*
16ed0 20 53 65 61 72 63 68 20 74 68 72 6f 75 67 68 20   Search through 
16ee0 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  to find the firs
16ef0 74 20 76 61 72 69 6e 74 20 77 69 74 68 20 76 61  t varint with va
16f00 6c 75 65 20 31 2e 20 54 68 69 73 20 69 73 20 74  lue 1. This is t
16f10 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20  he.    ** start 
16f20 6f 66 20 74 68 65 20 6e 65 78 74 20 63 6f 6c 75  of the next colu
16f30 6d 6e 73 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20  mns hits. */.   
16f40 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
16f50 69 6e 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a  int iStart = 0;.
16f60 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65  .    if( pCtx->e
16f70 53 74 61 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20  State==2 ){.    
16f80 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
16f90 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
16fa0 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c  int32(pChunk, i,
16fb0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66   iCol);.      if
16fc0 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65  ( fts5IndexColse
16fd0 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c  tTest(pCtx->pCol
16fe0 73 65 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20  set, iCol) ){.  
16ff0 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
17000 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  te = 1;.        
17010 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
17020 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d  pendVarint(pCtx-
17030 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20 20 20 20  >pBuf, 1);.     
17040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17050 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 30  pCtx->eState = 0
17060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17070 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
17080 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
17090 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78  && pChunk[i]!=0x
170a0 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  01 ){.        wh
170b0 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26  ile( pChunk[i] &
170c0 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20   0x80 ) i++;.   
170d0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
170e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78  }.      if( pCtx
170f0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
17100 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
17110 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74  feAppendBlob(pCt
17120 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b  x->pBuf, &pChunk
17130 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61  [iStart], i-iSta
17140 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rt);.      }.   
17150 20 20 20 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20     if( i<nChunk 
17160 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
17170 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 53 74  Col;.        iSt
17180 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  art = i;.       
17190 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   i++;.        if
171a0 28 20 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20  ( i>=nChunk ){. 
171b0 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65           pCtx->e
171c0 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
171d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
171e0 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56      fts5FastGetV
171f0 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20  arint32(pChunk, 
17200 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  i, iCol);.      
17210 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
17220 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73   = fts5IndexCols
17230 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f  etTest(pCtx->pCo
17240 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  lset, iCol);.   
17250 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
17260 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
17270 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
17280 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
17290 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68  pCtx->pBuf, &pCh
172a0 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69  unk[iStart], i-i
172b0 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
172c0 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a      iStart = i;.
172d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
172e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
172f0 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 43 68 75    }while( i<nChu
17300 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  nk );.  }.}..sta
17310 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
17320 6e 6b 49 74 65 72 61 74 65 28 0a 20 20 46 74 73  nkIterate(.  Fts
17330 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17350 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  Index object */.
17360 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
17370 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
17380 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20    /* Poslist of 
17390 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f  this iterator */
173a0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f     /* Context po
173d0 69 6e 74 65 72 20 66 6f 72 20 78 43 68 75 6e 6b  inter for xChunk
173e0 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76   callback */.  v
173f0 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29 28 46 74  oid (*xChunk)(Ft
17400 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c  s5Index*, void*,
17410 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29   const u8*, int)
17420 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d  .){.  int nRem =
17430 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20   pSeg->nPos;    
17440 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17450 6f 66 20 62 79 74 65 73 20 73 74 69 6c 6c 20 74  of bytes still t
17460 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35  o come */.  Fts5
17470 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 30 3b  Data *pData = 0;
17480 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20  .  u8 *pChunk = 
17490 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
174a0 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
174b0 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b  t];.  int nChunk
174c0 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65   = MIN(nRem, pSe
174d0 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  g->pLeaf->szLeaf
174e0 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66   - pSeg->iLeafOf
174f0 66 73 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e  fset);.  int pgn
17500 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50  o = pSeg->iLeafP
17510 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53  gno;.  int pgnoS
17520 61 76 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  ave = 0;..  /* T
17530 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
17540 73 20 6e 6f 74 6d 77 6f 72 6b 20 77 69 74 68 20  s notmwork with 
17550 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 64 61 74 61  detail=none data
17560 62 61 73 65 73 2e 20 2a 2f 0a 20 20 61 73 73 65  bases. */.  asse
17570 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  rt( p->pConfig->
17580 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45  eDetail!=FTS5_DE
17590 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20  TAIL_NONE );..  
175a0 69 66 28 20 28 70 53 65 67 2d 3e 66 6c 61 67 73  if( (pSeg->flags
175b0 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
175c0 52 45 56 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20  REVERSE)==0 ){. 
175d0 20 20 20 70 67 6e 6f 53 61 76 65 20 3d 20 70 67     pgnoSave = pg
175e0 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  no+1;.  }..  whi
175f0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 78 43 68  le( 1 ){.    xCh
17600 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70 43 68  unk(p, pCtx, pCh
17610 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20  unk, nChunk);.  
17620 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b    nRem -= nChunk
17630 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
17640 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20  lease(pData);.  
17650 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b    if( nRem<=0 ){
17660 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17680 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61  gno++;.      pDa
17690 74 61 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61  ta = fts5LeafRea
176a0 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
176b0 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 70 53  T_ROWID(pSeg->pS
176c0 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f  eg->iSegid, pgno
176d0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  ));.      if( pD
176e0 61 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ata==0 ) break;.
176f0 20 20 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 26        pChunk = &
17700 70 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20  pData->p[4];.   
17710 20 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28     nChunk = MIN(
17720 6e 52 65 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c  nRem, pData->szL
17730 65 61 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  eaf - 4);.      
17740 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61  if( pgno==pgnoSa
17750 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ve ){.        as
17760 73 65 72 74 28 20 70 53 65 67 2d 3e 70 4e 65 78  sert( pSeg->pNex
17770 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20  tLeaf==0 );.    
17780 20 20 20 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c      pSeg->pNextL
17790 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  eaf = pData;.   
177a0 20 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a       pData = 0;.
177b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
177c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  }.}../*.** Itera
177d0 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e  tor pIter curren
177e0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  tly points to a 
177f0 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74  valid entry (not
17800 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66   EOF). This.** f
17810 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
17820 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
17830 74 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63  t data for the c
17840 75 72 72 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a  urrent entry to.
17850 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 2e 20  ** buffer pBuf. 
17860 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  It does not make
17870 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
17880 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
17890 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73  e.** field..*/.s
178a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
178b0 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 0a 20  egiterPoslist(. 
178c0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
178d0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
178e0 65 67 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74  eg,.  Fts5Colset
178f0 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73   *pColset,.  Fts
17900 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
17910 0a 20 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75  .  if( 0==fts5Bu
17920 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c  fferGrow(&p->rc,
17930 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f   pBuf, pSeg->nPo
17940 73 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  s) ){.    if( pC
17950 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  olset==0 ){.    
17960 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61    fts5ChunkItera
17970 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69  te(p, pSeg, (voi
17980 64 2a 29 70 42 75 66 2c 20 66 74 73 35 50 6f 73  d*)pBuf, fts5Pos
17990 6c 69 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  listCallback);. 
179a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
179b0 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  if( p->pConfig->
179c0 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
179d0 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  TAIL_FULL ){.   
179e0 20 20 20 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c       PoslistCall
179f0 62 61 63 6b 43 74 78 20 73 43 74 78 3b 0a 20 20  backCtx sCtx;.  
17a00 20 20 20 20 20 20 73 43 74 78 2e 70 42 75 66 20        sCtx.pBuf 
17a10 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20  = pBuf;.        
17a20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70  sCtx.pColset = p
17a30 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Colset;.        
17a40 73 43 74 78 2e 65 53 74 61 74 65 20 3d 20 66 74  sCtx.eState = ft
17a50 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
17a60 74 28 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20  t(pColset, 0);. 
17a70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
17a80 43 74 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c  Ctx.eState==0 ||
17a90 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 31 20   sCtx.eState==1 
17aa0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43  );.        fts5C
17ab0 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70  hunkIterate(p, p
17ac0 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74  Seg, (void*)&sCt
17ad0 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69  x, fts5PoslistFi
17ae0 6c 74 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  lterCallback);. 
17af0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17b00 20 20 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65      PoslistOffse
17b10 74 73 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20  tsCtx sCtx;.    
17b20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78      memset(&sCtx
17b30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78  , 0, sizeof(sCtx
17b40 29 29 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78  ));.        sCtx
17b50 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20  .pBuf = pBuf;.  
17b60 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73        sCtx.pCols
17b70 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20  et = pColset;.  
17b80 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
17b90 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
17ba0 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74  (void*)&sCtx, ft
17bb0 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73  s5PoslistOffsets
17bc0 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Callback);.     
17bd0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
17be0 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72  /*.** IN/OUT par
17bf0 61 6d 65 74 65 72 20 28 2a 70 61 29 20 70 6f 69  ameter (*pa) poi
17c00 6e 74 73 20 74 6f 20 61 20 70 6f 73 69 74 69 6f  nts to a positio
17c10 6e 20 6c 69 73 74 20 6e 20 62 79 74 65 73 20 69  n list n bytes i
17c20 6e 20 73 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68  n size. If.** th
17c30 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
17c40 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
17c50 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c   for column iCol
17c60 2c 20 74 68 65 6e 20 28 2a 70 61 29 20 69 73 20  , then (*pa) is 
17c70 73 65 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20  set.** to point 
17c80 74 6f 20 74 68 65 20 73 75 62 2d 70 6f 73 69 74  to the sub-posit
17c90 69 6f 6e 2d 6c 69 73 74 20 66 6f 72 20 74 68 61  ion-list for tha
17ca0 74 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65  t column and the
17cb0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79   number of.** by
17cc0 74 65 73 20 69 6e 20 69 74 20 72 65 74 75 72 6e  tes in it return
17cd0 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 61  ed. Or, if the a
17ce0 72 67 75 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e  rgument position
17cf0 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a   list does not.*
17d00 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e  * contain any en
17d10 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e  tries for column
17d20 20 69 43 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e   iCol, return 0.
17d30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
17d40 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
17d50 6f 6c 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ol(.  const u8 *
17d60 2a 70 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pa,            
17d70 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
17d80 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c   Pointer to posl
17d90 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ist */.  int n, 
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17db0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20           /* IN: 
17dc0 53 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74 20  Size of poslist 
17dd0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
17de0 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20  t iCol          
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17e00 20 43 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61   Column to extra
17e10 63 74 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20  ct from poslist 
17e20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72  */.){.  int iCur
17e30 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
17e40 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 74 68          /* Anyth
17e50 69 6e 67 20 62 65 66 6f 72 65 20 74 68 65 20 66  ing before the f
17e60 69 72 73 74 20 30 78 30 31 20 69 73 20 63 6f 6c  irst 0x01 is col
17e70 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38   0 */.  const u8
17e80 20 2a 70 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e   *p = *pa;.  con
17e90 73 74 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70  st u8 *pEnd = &p
17ea0 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  [n];         /* 
17eb0 4f 6e 65 20 62 79 74 65 20 70 61 73 74 20 65 6e  One byte past en
17ec0 64 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69  d of position li
17ed0 73 74 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20  st */..  while( 
17ee0 69 43 6f 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b  iCol>iCurrent ){
17ef0 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
17f00 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20  pointer p until 
17f10 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e  it points to pEn
17f20 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74  d or an 0x01 byt
17f30 65 20 74 68 61 74 20 69 73 0a 20 20 20 20 2a 2a  e that is.    **
17f40 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76   not part of a v
17f50 61 72 69 6e 74 2e 20 4e 6f 74 65 20 74 68 61 74  arint. Note that
17f60 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
17f70 62 6c 65 20 66 6f 72 20 61 20 6e 65 67 61 74 69  ble for a negati
17f80 76 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65 78 74  ve.    ** or ext
17f90 72 65 6d 65 6c 79 20 6c 61 72 67 65 20 76 61 72  remely large var
17fa0 69 6e 74 20 74 6f 20 6f 63 63 75 72 20 77 69 74  int to occur wit
17fb0 68 69 6e 20 61 6e 20 75 6e 63 6f 72 72 75 70 74  hin an uncorrupt
17fc0 65 64 20 70 6f 73 69 74 69 6f 6e 20 0a 20 20 20  ed position .   
17fd0 20 2a 2a 20 6c 69 73 74 2e 20 53 6f 20 74 68 65   ** list. So the
17fe0 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65 61   last byte of ea
17ff0 63 68 20 76 61 72 69 6e 74 20 6d 61 79 20 62 65  ch varint may be
18000 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65   assumed to have
18010 20 61 20 63 6c 65 61 72 0a 20 20 20 20 2a 2a 20   a clear.    ** 
18020 30 78 38 30 20 62 69 74 2e 20 20 2a 2f 0a 20 20  0x80 bit.  */.  
18030 20 20 77 68 69 6c 65 28 20 2a 70 21 3d 30 78 30    while( *p!=0x0
18040 31 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  1 ){.      while
18050 28 20 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b  ( *p++ & 0x80 );
18060 0a 20 20 20 20 20 20 69 66 28 20 70 3e 3d 70 45  .      if( p>=pE
18070 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  nd ) return 0;. 
18080 20 20 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70     }.    *pa = p
18090 2b 2b 3b 0a 20 20 20 20 69 43 75 72 72 65 6e 74  ++;.    iCurrent
180a0 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 69 66 28   = *p++;.    if(
180b0 20 69 43 75 72 72 65 6e 74 20 26 20 30 78 38 30   iCurrent & 0x80
180c0 20 29 7b 0a 20 20 20 20 20 20 70 2d 2d 3b 0a 20   ){.      p--;. 
180d0 20 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65       p += fts5Ge
180e0 74 56 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75  tVarint32(p, iCu
180f0 72 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rrent);.    }.  
18100 7d 0a 20 20 69 66 28 20 69 43 6f 6c 21 3d 69 43  }.  if( iCol!=iC
18110 75 72 72 65 6e 74 20 29 20 72 65 74 75 72 6e 20  urrent ) return 
18120 30 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  0;..  /* Advance
18130 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c   pointer p until
18140 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45   it points to pE
18150 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79  nd or an 0x01 by
18160 74 65 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  te that is.  ** 
18170 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76 61  not part of a va
18180 72 69 6e 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28  rint */.  while(
18190 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 21 3d 30   p<pEnd && *p!=0
181a0 78 30 31 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  x01 ){.    while
181b0 28 20 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b  ( *p++ & 0x80 );
181c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
181d0 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61   - (*pa);.}..sta
181e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
181f0 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28  exExtractColset(
18200 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46  .  int *pRc,.  F
18210 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
18220 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  et,            /
18230 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74  * Colset to filt
18240 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  er on */.  const
18250 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e   u8 *pPos, int n
18260 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f  Pos,       /* Po
18270 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
18280 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
18290 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
182a0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
182b0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70  r */.){.  if( *p
182c0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
182d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
182e0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70  fts5BufferZero(p
182f0 42 75 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Buf);.    for(i=
18300 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43  0; i<pColset->nC
18310 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
18320 63 6f 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d  const u8 *pSub =
18330 20 70 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74   pPos;.      int
18340 20 6e 53 75 62 20 3d 20 66 74 73 35 49 6e 64 65   nSub = fts5Inde
18350 78 45 78 74 72 61 63 74 43 6f 6c 28 26 70 53 75  xExtractCol(&pSu
18360 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74  b, nPos, pColset
18370 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  ->aiCol[i]);.   
18380 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b 0a 20     if( nSub ){. 
18390 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
183a0 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c  rAppendBlob(pRc,
183b0 20 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75   pBuf, nSub, pSu
183c0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
183d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  }.  }.}../*.** x
183e0 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
183f0 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
18400 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a  il=none tables..
18410 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18420 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18430 73 5f 4e 6f 6e 65 28 46 74 73 35 49 74 65 72 20  s_None(Fts5Iter 
18440 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
18450 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 61 73  ter *pSeg){.  as
18460 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
18470 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  dex->pConfig->eD
18480 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
18490 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74  IL_NONE );.  pIt
184a0 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
184b0 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
184c0 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
184d0 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  ata = pSeg->nPos
184e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f  ;.}../*.** xSetO
184f0 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20  utputs callback 
18500 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66  used by detail=f
18510 75 6c 6c 20 61 6e 64 20 64 65 74 61 69 6c 3d 63  ull and detail=c
18520 6f 6c 20 74 61 62 6c 65 73 20 77 68 65 6e 20 6e  ol tables when n
18530 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74  o.** column filt
18540 65 72 73 20 61 72 65 20 73 70 65 63 69 66 69 65  ers are specifie
18550 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
18560 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
18570 70 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74  puts_Nocolset(Ft
18580 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  s5Iter *pIter, F
18590 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
185a0 29 7b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  ){.  pIter->base
185b0 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
185c0 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d  iRowid;.  pIter-
185d0 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53  >base.nData = pS
185e0 65 67 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73  eg->nPos;..  ass
185f0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
18600 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  ex->pConfig->eDe
18610 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
18620 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  L_NONE );.  asse
18630 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73  rt( pIter->pCols
18640 65 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  et==0 );..  if( 
18650 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
18660 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53  t+pSeg->nPos<=pS
18670 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  eg->pLeaf->szLea
18680 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  f ){.    /* All 
18690 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f  data is stored o
186a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
186b0 67 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ge. Populate the
186c0 20 6f 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20   output .    ** 
186d0 76 61 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69  variables to poi
186e0 6e 74 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  nt into the body
186f0 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a   of the page obj
18700 65 63 74 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65  ect. */.    pIte
18710 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
18720 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
18730 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
18740 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
18750 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20   /* The data is 
18760 64 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72  distributed over
18770 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67   two or more pag
18780 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f  es. Copy it into
18790 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35   the.    ** Fts5
187a0 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66  Iter.poslist buf
187b0 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74  fer and then set
187c0 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e   the output poin
187d0 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20  ter to point.   
187e0 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66   ** to this buff
187f0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35  er.  */.    fts5
18800 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
18810 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
18820 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
18830 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
18840 78 2c 20 70 53 65 67 2c 20 30 2c 20 26 70 49 74  x, pSeg, 0, &pIt
18850 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
18860 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
18870 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
18880 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  list.p;.  }.}../
18890 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73  *.** xSetOutputs
188a0 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77   callback used w
188b0 68 65 6e 20 74 68 65 20 46 74 73 35 43 6f 6c 73  hen the Fts5Cols
188c0 65 74 20 6f 62 6a 65 63 74 20 68 61 73 20 6e 43  et object has nC
188d0 6f 6c 3d 3d 30 20 28 6d 61 74 63 68 0a 2a 2a 20  ol==0 (match.** 
188e0 61 67 61 69 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d  against no colum
188f0 6e 73 20 61 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73  ns at all)..*/.s
18900 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
18910 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 5a 65  terSetOutputs_Ze
18920 72 6f 43 6f 6c 73 65 74 28 46 74 73 35 49 74 65  roColset(Fts5Ite
18930 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65  r *pIter, Fts5Se
18940 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20  gIter *pSeg){.  
18950 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 53 65  UNUSED_PARAM(pSe
18960 67 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  g);.  pIter->bas
18970 65 2e 6e 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a  e.nData = 0;.}..
18980 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74  /*.** xSetOutput
18990 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  s callback used 
189a0 62 79 20 64 65 74 61 69 6c 3d 63 6f 6c 20 77 68  by detail=col wh
189b0 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  en there is a co
189c0 6c 75 6d 6e 20 66 69 6c 74 65 72 0a 2a 2a 20 61  lumn filter.** a
189d0 6e 64 20 74 68 65 72 65 20 61 72 65 20 31 30 30  nd there are 100
189e0 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73   or more columns
189f0 2e 20 41 6c 73 6f 20 63 61 6c 6c 65 64 20 61 73  . Also called as
18a00 20 61 20 66 61 6c 6c 62 61 63 6b 20 66 72 6f 6d   a fallback from
18a10 0a 2a 2a 20 66 74 73 35 49 74 65 72 53 65 74 4f  .** fts5IterSetO
18a20 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 20 69 66  utputs_Col100 if
18a30 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74   the column-list
18a40 20 73 70 61 6e 73 20 6d 6f 72 65 20 74 68 61 6e   spans more than
18a50 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   one page..*/.st
18a60 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
18a70 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c  erSetOutputs_Col
18a80 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
18a90 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
18aa0 53 65 67 29 7b 0a 20 20 66 74 73 35 42 75 66 66  Seg){.  fts5Buff
18ab0 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
18ac0 6f 73 6c 69 73 74 29 3b 0a 20 20 66 74 73 35 53  oslist);.  fts5S
18ad0 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49  egiterPoslist(pI
18ae0 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65  ter->pIndex, pSe
18af0 67 2c 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65  g, pIter->pColse
18b00 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  t, &pIter->posli
18b10 73 74 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  st);.  pIter->ba
18b20 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67  se.iRowid = pSeg
18b30 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65  ->iRowid;.  pIte
18b40 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
18b50 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
18b60 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
18b70 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  nData = pIter->p
18b80 6f 73 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a  oslist.n;.}../*.
18b90 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
18ba0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65  allback used whe
18bb0 6e 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65  n: .**.**   * de
18bc0 74 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a  tail=col,.**   *
18bd0 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75   there is a colu
18be0 6d 6e 20 66 69 6c 74 65 72 2c 20 61 6e 64 0a 2a  mn filter, and.*
18bf0 2a 20 20 20 2a 20 74 68 65 20 74 61 62 6c 65 20  *   * the table 
18c00 63 6f 6e 74 61 69 6e 73 20 31 30 30 20 6f 72 20  contains 100 or 
18c10 66 65 77 65 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a  fewer columns. .
18c20 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 70  **.** The last p
18c30 6f 69 6e 74 20 69 73 20 74 6f 20 65 6e 73 75 72  oint is to ensur
18c40 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d  e all column num
18c50 62 65 72 73 20 61 72 65 20 73 74 6f 72 65 64 20  bers are stored 
18c60 61 73 20 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79  as .** single-by
18c70 74 65 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73  te varints..*/.s
18c80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
18c90 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
18ca0 6c 31 30 30 28 46 74 73 35 49 74 65 72 20 2a 70  l100(Fts5Iter *p
18cb0 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
18cc0 72 20 2a 70 53 65 67 29 7b 0a 0a 20 20 61 73 73  r *pSeg){..  ass
18cd0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
18ce0 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  ex->pConfig->eDe
18cf0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
18d00 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 61  L_COLUMNS );.  a
18d10 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43  ssert( pIter->pC
18d20 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20  olset );..  if( 
18d30 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
18d40 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3e 70 53 65  t+pSeg->nPos>pSe
18d50 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  g->pLeaf->szLeaf
18d60 20 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72   ){.    fts5Iter
18d70 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 70  SetOutputs_Col(p
18d80 49 74 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 7d  Iter, pSeg);.  }
18d90 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20  else{.    u8 *a 
18da0 3d 20 28 75 38 2a 29 26 70 53 65 67 2d 3e 70 4c  = (u8*)&pSeg->pL
18db0 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65  eaf->p[pSeg->iLe
18dc0 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 75  afOffset];.    u
18dd0 38 20 2a 70 45 6e 64 20 3d 20 28 75 38 2a 29 26  8 *pEnd = (u8*)&
18de0 61 5b 70 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a  a[pSeg->nPos]; .
18df0 20 20 20 20 69 6e 74 20 69 50 72 65 76 20 3d 20      int iPrev = 
18e00 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f  0;.    int *aiCo
18e10 6c 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73  l = pIter->pCols
18e20 65 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69  et->aiCol;.    i
18e30 6e 74 20 2a 61 69 43 6f 6c 45 6e 64 20 3d 20 26  nt *aiColEnd = &
18e40 61 69 43 6f 6c 5b 70 49 74 65 72 2d 3e 70 43 6f  aiCol[pIter->pCo
18e50 6c 73 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20  lset->nCol];..  
18e60 20 20 75 38 20 2a 61 4f 75 74 20 3d 20 70 49 74    u8 *aOut = pIt
18e70 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
18e80 20 20 20 69 6e 74 20 69 50 72 65 76 4f 75 74 20     int iPrevOut 
18e90 3d 20 30 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d  = 0;..    pIter-
18ea0 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
18eb0 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20  Seg->iRowid;..  
18ec0 20 20 77 68 69 6c 65 28 20 61 3c 70 45 6e 64 20    while( a<pEnd 
18ed0 29 7b 0a 20 20 20 20 20 20 69 50 72 65 76 20 2b  ){.      iPrev +
18ee0 3d 20 28 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20  = (int)a++[0] - 
18ef0 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
18f00 2a 61 69 43 6f 6c 3c 69 50 72 65 76 20 29 7b 0a  *aiCol<iPrev ){.
18f10 20 20 20 20 20 20 20 20 61 69 43 6f 6c 2b 2b 3b          aiCol++;
18f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 69 43  .        if( aiC
18f30 6f 6c 3d 3d 61 69 43 6f 6c 45 6e 64 20 29 20 67  ol==aiColEnd ) g
18f40 6f 74 6f 20 73 65 74 6f 75 74 70 75 74 73 5f 63  oto setoutputs_c
18f50 6f 6c 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ol_out;.      }.
18f60 20 20 20 20 20 20 69 66 28 20 2a 61 69 43 6f 6c        if( *aiCol
18f70 3d 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ==iPrev ){.     
18f80 20 20 20 2a 61 4f 75 74 2b 2b 20 3d 20 28 75 38     *aOut++ = (u8
18f90 29 28 28 69 50 72 65 76 20 2d 20 69 50 72 65 76  )((iPrev - iPrev
18fa0 4f 75 74 29 20 2b 20 32 29 3b 0a 20 20 20 20 20  Out) + 2);.     
18fb0 20 20 20 69 50 72 65 76 4f 75 74 20 3d 20 69 50     iPrevOut = iP
18fc0 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
18fd0 20 7d 0a 0a 73 65 74 6f 75 74 70 75 74 73 5f 63   }..setoutputs_c
18fe0 6f 6c 5f 6f 75 74 3a 0a 20 20 20 20 70 49 74 65  ol_out:.    pIte
18ff0 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
19000 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
19010 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ;.    pIter->bas
19020 65 2e 6e 44 61 74 61 20 3d 20 61 4f 75 74 20 2d  e.nData = aOut -
19030 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
19040 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
19050 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c  xSetOutputs call
19060 62 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74  back used by det
19070 61 69 6c 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68  ail=full when th
19080 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ere is a column 
19090 66 69 6c 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  filter..*/.stati
190a0 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
190b0 65 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 28 46  etOutputs_Full(F
190c0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
190d0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
190e0 67 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74  g){.  Fts5Colset
190f0 20 2a 70 43 6f 6c 73 65 74 20 3d 20 70 49 74 65   *pColset = pIte
19100 72 2d 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49  r->pColset;.  pI
19110 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64  ter->base.iRowid
19120 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
19130 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
19140 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66  r->pIndex->pConf
19150 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
19160 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b  5_DETAIL_FULL );
19170 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 73  .  assert( pCols
19180 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65  et );..  if( pSe
19190 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
191a0 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d  Seg->nPos<=pSeg-
191b0 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
191c0 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74  {.    /* All dat
191d0 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74  a is stored on t
191e0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
191f0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75   Populate the ou
19200 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72  tput .    ** var
19210 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20  iables to point 
19220 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
19230 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
19240 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75  . */.    const u
19250 38 20 2a 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c  8 *a = &pSeg->pL
19260 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65  eaf->p[pSeg->iLe
19270 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69  afOffset];.    i
19280 66 28 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c  f( pColset->nCol
19290 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ==1 ){.      pIt
192a0 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
192b0 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
192c0 74 43 6f 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e  tCol(&a, pSeg->n
192d0 50 6f 73 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43  Pos,pColset->aiC
192e0 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 49  ol[0]);.      pI
192f0 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20  ter->base.pData 
19300 3d 20 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = a;.    }else{.
19310 20 20 20 20 20 20 69 6e 74 20 2a 70 52 63 20 3d        int *pRc =
19320 20 26 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d   &pIter->pIndex-
19330 3e 72 63 3b 0a 20 20 20 20 20 20 66 74 73 35 42  >rc;.      fts5B
19340 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
19350 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
19360 20 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61    fts5IndexExtra
19370 63 74 43 6f 6c 73 65 74 28 70 52 63 2c 20 70 43  ctColset(pRc, pC
19380 6f 6c 73 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e  olset, a, pSeg->
19390 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f  nPos, &pIter->po
193a0 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 49  slist);.      pI
193b0 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20  ter->base.pData 
193c0 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
193d0 2e 70 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  .p;.      pIter-
193e0 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49  >base.nData = pI
193f0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a  ter->poslist.n;.
19400 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
19410 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69     /* The data i
19420 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f 76  s distributed ov
19430 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70  er two or more p
19440 61 67 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e  ages. Copy it in
19450 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74  to the.    ** Ft
19460 73 35 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62  s5Iter.poslist b
19470 75 66 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73  uffer and then s
19480 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f  et the output po
19490 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20  inter to point. 
194a0 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75     ** to this bu
194b0 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74  ffer.  */.    ft
194c0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49  s5BufferZero(&pI
194d0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
194e0 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f     fts5SegiterPo
194f0 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e  slist(pIter->pIn
19500 64 65 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73  dex, pSeg, pCols
19510 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c  et, &pIter->posl
19520 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  ist);.    pIter-
19530 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
19540 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
19550 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
19560 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  nData = pIter->p
19570 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a  oslist.n;.  }.}.
19580 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19590 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62  5IterSetOutputCb
195a0 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 49  (int *pRc, Fts5I
195b0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
195c0 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
195d0 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  OK ){.    Fts5Co
195e0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
195f0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
19600 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69 66 28 20  Config;.    if( 
19610 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
19620 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
19630 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  NE ){.      pIte
19640 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
19650 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
19660 75 74 73 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a  uts_None;.    }.
19670 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 49  .    else if( pI
19680 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20  ter->pColset==0 
19690 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
196a0 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
196b0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
196c0 5f 4e 6f 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d  _Nocolset;.    }
196d0 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  ..    else if( p
196e0 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e  Iter->pColset->n
196f0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
19700 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75  pIter->xSetOutpu
19710 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74  ts = fts5IterSet
19720 4f 75 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73  Outputs_ZeroCols
19730 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65  et;.    }..    e
19740 6c 73 65 20 69 66 28 20 70 43 6f 6e 66 69 67 2d  lse if( pConfig-
19750 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
19760 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20  ETAIL_FULL ){.  
19770 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f      pIter->xSetO
19780 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
19790 72 53 65 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c  rSetOutputs_Full
197a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73  ;.    }..    els
197b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
197c0 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69   pConfig->eDetai
197d0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43  l==FTS5_DETAIL_C
197e0 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 20 20 20 20  OLUMNS );.      
197f0 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  if( pConfig->nCo
19800 6c 3c 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20  l<=100 ){.      
19810 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74    pIter->xSetOut
19820 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
19830 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30  etOutputs_Col100
19840 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19850 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
19860 70 52 63 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  pRc, &pIter->pos
19870 6c 69 73 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e  list, pConfig->n
19880 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Col);.      }els
19890 65 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  e{.        pIter
198a0 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
198b0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
198c0 74 73 5f 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  ts_Col;.      }.
198d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
198e0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
198f0 65 77 20 46 74 73 35 49 74 65 72 20 6f 62 6a 65  ew Fts5Iter obje
19900 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ct..**.** The ne
19910 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  w object will be
19920 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
19930 20 74 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e   through data in
19940 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
19950 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c  ct..** If iLevel
19960 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c   is -ve, then al
19970 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65  l data in all se
19980 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64  gments is merged
19990 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a  . Or, if iLevel.
199a0 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72  ** is zero or gr
199b0 65 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d  eater, data from
199c0 20 74 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d   the first nSegm
199d0 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20  ent segments on 
199e0 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20  level iLevel.** 
199f0 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a  is merged..**.**
19a00 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e   The iterator in
19a10 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  itially points t
19a20 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  o the first term
19a30 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20  /rowid entry in 
19a40 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64  the .** iterated
19a50 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
19a60 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
19a70 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e  terNew(.  Fts5In
19a80 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
19a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
19aa0 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
19ab0 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
19ac0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
19ad0 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20  pStruct,        
19ae0 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66   /* Structure of
19af0 20 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20   specific index 
19b00 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 20 20 20 20 2f 2a 20 46 54 53 35 49 4e 44 45       /* FTS5INDE
19b30 58 5f 51 55 45 52 59 5f 58 58 58 20 66 6c 61 67  X_QUERY_XXX flag
19b40 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65  s */.  Fts5Colse
19b50 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20  t *pColset,     
19b60 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74         /* Colset
19b70 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 28 6f   to filter on (o
19b80 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e  r NULL) */.  con
19b90 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
19ba0 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
19bb0 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
19bc0 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20  (or NULL/0) */. 
19bd0 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bf0 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65   /* Level to ite
19c00 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c  rate (-1 for all
19c10 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  ) */.  int nSegm
19c20 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
19c30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19c40 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
19c50 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30  merge (iLevel>=0
19c60 29 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20  ) */.  Fts5Iter 
19c70 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20  **ppOut         
19c80 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
19c90 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
19ca0 20 6e 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20   nSeg = 0;      
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19cc0 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
19cd0 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a  t-iters in use *
19ce0 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20  /.  int iIter = 
19cf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19d00 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20      /* */.  int 
19d10 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
19d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
19d30 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
19d40 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
19d50 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
19d60 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
19d70 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b   Fts5Iter *pNew;
19d80 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  ..  assert( (pTe
19d90 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d  rm==0 && nTerm==
19da0 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29  0) || iLevel<0 )
19db0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
19dc0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
19dd0 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65  ew multi-seg-ite
19de0 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20  rator. */.  if( 
19df0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19e00 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76   ){.    if( iLev
19e10 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73  el<0 ){.      as
19e20 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
19e30 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72  Segment==fts5Str
19e40 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
19e50 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a  nts(pStruct) );.
19e60 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74        nSeg = pSt
19e70 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a  ruct->nSegment;.
19e80 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70        nSeg += (p
19e90 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29  ->pHash ? 1 : 0)
19ea0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19eb0 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53     nSeg = MIN(pS
19ec0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
19ed0 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67  evel].nSeg, nSeg
19ee0 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ment);.    }.  }
19ef0 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77  .  *ppOut = pNew
19f00 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
19f10 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a  Alloc(p, nSeg);.
19f20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
19f30 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e  return;.  pNew->
19f40 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67  bRev = (0!=(flag
19f50 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
19f60 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e  ERY_DESC));.  pN
19f70 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d  ew->bSkipEmpty =
19f80 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54   (0!=(flags & FT
19f90 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b  S5INDEX_QUERY_SK
19fa0 49 50 45 4d 50 54 59 29 29 3b 0a 20 20 70 4e 65  IPEMPTY));.  pNe
19fb0 77 2d 3e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f  w->pColset = pCo
19fc0 6c 73 65 74 3b 0a 20 20 69 66 28 20 28 66 6c 61  lset;.  if( (fla
19fd0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
19fe0 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 29 3d 3d  UERY_NOOUTPUT)==
19ff0 30 20 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65  0 ){.    fts5Ite
1a000 72 53 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d  rSetOutputCb(&p-
1a010 3e 72 63 2c 20 70 4e 65 77 29 3b 0a 20 20 7d 0a  >rc, pNew);.  }.
1a020 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1a030 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d   each of the com
1a040 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69  ponent segment i
1a050 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69  terators. */.  i
1a060 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a070 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69  _OK ){.    if( i
1a080 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20  Level<0 ){.     
1a090 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
1a0a0 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74  vel *pEnd = &pSt
1a0b0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  ruct->aLevel[pSt
1a0c0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
1a0d0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73       if( p->pHas
1a0e0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  h ){.        /* 
1a0f0 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74  Add a segment it
1a100 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63  erator for the c
1a110 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
1a120 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  of the hash tabl
1a130 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 46 74  e. */.        Ft
1a140 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
1a150 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
1a160 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  Iter++];.       
1a170 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68   fts5SegIterHash
1a180 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e  Init(p, pTerm, n
1a190 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74  Term, flags, pIt
1a1a0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
1a1b0 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74     for(pLvl=&pSt
1a1c0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b  ruct->aLevel[0];
1a1d0 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c   pLvl<pEnd; pLvl
1a1e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
1a1f0 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67  (iSeg=pLvl->nSeg
1a200 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65  -1; iSeg>=0; iSe
1a210 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g--){.          
1a220 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1a230 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
1a240 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
1a250 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53 65            Fts5Se
1a260 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26  gIter *pIter = &
1a270 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72  pNew->aSeg[iIter
1a280 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ++];.          i
1a290 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
1a2a0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
1a2b0 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53  egIterInit(p, pS
1a2c0 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
1a2d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a2e0 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
1a2f0 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20  IterSeekInit(p, 
1a300 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c  pTerm, nTerm, fl
1a310 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72  ags, pSeg, pIter
1a320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1a330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a350 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
1a360 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
1a370 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ];.      for(iSe
1a380 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  g=nSeg-1; iSeg>=
1a390 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
1a3a0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
1a3b0 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53  nit(p, &pLvl->aS
1a3c0 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d  eg[iSeg], &pNew-
1a3d0 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b  >aSeg[iIter++]);
1a3e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a3f0 20 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72     assert( iIter
1a400 3d 3d 6e 53 65 67 20 29 3b 0a 20 20 7d 0a 0a 20  ==nSeg );.  }.. 
1a410 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
1a420 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
1a430 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1a440 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f  iterators now po
1a450 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68  ints .  ** to th
1a460 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
1a470 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e   its segment. In
1a480 20 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69   this case initi
1a490 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20  alize the .  ** 
1a4a0 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20  aFirst[] array. 
1a4b0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1a4c0 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72  has occurred, fr
1a4d0 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  ee the iterator.
1a4e0 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20    ** object and 
1a4f0 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  set the output v
1a500 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e  ariable to NULL.
1a510 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
1a520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a530 20 20 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65     for(iIter=pNe
1a540 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72  w->nSeg-1; iIter
1a550 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20  >0; iIter--){.  
1a560 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20      int iEq;.   
1a570 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
1a580 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
1a590 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72  pare(pNew, iIter
1a5a0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74  )) ){.        Ft
1a5b0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
1a5c0 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45  = &pNew->aSeg[iE
1a5d0 71 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  q];.        if( 
1a5e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a5f0 20 29 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70   ) pSeg->xNext(p
1a600 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20  , pSeg, 0);.    
1a610 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1a620 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65  rAdvanced(p, pNe
1a630 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a  w, iEq, iIter);.
1a640 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a650 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53    fts5MultiIterS
1a660 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20  etEof(pNew);.   
1a670 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
1a680 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65  IterSetup(p, pNe
1a690 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  w);..    if( pNe
1a6a0 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26  w->bSkipEmpty &&
1a6b0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
1a6c0 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29  Empty(p, pNew) )
1a6d0 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  {.      fts5Mult
1a6e0 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65  iIterNext(p, pNe
1a6f0 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  w, 0, 0);.    }e
1a700 6c 73 65 20 69 66 28 20 70 4e 65 77 2d 3e 62 61  lse if( pNew->ba
1a710 73 65 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  se.bEof==0 ){.  
1a720 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1a730 2a 70 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61  *pSeg = &pNew->a
1a740 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69 72 73 74  Seg[pNew->aFirst
1a750 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20  [1].iFirst];.   
1a760 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74     pNew->xSetOut
1a770 70 75 74 73 28 70 4e 65 77 2c 20 70 53 65 67 29  puts(pNew, pSeg)
1a780 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
1a790 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  {.    fts5MultiI
1a7a0 74 65 72 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  terFree(pNew);. 
1a7b0 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20     *ppOut = 0;. 
1a7c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
1a7d0 74 65 20 61 6e 20 46 74 73 35 49 74 65 72 20 74  te an Fts5Iter t
1a7e0 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68 72  hat iterates thr
1a7f0 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74  ough the doclist
1a800 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20   provided.** as 
1a810 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1a820 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
1a830 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
1a840 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64  rNew2(.  Fts5Ind
1a850 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1a860 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1a870 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
1a880 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
1a890 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c  Fts5Data *pData,
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8b0 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74  /* Doclist to it
1a8c0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
1a8d0 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20  .  int bDesc,   
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8f0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64     /* True for d
1a900 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
1a910 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49  order */.  Fts5I
1a920 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
1a930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1a940 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  w object */.){. 
1a950 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b   Fts5Iter *pNew;
1a960 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75  .  pNew = fts5Mu
1a970 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20  ltiIterAlloc(p, 
1a980 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  2);.  if( pNew )
1a990 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1a9a0 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77  r *pIter = &pNew
1a9b0 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20  ->aSeg[1];..    
1a9c0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46  pIter->flags = F
1a9d0 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
1a9e0 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61  ERM;.    if( pDa
1a9f0 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a  ta->szLeaf>0 ){.
1aa00 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
1aa10 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  af = pData;.    
1aa20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
1aa30 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
1aa40 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28  rint(pData->p, (
1aa50 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
1aa60 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65  wid);.      pIte
1aa70 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
1aa80 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20   = pData->nn;.  
1aa90 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
1aaa0 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a  [1].iFirst = 1;.
1aab0 20 20 20 20 20 20 69 66 28 20 62 44 65 73 63 20        if( bDesc 
1aac0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
1aad0 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20  >bRev = 1;.     
1aae0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
1aaf0 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
1ab00 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20  REVERSE;.       
1ab10 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
1ab20 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
1ab30 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
1ab40 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
1ab50 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
1ab60 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
1ab70 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d   }.      pData =
1ab80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ab90 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e       pNew->base.
1aba0 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
1abb0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53      fts5SegIterS
1abc0 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
1abd0 3b 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  ;..    *ppOut = 
1abe0 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  pNew;.  }..  fts
1abf0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
1ac00 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ta);.}../*.** Re
1ac10 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1ac20 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20   iterator is at 
1ac30 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72  EOF or if an err
1ac40 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
1ac50 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72   .** False other
1ac60 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1ac70 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
1ac80 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
1ac90 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  p, Fts5Iter *pIt
1aca0 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
1acb0 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28  ->rc .      || (
1acc0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
1acd0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
1ace0 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29  irst ].pLeaf==0)
1acf0 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45  ==pIter->base.bE
1ad00 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  of .  );.  retur
1ad10 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65  n (p->rc || pIte
1ad20 72 2d 3e 62 61 73 65 2e 62 45 6f 66 29 3b 0a 7d  r->base.bEof);.}
1ad30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ad40 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
1ad50 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69  entry that the i
1ad60 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c  terator currentl
1ad70 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20  y points.** to. 
1ad80 49 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  If the iterator 
1ad90 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68  points to EOF wh
1ada0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1adb0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a   is called the.*
1adc0 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  * results are un
1add0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
1ade0 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69  ic i64 fts5Multi
1adf0 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 74  IterRowid(Fts5It
1ae00 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
1ae10 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65  sert( pIter->aSe
1ae20 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1ae30 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65  [1].iFirst ].pLe
1ae40 61 66 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  af );.  return p
1ae50 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1ae60 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1ae70 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a  rst ].iRowid;.}.
1ae80 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1ae90 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
1aea0 6e 65 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72  next entry at or
1aeb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63   following iMatc
1aec0 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
1aed0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
1aee0 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49  extFrom(.  Fts5I
1aef0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1af00 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
1af10 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20  i64 iMatch.){.  
1af20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
1af30 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
1af40 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
1af50 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69  t(p, pIter, 1, i
1af60 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20  Match);.    if( 
1af70 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1af80 28 70 2c 20 70 49 74 65 72 29 20 29 20 62 72 65  (p, pIter) ) bre
1af90 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d  ak;.    iRowid =
1afa0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
1afb0 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20  wid(pIter);.    
1afc0 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d  if( pIter->bRev=
1afd0 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d  =0 && iRowid>=iM
1afe0 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
1aff0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65    if( pIter->bRe
1b000 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d  v!=0 && iRowid<=
1b010 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
1b020 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1b030 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1b040 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1b050 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73  ning the term as
1b060 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1b070 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74  e .** entry that
1b080 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75   the iterator cu
1b090 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1b0a0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  o..*/.static con
1b0b0 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69  st u8 *fts5Multi
1b0c0 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 74 65  IterTerm(Fts5Ite
1b0d0 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70  r *pIter, int *p
1b0e0 6e 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  n){.  Fts5SegIte
1b0f0 72 20 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61  r *p = &pIter->a
1b100 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1b110 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
1b120 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e    *pn = p->term.
1b130 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74  n;.  return p->t
1b140 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erm.p;.}../*.** 
1b150 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
1b160 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68  egment-id for th
1b170 65 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  e structure pStr
1b180 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67  uct. The new seg
1b190 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20  ment.** id must 
1b1a0 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
1b1b0 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69 76 65   65335 inclusive
1b1c0 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62  , and must not b
1b1d0 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e  e used by .** an
1b1e0 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  y currently exis
1b1f0 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49 66  ting segment. If
1b200 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e 74 20   a free segment 
1b210 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  id cannot be fou
1b220 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  nd,.** SQLITE_FU
1b230 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1b240 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1b250 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
1b260 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
1b270 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1b280 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  . 0 is .** retur
1b290 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
1b2a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b2b0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
1b2c0 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
1b2d0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1b2e0 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69  Struct){.  int i
1b2f0 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66  Segid = 0;..  if
1b300 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b310 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  OK ){.    if( pS
1b320 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e  truct->nSegment>
1b330 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e  =FTS5_MAX_SEGMEN
1b340 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  T ){.      p->rc
1b350 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
1b360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b370 20 2f 2a 20 46 54 53 35 5f 4d 41 58 5f 53 45 47   /* FTS5_MAX_SEG
1b380 4d 45 4e 54 20 69 73 20 63 75 72 72 65 6e 74 6c  MENT is currentl
1b390 79 20 64 65 66 69 6e 65 64 20 61 73 20 32 30 30  y defined as 200
1b3a0 30 2e 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  0. So the follow
1b3b0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 72 72  ing.      ** arr
1b3c0 61 79 20 69 73 20 36 33 20 65 6c 65 6d 65 6e 74  ay is 63 element
1b3d0 73 2c 20 6f 72 20 32 35 32 20 62 79 74 65 73 2c  s, or 252 bytes,
1b3e0 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20   in size.  */.  
1b3f0 20 20 20 20 75 33 32 20 61 55 73 65 64 5b 28 46      u32 aUsed[(F
1b400 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 2b  TS5_MAX_SEGMENT+
1b410 33 31 29 20 2f 20 33 32 5d 3b 0a 20 20 20 20 20  31) / 32];.     
1b420 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
1b430 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1b440 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20      u32 mask;.  
1b450 20 20 20 20 6d 65 6d 73 65 74 28 61 55 73 65 64      memset(aUsed
1b460 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 55 73 65  , 0, sizeof(aUse
1b470 64 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  d));.      for(i
1b480 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
1b490 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
1b4a0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l++){.        fo
1b4b0 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
1b4c0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1b4d0 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
1b4e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  +){.          in
1b4f0 74 20 69 49 64 20 3d 20 70 53 74 72 75 63 74 2d  t iId = pStruct-
1b500 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
1b510 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 3b  eg[iSeg].iSegid;
1b520 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
1b530 49 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47  Id<=FTS5_MAX_SEG
1b540 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  MENT ){.        
1b550 20 20 20 20 61 55 73 65 64 5b 28 69 49 64 2d 31      aUsed[(iId-1
1b560 29 20 2f 20 33 32 5d 20 7c 3d 20 28 75 33 32 29  ) / 32] |= (u32)
1b570 31 20 3c 3c 20 28 28 69 49 64 2d 31 29 20 25 20  1 << ((iId-1) % 
1b580 33 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  32);.          }
1b590 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b5a0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
1b5b0 30 3b 20 61 55 73 65 64 5b 69 5d 3d 3d 30 78 46  0; aUsed[i]==0xF
1b5c0 46 46 46 46 46 46 46 3b 20 69 2b 2b 29 3b 0a 20  FFFFFFF; i++);. 
1b5d0 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 55 73 65       mask = aUse
1b5e0 64 5b 69 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28  d[i];.      for(
1b5f0 69 53 65 67 69 64 3d 30 3b 20 6d 61 73 6b 20 26  iSegid=0; mask &
1b600 20 28 28 75 33 32 29 31 20 3c 3c 20 69 53 65 67   ((u32)1 << iSeg
1b610 69 64 29 3b 20 69 53 65 67 69 64 2b 2b 29 3b 0a  id); iSegid++);.
1b620 20 20 20 20 20 20 69 53 65 67 69 64 20 2b 3d 20        iSegid += 
1b630 31 20 2b 20 69 2a 33 32 3b 0a 0a 23 69 66 64 65  1 + i*32;..#ifde
1b640 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1b650 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
1b660 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1b670 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1b680 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
1b690 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
1b6a0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
1b6b0 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
1b6c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
1b6d0 63 28 20 69 53 65 67 69 64 21 3d 70 53 74 72 75  c( iSegid!=pStru
1b6e0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1b6f0 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  .aSeg[iSeg].iSeg
1b700 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  id );.        }.
1b710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1b720 73 65 72 74 5f 6e 63 28 20 69 53 65 67 69 64 3e  sert_nc( iSegid>
1b730 30 20 26 26 20 69 53 65 67 69 64 3c 3d 46 54 53  0 && iSegid<=FTS
1b740 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29 3b  5_MAX_SEGMENT );
1b750 0a 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ..      {.      
1b760 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1b770 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66 74 73  pIdxSelect = fts
1b780 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 70  5IdxSelectStmt(p
1b790 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1b7a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1b7b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
1b7c0 61 42 6c 6f 62 5b 32 5d 20 3d 20 7b 30 78 66 66  aBlob[2] = {0xff
1b7d0 2c 20 30 78 66 66 7d 3b 0a 20 20 20 20 20 20 20  , 0xff};.       
1b7e0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1b7f0 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c 20  int(pIdxSelect, 
1b800 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20 20 20  1, iSegid);.    
1b810 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
1b820 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53 65 6c 65  nd_blob(pIdxSele
1b830 63 74 2c 20 32 2c 20 61 42 6c 6f 62 2c 20 32 2c  ct, 2, aBlob, 2,
1b840 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1b850 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1b860 74 5f 6e 63 28 20 73 71 6c 69 74 65 33 5f 73 74  t_nc( sqlite3_st
1b870 65 70 28 70 49 64 78 53 65 6c 65 63 74 29 21 3d  ep(pIdxSelect)!=
1b880 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 20 20  SQLITE_ROW );.  
1b890 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1b8a0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49  sqlite3_reset(pI
1b8b0 64 78 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  dxSelect);.     
1b8c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1b8d0 64 5f 6e 75 6c 6c 28 70 49 64 78 53 65 6c 65 63  d_null(pIdxSelec
1b8e0 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, 2);.        }
1b8f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1b900 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1b910 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f  urn iSegid;.}../
1b920 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c  *.** Discard all
1b930 20 64 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20   data currently 
1b940 63 61 63 68 65 64 20 69 6e 20 74 68 65 20 68 61  cached in the ha
1b950 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  sh-tables..*/.st
1b960 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1b970 64 65 78 44 69 73 63 61 72 64 44 61 74 61 28 46  dexDiscardData(F
1b980 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1b990 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68  assert( p->pHash
1b9a0 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44   || p->nPendingD
1b9b0 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
1b9c0 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20  p->pHash ){.    
1b9d0 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 43  sqlite3Fts5HashC
1b9e0 6c 65 61 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a  lear(p->pHash);.
1b9f0 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
1ba00 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ata = 0;.  }.}..
1ba10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ba20 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65   size of the pre
1ba30 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74  fix, in bytes, t
1ba40 68 61 74 20 62 75 66 66 65 72 20 0a 2a 2a 20 28  hat buffer .** (
1ba50 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b  pNew/<length-unk
1ba60 6e 6f 77 6e 3e 29 20 73 68 61 72 65 73 20 77 69  nown>) shares wi
1ba70 74 68 20 62 75 66 66 65 72 20 28 70 4f 6c 64 2f  th buffer (pOld/
1ba80 6e 4f 6c 64 29 2e 0a 2a 2a 0a 2a 2a 20 42 75 66  nOld)..**.** Buf
1ba90 66 65 72 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74  fer (pNew/<lengt
1baa0 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 69 73 20 67  h-unknown>) is g
1bab0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1bac0 67 72 65 61 74 65 72 20 0a 2a 2a 20 74 68 61 6e  greater .** than
1bad0 20 62 75 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f   buffer (pOld/nO
1bae0 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ld)..*/.static i
1baf0 6e 74 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d  nt fts5PrefixCom
1bb00 70 72 65 73 73 28 69 6e 74 20 6e 4f 6c 64 2c 20  press(int nOld, 
1bb10 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c 20  const u8 *pOld, 
1bb20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77 29 7b  const u8 *pNew){
1bb30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1bb40 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
1bb50 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b  ){.    if( pOld[
1bb60 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72  i]!=pNew[i] ) br
1bb70 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
1bb80 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n i;.}..static v
1bb90 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69  oid fts5WriteDli
1bba0 64 78 43 6c 65 61 72 28 0a 20 20 46 74 73 35 49  dxClear(.  Fts5I
1bbb0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1bbc0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1bbd0 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75 73 68  er,.  int bFlush
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1bc00 2c 20 77 72 69 74 65 20 64 6c 69 64 78 20 74 6f  , write dlidx to
1bc10 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e   disk */.){.  in
1bc20 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 62  t i;.  assert( b
1bc30 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70 57 72  Flush==0 || (pWr
1bc40 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26  iter->nDlidx>0 &
1bc50 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
1bc60 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20 29 3b  x[0].buf.n>0) );
1bc70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
1bc80 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69  riter->nDlidx; i
1bc90 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  ++){.    Fts5Dli
1bca0 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78  dxWriter *pDlidx
1bcb0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
1bcc0 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  idx[i];.    if( 
1bcd0 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30  pDlidx->buf.n==0
1bce0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1bcf0 28 20 62 46 6c 75 73 68 20 29 7b 0a 20 20 20 20  ( bFlush ){.    
1bd00 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
1bd10 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ->pgno!=0 );.   
1bd20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
1bd30 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
1bd40 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
1bd50 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
1bd60 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f   i, pDlidx->pgno
1bd70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c  ),.          pDl
1bd80 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69  idx->buf.p, pDli
1bd90 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20  dx->buf.n.      
1bda0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1bdb0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65  ite3Fts5BufferZe
1bdc0 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29  ro(&pDlidx->buf)
1bdd0 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50  ;.    pDlidx->bP
1bde0 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  revValid = 0;.  
1bdf0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20  }.}../*.** Grow 
1be00 74 68 65 20 70 57 72 69 74 65 72 2d 3e 61 44 6c  the pWriter->aDl
1be10 69 64 78 5b 5d 20 61 72 72 61 79 20 74 6f 20 61  idx[] array to a
1be20 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65 6c 65  t least nLvl ele
1be30 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  ments in size..*
1be40 2a 20 41 6e 79 20 6e 65 77 20 61 72 72 61 79 20  * Any new array 
1be50 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a 65 72  elements are zer
1be60 6f 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  oed before retur
1be70 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1be80 69 6e 74 20 66 74 73 35 57 72 69 74 65 44 6c 69  int fts5WriteDli
1be90 64 78 47 72 6f 77 28 0a 20 20 46 74 73 35 49 6e  dxGrow(.  Fts5In
1bea0 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65  dex *p,.  Fts5Se
1beb0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1bec0 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a  ,.  int nLvl.){.
1bed0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1bee0 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d  ITE_OK && nLvl>=
1bef0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20  pWriter->nDlidx 
1bf00 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  ){.    Fts5Dlidx
1bf10 57 72 69 74 65 72 20 2a 61 44 6c 69 64 78 20 3d  Writer *aDlidx =
1bf20 20 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65   (Fts5DlidxWrite
1bf30 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
1bf40 6f 63 36 34 28 0a 20 20 20 20 20 20 20 20 70 57  oc64(.        pW
1bf50 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73  riter->aDlidx, s
1bf60 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57  izeof(Fts5DlidxW
1bf70 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20  riter) * nLvl.  
1bf80 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61 44 6c    );.    if( aDl
1bf90 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  idx==0 ){.      
1bfa0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
1bfb0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1bfc0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
1bfd0 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c   = sizeof(Fts5Dl
1bfe0 69 64 78 57 72 69 74 65 72 29 20 2a 20 28 6e 4c  idxWriter) * (nL
1bff0 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44  vl - pWriter->nD
1c000 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d  lidx);.      mem
1c010 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57 72 69  set(&aDlidx[pWri
1c020 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c  ter->nDlidx], 0,
1c030 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70   nByte);.      p
1c040 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d  Writer->aDlidx =
1c050 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20 20 70   aDlidx;.      p
1c060 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d  Writer->nDlidx =
1c070 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d   nLvl;.    }.  }
1c080 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
1c090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1c0a0 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
1c0b0 2d 69 6e 64 65 78 20 61 63 63 75 6d 75 6c 61 74  -index accumulat
1c0c0 69 6e 67 20 69 6e 20 70 57 72 69 74 65 72 2d 3e  ing in pWriter->
1c0d0 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61 72 67  aDlidx[] is larg
1c0e0 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66 6c 75  e.** enough, flu
1c0f0 73 68 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e  sh it to disk an
1c100 64 20 72 65 74 75 72 6e 20 31 2e 20 4f 74 68 65  d return 1. Othe
1c110 72 77 69 73 65 20 64 69 73 63 61 72 64 20 69 74  rwise discard it
1c120 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 7a   and return.** z
1c130 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
1c140 6e 74 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  nt fts5WriteFlus
1c150 68 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78  hDlidx(Fts5Index
1c160 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
1c170 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
1c180 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 0a  int bFlag = 0;..
1c190 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65    /* If there we
1c1a0 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44  re FTS5_MIN_DLID
1c1b0 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65 20 65  X_SIZE or more e
1c1c0 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65 73 20  mpty leaf pages 
1c1d0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
1c1e0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6c  the database, al
1c1f0 73 6f 20 77 72 69 74 65 20 74 68 65 20 64 6f 63  so write the doc
1c200 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f 20 64 69  list-index to di
1c210 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  sk.  */.  if( pW
1c220 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
1c230 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70 57 72 69  .buf.n>0 && pWri
1c240 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53  ter->nEmpty>=FTS
1c250 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45  5_MIN_DLIDX_SIZE
1c260 20 29 7b 0a 20 20 20 20 62 46 6c 61 67 20 3d 20   ){.    bFlag = 
1c270 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57 72 69  1;.  }.  fts5Wri
1c280 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70 2c 20  teDlidxClear(p, 
1c290 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67 29 3b  pWriter, bFlag);
1c2a0 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  .  pWriter->nEmp
1c2b0 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ty = 0;.  return
1c2c0 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   bFlag;.}../*.**
1c2d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1c2e0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
1c2f0 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  r processing of 
1c300 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  the doclist for 
1c310 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74 65 72  the .** last ter
1c320 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 28  m on leaf page (
1c330 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1c340 29 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20  ) is completed. 
1c350 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63 6c 69  .**.** The docli
1c360 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 61  st-index for tha
1c370 74 20 74 65 72 6d 20 69 73 20 63 75 72 72 65 6e  t term is curren
1c380 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d 6d 65  tly stored in-me
1c390 6d 6f 72 79 20 77 69 74 68 69 6e 20 74 68 65 0a  mory within the.
1c3a0 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74 65 72  ** Fts5SegWriter
1c3b0 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 2e  .aDlidx[] array.
1c3c0 20 49 66 20 69 74 20 69 73 20 6c 61 72 67 65 20   If it is large 
1c3d0 65 6e 6f 75 67 68 2c 20 74 68 69 73 20 66 75 6e  enough, this fun
1c3e0 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65 73 20  ction.** writes 
1c3f0 69 74 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20  it out to disk. 
1c400 4f 72 2c 20 69 66 20 69 74 20 69 73 20 74 6f 6f  Or, if it is too
1c410 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68 65 72   small to bother
1c420 20 77 69 74 68 2c 20 64 69 73 63 61 72 64 73 0a   with, discards.
1c430 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73  ** it..**.** Fts
1c440 35 53 65 67 57 72 69 74 65 72 2e 62 74 74 65 72  5SegWriter.btter
1c450 6d 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  m currently cont
1c460 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 74  ains the first t
1c470 65 72 6d 20 6f 6e 20 70 61 67 65 20 69 42 74 50  erm on page iBtP
1c480 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
1c490 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75  oid fts5WriteFlu
1c4a0 73 68 42 74 72 65 65 28 46 74 73 35 49 6e 64 65  shBtree(Fts5Inde
1c4b0 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
1c4c0 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
1c4d0 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20 20 61   int bFlag;..  a
1c4e0 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
1c4f0 69 42 74 50 61 67 65 20 7c 7c 20 70 57 72 69 74  iBtPage || pWrit
1c500 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20 29 3b  er->nEmpty==0 );
1c510 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
1c520 69 42 74 50 61 67 65 3d 3d 30 20 29 20 72 65 74  iBtPage==0 ) ret
1c530 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d 20 66  urn;.  bFlag = f
1c540 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69  ts5WriteFlushDli
1c550 64 78 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  dx(p, pWriter);.
1c560 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1c570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
1c580 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
1c590 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e  pWriter->btterm.
1c5a0 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61 72 2a  n>0?(const char*
1c5b0 29 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  )pWriter->btterm
1c5c0 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a 20 54  .p:"");.    /* T
1c5d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73  he following was
1c5e0 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 69 6e   already done in
1c5f0 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 29   fts5WriteInit()
1c600 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69  : */.    /* sqli
1c610 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
1c620 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70  pIdxWriter, 1, p
1c630 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b  Writer->iSegid);
1c640 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1c650 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64  bind_blob(p->pId
1c660 78 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c 20 70  xWriter, 2, z, p
1c670 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e  Writer->btterm.n
1c680 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
1c690 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
1c6a0 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49 64 78  nd_int64(p->pIdx
1c6b0 57 72 69 74 65 72 2c 20 33 2c 20 62 46 6c 61 67  Writer, 3, bFlag
1c6c0 20 2b 20 28 28 69 36 34 29 70 57 72 69 74 65 72   + ((i64)pWriter
1c6d0 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29 29 3b 0a  ->iBtPage<<1));.
1c6e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
1c6f0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b  (p->pIdxWriter);
1c700 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
1c710 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49  ite3_reset(p->pI
1c720 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73  dxWriter);.    s
1c730 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
1c740 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1c750 32 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65  2);.  }.  pWrite
1c760 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a  r->iBtPage = 0;.
1c770 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
1c780 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
1c790 20 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20   each leaf page 
1c7a0 65 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74  except the first
1c7b0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
1c7c0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  * at least one t
1c7d0 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e  erm. Argument (n
1c7e0 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74  Term/pTerm) is t
1c7f0 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61  he split-key - a
1c800 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73   term that.** is
1c810 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c   larger than all
1c820 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74   terms written t
1c830 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73  o earlier leaves
1c840 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f  , and equal to o
1c850 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61  r.** smaller tha
1c860 6e 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  n the first term
1c870 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66   on the new leaf
1c880 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1c890 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
1c8a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
1c8b0 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
1c8c0 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a  c. If an error.*
1c8d0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  * has already oc
1c8e0 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
1c8f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c900 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
1c910 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1c920 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65  id fts5WriteBtre
1c930 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  eTerm(.  Fts5Ind
1c940 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1c950 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1c960 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1c970 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
1c980 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
1c990 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
1c9a0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
1c9b0 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a  Term, const u8 *
1c9c0 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69  pTerm      /* Fi
1c9d0 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20  rst term on new 
1c9e0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66 74 73  page */.){.  fts
1c9f0 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65  5WriteFlushBtree
1ca00 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1ca10 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1ca20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35  E_OK ){.    fts5
1ca30 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1ca40 2c 20 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65  , &pWriter->btte
1ca50 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
1ca60 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  );.    pWriter->
1ca70 69 42 74 50 61 67 65 20 3d 20 70 57 72 69 74 65  iBtPage = pWrite
1ca80 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a  r->writer.pgno;.
1ca90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
1caa0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1cab0 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75 73 68 69  lled when flushi
1cac0 6e 67 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  ng a leaf page t
1cad0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a  hat contains no.
1cae0 2a 2a 20 74 65 72 6d 73 20 61 74 20 61 6c 6c 20  ** terms at all 
1caf0 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  to disk..*/.stat
1cb00 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1cb10 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20  eBtreeNoTerm(.  
1cb20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb40 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1cb50 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
1cb60 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1cb70 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er          /* W
1cb80 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1cb90 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ){.  /* If there
1cba0 20 77 65 72 65 20 6e 6f 20 72 6f 77 69 64 73 20   were no rowids 
1cbb0 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  on the leaf page
1cbc0 20 65 69 74 68 65 72 20 61 6e 64 20 74 68 65 20   either and the 
1cbd0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a 20 20  doclist-index.  
1cbe0 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
1cbf0 65 65 6e 20 73 74 61 72 74 65 64 2c 20 61 70 70  een started, app
1cc00 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79 74 65  end an 0x00 byte
1cc10 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20 69 66   to it.  */.  if
1cc20 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1cc30 74 52 6f 77 69 64 49 6e 50 61 67 65 20 26 26 20  tRowidInPage && 
1cc40 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1cc50 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a 20 20  0].buf.n>0 ){.  
1cc60 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
1cc70 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72  r *pDlidx = &pWr
1cc80 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b  iter->aDlidx[0];
1cc90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c  .    assert( pDl
1cca0 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
1ccb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
1ccc0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1ccd0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1cce0 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b 0a 20  lidx->buf, 0);. 
1ccf0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
1cd00 6e 74 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f  nt the "number o
1cd10 66 20 73 65 71 75 65 6e 74 69 61 6c 20 6c 65 61  f sequential lea
1cd20 76 65 73 20 77 69 74 68 6f 75 74 20 61 20 74 65  ves without a te
1cd30 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a  rm" counter. */.
1cd40 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74    pWriter->nEmpt
1cd50 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  y++;.}..static i
1cd60 36 34 20 66 74 73 35 44 6c 69 64 78 45 78 74 72  64 fts5DlidxExtr
1cd70 61 63 74 46 69 72 73 74 52 6f 77 69 64 28 46 74  actFirstRowid(Ft
1cd80 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b  s5Buffer *pBuf){
1cd90 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20  .  i64 iRowid;. 
1cda0 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 69 4f   int iOff;..  iO
1cdb0 66 66 20 3d 20 31 20 2b 20 66 74 73 35 47 65 74  ff = 1 + fts5Get
1cdc0 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
1cdd0 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69  1], (u64*)&iRowi
1cde0 64 29 3b 0a 20 20 66 74 73 35 47 65 74 56 61 72  d);.  fts5GetVar
1cdf0 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66  int(&pBuf->p[iOf
1ce00 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69  f], (u64*)&iRowi
1ce10 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 6f  d);.  return iRo
1ce20 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  wid;.}../*.** Ro
1ce30 77 69 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a  wid iRowid has j
1ce40 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ust been appende
1ce50 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
1ce60 20 6c 65 61 66 20 70 61 67 65 2e 20 49 74 20 69   leaf page. It i
1ce70 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f  s the.** first o
1ce80 6e 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73  n the page. This
1ce90 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
1cea0 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  s an appropriate
1ceb0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75   entry to the cu
1cec0 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74  rrent.** doclist
1ced0 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69  -index..*/.stati
1cee0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1cef0 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46  DlidxAppend(.  F
1cf00 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1cf10 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1cf20 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69  Writer, .  i64 i
1cf30 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69  Rowid.){.  int i
1cf40 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20  ;.  int bDone = 
1cf50 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70  0;..  for(i=0; p
1cf60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1cf70 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b  && bDone==0; i++
1cf80 29 7b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  ){.    i64 iVal;
1cf90 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
1cfa0 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26  iter *pDlidx = &
1cfb0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1cfc0 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 6c  i];..    if( pDl
1cfd0 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70  idx->buf.n>=p->p
1cfe0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a  Config->pgsz ){.
1cff0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1d000 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64  rent doclist-ind
1d010 65 78 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2e  ex page is full.
1d020 20 57 72 69 74 65 20 69 74 20 74 6f 20 64 69 73   Write it to dis
1d030 6b 20 61 6e 64 20 70 75 73 68 0a 20 20 20 20 20  k and push.     
1d040 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 69 52   ** a copy of iR
1d050 6f 77 69 64 20 28 77 68 69 63 68 20 77 69 6c 6c  owid (which will
1d060 20 62 65 63 6f 6d 65 20 74 68 65 20 66 69 72 73   become the firs
1d070 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e  t rowid on the n
1d080 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63  ext.      ** doc
1d090 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65 61 66 20  list-index leaf 
1d0a0 70 61 67 65 29 20 75 70 20 69 6e 74 6f 20 74 68  page) up into th
1d0b0 65 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66 20  e next level of 
1d0c0 74 68 65 20 62 2d 74 72 65 65 20 0a 20 20 20 20  the b-tree .    
1d0d0 20 20 2a 2a 20 68 69 65 72 61 72 63 68 79 2e 20    ** hierarchy. 
1d0e0 49 66 20 74 68 65 20 6e 6f 64 65 20 62 65 69 6e  If the node bein
1d0f0 67 20 66 6c 75 73 68 65 64 20 69 73 20 63 75 72  g flushed is cur
1d100 72 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74 20  rently the root 
1d110 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61  node,.      ** a
1d120 6c 73 6f 20 70 75 73 68 20 69 74 73 20 66 69 72  lso push its fir
1d130 73 74 20 72 6f 77 69 64 20 75 70 77 61 72 64 73  st rowid upwards
1d140 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69 64  . */.      pDlid
1d150 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78  x->buf.p[0] = 0x
1d160 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68  01;    /* Not th
1d170 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20  e root node */. 
1d180 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
1d190 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  te(p, .         
1d1a0 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
1d1b0 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
1d1c0 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67  d, i, pDlidx->pg
1d1d0 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70  no),.          p
1d1e0 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44  Dlidx->buf.p, pD
1d1f0 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20  lidx->buf.n.    
1d200 20 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57    );.      fts5W
1d210 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c  riteDlidxGrow(p,
1d220 20 70 57 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a   pWriter, i+2);.
1d230 20 20 20 20 20 20 70 44 6c 69 64 78 20 3d 20 26        pDlidx = &
1d240 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1d250 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  i];.      if( p-
1d260 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1d270 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e  & pDlidx[1].buf.
1d280 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1d290 69 36 34 20 69 46 69 72 73 74 20 3d 20 66 74 73  i64 iFirst = fts
1d2a0 35 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72  5DlidxExtractFir
1d2b0 73 74 52 6f 77 69 64 28 26 70 44 6c 69 64 78 2d  stRowid(&pDlidx-
1d2c0 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20  >buf);..        
1d2d0 2f 2a 20 54 68 69 73 20 77 61 73 20 74 68 65 20  /* This was the 
1d2e0 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68 20  root node. Push 
1d2f0 69 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20  its first rowid 
1d300 75 70 20 74 6f 20 74 68 65 20 6e 65 77 20 72 6f  up to the new ro
1d310 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ot. */.        p
1d320 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20  Dlidx[1].pgno = 
1d330 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20  pDlidx->pgno;.  
1d340 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1d350 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d360 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
1d370 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a  idx[1].buf, 0);.
1d380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1d390 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d3a0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d3b0 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44  Dlidx[1].buf, pD
1d3c0 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  lidx->pgno);.   
1d3d0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d3e0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1d3f0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1d400 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72 73  dx[1].buf, iFirs
1d410 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69  t);.        pDli
1d420 64 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69 64  dx[1].bPrevValid
1d430 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44   = 1;.        pD
1d440 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20  lidx[1].iPrev = 
1d450 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a  iFirst;.      }.
1d460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1d470 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44  s5BufferZero(&pD
1d480 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20  lidx->buf);.    
1d490 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56    pDlidx->bPrevV
1d4a0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  alid = 0;.      
1d4b0 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a  pDlidx->pgno++;.
1d4c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d4d0 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20   bDone = 1;.    
1d4e0 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64  }..    if( pDlid
1d4f0 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29 7b  x->bPrevValid ){
1d500 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52  .      iVal = iR
1d510 6f 77 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69  owid - pDlidx->i
1d520 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Prev;.    }else{
1d530 0a 20 20 20 20 20 20 69 36 34 20 69 50 67 6e 6f  .      i64 iPgno
1d540 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72 69 74   = (i==0 ? pWrit
1d550 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20  er->writer.pgno 
1d560 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e  : pDlidx[-1].pgn
1d570 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  o);.      assert
1d580 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d  ( pDlidx->buf.n=
1d590 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1d5a0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1d5b0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d5c0 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20  , &pDlidx->buf, 
1d5d0 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73  !bDone);.      s
1d5e0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d5f0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d600 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
1d610 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20  f, iPgno);.     
1d620 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a   iVal = iRowid;.
1d630 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
1d640 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1d650 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1d660 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69   &pDlidx->buf, i
1d670 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69 64 78  Val);.    pDlidx
1d680 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31  ->bPrevValid = 1
1d690 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 69 50  ;.    pDlidx->iP
1d6a0 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  rev = iRowid;.  
1d6b0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1d6c0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1d6d0 65 61 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  eaf(Fts5Index *p
1d6e0 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
1d6f0 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73 74 61  *pWriter){.  sta
1d700 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
1d710 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78  o[] = { 0x00, 0x
1d720 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
1d730 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  ;.  Fts5PageWrit
1d740 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
1d750 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
1d760 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 61  i64 iRowid;..  a
1d770 73 73 65 72 74 28 20 28 70 50 61 67 65 2d 3e 70  ssert( (pPage->p
1d780 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72  gidx.n==0)==(pWr
1d790 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
1d7a0 49 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  InPage) );..  /*
1d7b0 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20   Set the szLeaf 
1d7c0 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f  header field. */
1d7d0 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74  .  assert( 0==ft
1d7e0 73 35 47 65 74 55 31 36 28 26 70 50 61 67 65 2d  s5GetU16(&pPage-
1d7f0 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20  >buf.p[2]) );.  
1d800 66 74 73 35 50 75 74 55 31 36 28 26 70 50 61 67  fts5PutU16(&pPag
1d810 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31  e->buf.p[2], (u1
1d820 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  6)pPage->buf.n);
1d830 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ..  if( pWriter-
1d840 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1d850 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74  e ){.    /* No t
1d860 65 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e 20  erm was written 
1d870 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a 2f  to this page. */
1d880 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d890 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 20 29  ge->pgidx.n==0 )
1d8a0 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 42  ;.    fts5WriteB
1d8b0 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57  treeNoTerm(p, pW
1d8c0 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  riter);.  }else{
1d8d0 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
1d8e0 68 65 20 70 67 69 64 78 20 74 6f 20 74 68 65 20  he pgidx to the 
1d8f0 70 61 67 65 20 62 75 66 66 65 72 2e 20 53 65 74  page buffer. Set
1d900 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64   the szLeaf head
1d910 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20  er field. */.   
1d920 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1d930 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1d940 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61 67 65  Page->buf, pPage
1d950 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61 67 65  ->pgidx.n, pPage
1d960 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20 7d 0a  ->pgidx.p);.  }.
1d970 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
1d980 70 61 67 65 20 6f 75 74 20 74 6f 20 64 69 73 6b  page out to disk
1d990 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20 46   */.  iRowid = F
1d9a0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1d9b0 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
1d9c0 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  d, pPage->pgno);
1d9d0 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
1d9e0 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67  (p, iRowid, pPag
1d9f0 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
1da00 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49  >buf.n);..  /* I
1da10 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65  nitialize the ne
1da20 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  xt page. */.  ft
1da30 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
1da40 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73  age->buf);.  fts
1da50 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
1da60 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74  ge->pgidx);.  ft
1da70 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1da80 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1da90 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29  e->buf, 4, zero)
1daa0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76  ;.  pPage->iPrev
1dab0 50 67 69 64 78 20 3d 20 30 3b 0a 20 20 70 50 61  Pgidx = 0;.  pPa
1dac0 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ge->pgno++;..  /
1dad0 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6c  * Increase the l
1dae0 65 61 76 65 73 20 77 72 69 74 74 65 6e 20 63 6f  eaves written co
1daf0 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72 69 74  unter */.  pWrit
1db00 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e  er->nLeafWritten
1db10 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ++;..  /* The ne
1db20 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20  w leaf holds no 
1db30 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64 73 20  terms or rowids 
1db40 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  */.  pWriter->bF
1db50 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
1db60 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
1db70 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1db80 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   = 1;.}../*.** A
1db90 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d  ppend term pTerm
1dba0 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65  /nTerm to the se
1dbb0 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
1dbc0 74 65 6e 20 62 79 20 74 68 65 20 77 72 69 74 65  ten by the write
1dbd0 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  r passed.** as t
1dbe0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1dbf0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
1dc00 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
1dc10 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
1dc20 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
1dc30 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
1dc40 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
1dc50 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
1dc60 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1dc70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1dc80 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
1dc90 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
1dca0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1dcb0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
1dcc0 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74  int nTerm, const
1dcd0 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20   u8 *pTerm .){. 
1dce0 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20   int nPrefix;   
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd00 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65   /* Bytes of pre
1dd10 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  fix compression 
1dd20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74  for term */.  Ft
1dd30 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
1dd40 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
1dd50 77 72 69 74 65 72 3b 0a 20 20 46 74 73 35 42 75  writer;.  Fts5Bu
1dd60 66 66 65 72 20 2a 70 50 67 69 64 78 20 3d 20 26  ffer *pPgidx = &
1dd70 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1dd80 70 67 69 64 78 3b 0a 20 20 69 6e 74 20 6e 4d 69  pgidx;.  int nMi
1dd90 6e 20 3d 20 4d 49 4e 28 70 50 61 67 65 2d 3e 74  n = MIN(pPage->t
1dda0 65 72 6d 2e 6e 2c 20 6e 54 65 72 6d 29 3b 0a 0a  erm.n, nTerm);..
1ddb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
1ddc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1ddd0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62  assert( pPage->b
1dde0 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73  uf.n>=4 );.  ass
1ddf0 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e  ert( pPage->buf.
1de00 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  n>4 || pWriter->
1de10 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1de20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1de30 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
1de40 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73  ge is full, flus
1de50 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  h it to disk. */
1de60 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62  .  if( (pPage->b
1de70 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  uf.n + pPgidx->n
1de80 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70   + nTerm + 2)>=p
1de90 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1dea0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
1deb0 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20  ->buf.n>4 ){.   
1dec0 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1ded0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
1dee0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1def0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1df00 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
1df10 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77    fts5BufferGrow
1df20 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1df30 3e 62 75 66 2c 20 6e 54 65 72 6d 2b 46 54 53 35  >buf, nTerm+FTS5
1df40 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a  _DATA_PADDING);.
1df50 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 4f 44 4f    }.  .  /* TODO
1df60 31 3a 20 55 70 64 61 74 69 6e 67 20 70 67 69 64  1: Updating pgid
1df70 78 20 68 65 72 65 2e 20 2a 2f 0a 20 20 70 50 67  x here. */.  pPg
1df80 69 64 78 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  idx->n += sqlite
1df90 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 0a  3Fts5PutVarint(.
1dfa0 20 20 20 20 20 20 26 70 50 67 69 64 78 2d 3e 70        &pPgidx->p
1dfb0 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61  [pPgidx->n], pPa
1dfc0 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67  ge->buf.n - pPag
1dfd0 65 2d 3e 69 50 72 65 76 50 67 69 64 78 0a 20 20  e->iPrevPgidx.  
1dfe0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72 65  );.  pPage->iPre
1dff0 76 50 67 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  vPgidx = pPage->
1e000 62 75 66 2e 6e 3b 0a 23 69 66 20 30 0a 20 20 66  buf.n;.#if 0.  f
1e010 74 73 35 50 75 74 55 31 36 28 26 70 50 67 69 64  ts5PutU16(&pPgid
1e020 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c  x->p[pPgidx->n],
1e030 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a   pPage->buf.n);.
1e040 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 32    pPgidx->n += 2
1e050 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
1e060 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1e070 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  ermInPage ){.   
1e080 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20   nPrefix = 0;.  
1e090 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e    if( pPage->pgn
1e0a0 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  o!=1 ){.      /*
1e0b0 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
1e0c0 73 74 20 74 65 72 6d 20 6f 6e 20 61 20 6c 65 61  st term on a lea
1e0d0 66 20 74 68 61 74 20 69 73 20 6e 6f 74 20 74 68  f that is not th
1e0e0 65 20 6c 65 66 74 6d 6f 73 74 20 6c 65 61 66 20  e leftmost leaf 
1e0f0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  in.      ** the 
1e100 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20  segment b-tree. 
1e110 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
1e120 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
1e130 61 64 64 20 61 20 74 65 72 6d 20 74 6f 0a 20 20  add a term to.  
1e140 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65      ** the b-tre
1e150 65 20 68 69 65 72 61 72 63 68 79 20 74 68 61 74  e hierarchy that
1e160 20 69 73 20 28 61 29 20 6c 61 72 67 65 72 20 74   is (a) larger t
1e170 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
1e180 74 65 72 6d 20 0a 20 20 20 20 20 20 2a 2a 20 61  term .      ** a
1e190 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
1e1a0 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 61 6e  o the segment an
1e1b0 64 20 28 62 29 20 73 6d 61 6c 6c 65 72 20 74 68  d (b) smaller th
1e1c0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20  an or equal to. 
1e1d0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 74 65 72       ** this ter
1e1e0 6d 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  m. In other word
1e1f0 73 2c 20 61 20 70 72 65 66 69 78 20 6f 66 20 28  s, a prefix of (
1e200 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 74 68 61  pTerm/nTerm) tha
1e210 74 20 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 2a  t is one.      *
1e220 2a 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 74 68  * byte longer th
1e230 61 6e 20 74 68 65 20 6c 6f 6e 67 65 73 74 20 70  an the longest p
1e240 72 65 66 69 78 20 28 70 54 65 72 6d 2f 6e 54 65  refix (pTerm/nTe
1e250 72 6d 29 20 73 68 61 72 65 73 20 77 69 74 68 20  rm) shares with 
1e260 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 65  the.      ** pre
1e270 76 69 6f 75 73 20 74 65 72 6d 2e 20 0a 20 20 20  vious term. .   
1e280 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
1e290 73 75 61 6c 6c 79 2c 20 74 68 65 20 70 72 65 76  sually, the prev
1e2a0 69 6f 75 73 20 74 65 72 6d 20 69 73 20 61 76 61  ious term is ava
1e2b0 69 6c 61 62 6c 65 20 69 6e 20 70 50 61 67 65 2d  ilable in pPage-
1e2c0 3e 74 65 72 6d 2e 20 54 68 65 20 65 78 63 65 70  >term. The excep
1e2d0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  tion.      ** is
1e2e0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1e2f0 66 69 72 73 74 20 74 65 72 6d 20 77 72 69 74 74  first term writt
1e300 65 6e 20 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65  en in an increme
1e310 6e 74 61 6c 2d 6d 65 72 67 65 20 73 74 65 70 2e  ntal-merge step.
1e320 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  .      ** In thi
1e330 73 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  s case the previ
1e340 6f 75 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  ous term is not 
1e350 61 76 61 69 6c 61 62 6c 65 2c 20 73 6f 20 6a 75  available, so ju
1e360 73 74 20 77 72 69 74 65 20 61 0a 20 20 20 20 20  st write a.     
1e370 20 2a 2a 20 63 6f 70 79 20 6f 66 20 28 70 54 65   ** copy of (pTe
1e380 72 6d 2f 6e 54 65 72 6d 29 20 69 6e 74 6f 20 74  rm/nTerm) into t
1e390 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20  he parent node. 
1e3a0 54 68 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79  This is slightly
1e3b0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 65 66 66 69  .      ** ineffi
1e3c0 63 69 65 6e 74 2c 20 62 75 74 20 73 74 69 6c 6c  cient, but still
1e3d0 20 63 6f 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20   correct.  */.  
1e3e0 20 20 20 20 69 6e 74 20 6e 20 3d 20 6e 54 65 72      int n = nTer
1e3f0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  m;.      if( pPa
1e400 67 65 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20  ge->term.n ){.  
1e410 20 20 20 20 20 20 6e 20 3d 20 31 20 2b 20 66 74        n = 1 + ft
1e420 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
1e430 28 6e 4d 69 6e 2c 20 70 50 61 67 65 2d 3e 74 65  (nMin, pPage->te
1e440 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20  rm.p, pTerm);.  
1e450 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
1e460 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 70  WriteBtreeTerm(p
1e470 2c 20 70 57 72 69 74 65 72 2c 20 6e 2c 20 70 54  , pWriter, n, pT
1e480 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  erm);.      if( 
1e490 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1e4a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
1e4b0 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
1e4c0 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20 7d  r->writer;.    }
1e4d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
1e4e0 72 65 66 69 78 20 3d 20 66 74 73 35 50 72 65 66  refix = fts5Pref
1e4f0 69 78 43 6f 6d 70 72 65 73 73 28 6e 4d 69 6e 2c  ixCompress(nMin,
1e500 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
1e510 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74 73 35  pTerm);.    fts5
1e520 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1e530 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1e540 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69 78 29  e->buf, nPrefix)
1e550 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
1e560 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
1e570 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   bytes of new da
1e580 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72  ta, then the ter
1e590 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a 20 20  m data itself.  
1e5a0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20  ** to the page. 
1e5b0 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  */.  fts5BufferA
1e5c0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1e5d0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e5e0 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
1e5f0 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
1e600 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1e610 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1e620 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 2c 20  Term - nPrefix, 
1e630 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 29  &pTerm[nPrefix])
1e640 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
1e650 68 65 20 46 74 73 35 50 61 67 65 57 72 69 74 65  he Fts5PageWrite
1e660 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20 2a 2f  r.term field. */
1e670 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74  .  fts5BufferSet
1e680 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1e690 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54  >term, nTerm, pT
1e6a0 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  erm);.  pWriter-
1e6b0 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1e6c0 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69 74 65  e = 0;..  pWrite
1e6d0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1e6e0 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72 69  Page = 0;.  pWri
1e6f0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1e700 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a  InDoclist = 1;..
1e710 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
1e720 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c  || (pWriter->nDl
1e730 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72  idx>0 && pWriter
1e740 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1e750 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72 69 74  n==0) );.  pWrit
1e760 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 70 67  er->aDlidx[0].pg
1e770 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
1e780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1e790 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20 70 6f  d a rowid and po
1e7a0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
1e7b0 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77 72   field to the wr
1e7c0 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a  iters output. .*
1e7d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1e7e0 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
1e7f0 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  id(.  Fts5Index 
1e800 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1e810 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
1e820 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20   i64 iRowid.){. 
1e830 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1e840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
1e850 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
1e860 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1e870 72 69 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  riter;..    if( 
1e880 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20  (pPage->buf.n + 
1e890 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e  pPage->pgidx.n)>
1e8a0 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
1e8b0 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  z ){.      fts5W
1e8c0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
1e8d0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d   pWriter);.    }
1e8e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1e8f0 20 69 73 20 74 6f 20 62 65 20 74 68 65 20 66 69   is to be the fi
1e900 72 73 74 20 72 6f 77 69 64 20 77 72 69 74 74 65  rst rowid writte
1e910 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73  n to the page, s
1e920 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  et the .    ** r
1e930 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20  owid-pointer in 
1e940 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 2e  the page-header.
1e950 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61 20 76   Also append a v
1e960 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c 69 64  alue to the dlid
1e970 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2c  x.    ** buffer,
1e980 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63 6c 69   in case a docli
1e990 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65 71 75  st-index is requ
1e9a0 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ired.  */.    if
1e9b0 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1e9c0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
1e9d0 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36        fts5PutU16
1e9e0 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 28  (pPage->buf.p, (
1e9f0 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e  u16)pPage->buf.n
1ea00 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  );.      fts5Wri
1ea10 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c  teDlidxAppend(p,
1ea20 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64   pWriter, iRowid
1ea30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1ea40 20 57 72 69 74 65 20 74 68 65 20 72 6f 77 69 64   Write the rowid
1ea50 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72  . */.    if( pWr
1ea60 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1ea70 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57  dInDoclist || pW
1ea80 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1ea90 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
1eaa0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1eab0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1eac0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52   &pPage->buf, iR
1ead0 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  owid);.    }else
1eae0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e  {.      assert_n
1eaf0 63 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77  c( p->rc || iRow
1eb00 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72 65  id>pWriter->iPre
1eb10 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  vRowid );.      
1eb20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1eb30 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1eb40 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77  pPage->buf, iRow
1eb50 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50  id - pWriter->iP
1eb60 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  revRowid);.    }
1eb70 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50  .    pWriter->iP
1eb80 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  revRowid = iRowi
1eb90 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  d;.    pWriter->
1eba0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
1ebb0 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57  list = 0;.    pW
1ebc0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1ebd0 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
1ebe0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1ebf0 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
1ec00 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20 46  PoslistData(.  F
1ec10 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1ec20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1ec30 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74  Writer, .  const
1ec40 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20 69   u8 *aData, .  i
1ec50 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74  nt nData.){.  Ft
1ec60 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
1ec70 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
1ec80 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20  writer;.  const 
1ec90 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20  u8 *a = aData;. 
1eca0 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a   int n = nData;.
1ecb0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e    .  assert( p->
1ecc0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20  pConfig->pgsz>0 
1ecd0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
1ece0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
1ecf0 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75     && (pPage->bu
1ed00 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69  f.n + pPage->pgi
1ed10 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43  dx.n + n)>=p->pC
1ed20 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29  onfig->pgsz .  )
1ed30 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d  {.    int nReq =
1ed40 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1ed50 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  z - pPage->buf.n
1ed60 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e   - pPage->pgidx.
1ed70 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  n;.    int nCopy
1ed80 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
1ed90 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20   nCopy<nReq ){. 
1eda0 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a       i64 dummy;.
1edb0 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66        nCopy += f
1edc0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
1edd0 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26 64  nCopy], (u64*)&d
1ede0 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ummy);.    }.   
1edf0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ee00 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1ee10 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79  Page->buf, nCopy
1ee20 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e  , a);.    a += n
1ee30 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e  Copy;.    n -= n
1ee40 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57 72  Copy;.    fts5Wr
1ee50 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
1ee60 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pWriter);.  }.  
1ee70 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66  if( n>0 ){.    f
1ee80 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1ee90 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
1eea0 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a  ge->buf, n, a);.
1eeb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75    }.}../*.** Flu
1eec0 73 68 20 61 6e 79 20 64 61 74 61 20 63 61 63 68  sh any data cach
1eed0 65 64 20 62 79 20 74 68 65 20 77 72 69 74 65 72  ed by the writer
1eee0 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64   object to the d
1eef0 61 74 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e  atabase. Free an
1ef00 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  y.** allocations
1ef10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ef20 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a   the writer..*/.
1ef30 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1ef40 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46  WriteFinish(.  F
1ef50 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1ef60 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1ef70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
1ef80 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1ef90 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61   */.  int *pnLea
1efa0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
1efb0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
1efc0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
1efd0 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a  es in b-tree */.
1efe0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
1eff0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 4c  s5PageWriter *pL
1f000 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  eaf = &pWriter->
1f010 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20 70 2d  writer;.  if( p-
1f020 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1f030 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
1f040 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a  eaf->pgno>=1 );.
1f050 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62      if( pLeaf->b
1f060 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20  uf.n>4 ){.      
1f070 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
1f080 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
1f090 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c 65 61      }.    *pnLea
1f0a0 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d  f = pLeaf->pgno-
1f0b0 31 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  1;.    if( pLeaf
1f0c0 2d 3e 70 67 6e 6f 3e 31 20 29 7b 0a 20 20 20 20  ->pgno>1 ){.    
1f0d0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1f0e0 42 74 72 65 65 28 70 2c 20 70 57 72 69 74 65 72  Btree(p, pWriter
1f0f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
1f100 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1f110 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66  Leaf->term);.  f
1f120 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1f130 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74  Leaf->buf);.  ft
1f140 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
1f150 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66  eaf->pgidx);.  f
1f160 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1f170 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b  Writer->btterm);
1f180 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
1f190 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20  Writer->nDlidx; 
1f1a0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1f1b0 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
1f1c0 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
1f1d0 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20  [i].buf);.  }.  
1f1e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
1f1f0 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d  iter->aDlidx);.}
1f200 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1f210 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46  s5WriteInit(.  F
1f220 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1f230 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1f240 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69  Writer, .  int i
1f250 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74  Segid.){.  const
1f260 20 69 6e 74 20 6e 42 75 66 66 65 72 20 3d 20 70   int nBuffer = p
1f270 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1f280 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
1f290 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  ING;..  memset(p
1f2a0 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Writer, 0, sizeo
1f2b0 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
1f2c0 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53  );.  pWriter->iS
1f2d0 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a  egid = iSegid;..
1f2e0 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1f2f0 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c  Grow(p, pWriter,
1f300 20 31 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e   1);.  pWriter->
1f310 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b  writer.pgno = 1;
1f320 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1f330 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31  stTermInPage = 1
1f340 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  ;.  pWriter->iBt
1f350 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73  Page = 1;..  ass
1f360 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72  ert( pWriter->wr
1f370 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b  iter.buf.n==0 );
1f380 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
1f390 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78  er->writer.pgidx
1f3a0 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 47  .n==0 );..  /* G
1f3b0 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75 66 66  row the two buff
1f3c0 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20 70 61  ers to pgsz + pa
1f3d0 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e 20 73  dding bytes in s
1f3e0 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ize. */.  sqlite
1f3f0 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
1f400 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72  &p->rc, &pWriter
1f410 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2c 20  ->writer.pgidx, 
1f420 6e 42 75 66 66 65 72 29 3b 0a 20 20 73 71 6c 69  nBuffer);.  sqli
1f430 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
1f440 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  e(&p->rc, &pWrit
1f450 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c 20  er->writer.buf, 
1f460 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69 66 28  nBuffer);..  if(
1f470 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72 3d 3d   p->pIdxWriter==
1f480 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
1f490 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
1f4a0 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
1f4b0 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
1f4c0 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 57  tmt(p, &p->pIdxW
1f4d0 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d  riter, sqlite3_m
1f4e0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
1f4f0 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27    "INSERT INTO '
1f500 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73 65 67  %q'.'%q_idx'(seg
1f510 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41  id,term,pgno) VA
1f520 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20  LUES(?,?,?)", . 
1f530 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
1f540 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
1f550 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
1f560 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
1f570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f580 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1f590 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66 2d 70  he 4-byte leaf-p
1f5a0 61 67 65 20 68 65 61 64 65 72 20 74 6f 20 30 78  age header to 0x
1f5b0 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  00. */.    memse
1f5c0 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  t(pWriter->write
1f5d0 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a  r.buf.p, 0, 4);.
1f5e0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69      pWriter->wri
1f5f0 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a  ter.buf.n = 4;..
1f600 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20      /* Bind the 
1f610 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 73  current output s
1f620 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74 68 65  egment id to the
1f630 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e 20 54   index-writer. T
1f640 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  his is an.    **
1f650 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76   optimization ov
1f660 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20 73  er binding the s
1f670 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72 20 61  ame value over a
1f680 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77 73 20  nd over as rows 
1f690 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  are.    ** inser
1f6a0 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78 20 62  ted into %_idx b
1f6b0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 72  y the current wr
1f6c0 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71  iter.  */.    sq
1f6d0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1f6e0 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c  ->pIdxWriter, 1,
1f6f0 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1f700 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1f710 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77  Iterator pIter w
1f720 61 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  as used to itera
1f730 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  te through the i
1f740 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66  nput segments of
1f750 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d   on an.** increm
1f760 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72  ental merge oper
1f770 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ation. This func
1f780 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69  tion is called i
1f790 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1f7a0 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20  l.** merge step 
1f7b0 68 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74  has finished but
1f7c0 20 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e   the input has n
1f7d0 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  ot been complete
1f7e0 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f  ly exhausted..*/
1f7f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1f800 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74  5TrimSegments(Ft
1f810 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1f820 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1f830 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42 75 66  int i;.  Fts5Buf
1f840 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65  fer buf;.  memse
1f850 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
1f860 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
1f870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
1f880 65 72 2d 3e 6e 53 65 67 20 26 26 20 70 2d 3e 72  er->nSeg && p->r
1f890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
1f8a0 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49  +){.    Fts5SegI
1f8b0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
1f8c0 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
1f8d0 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d   if( pSeg->pSeg=
1f8e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  =0 ){.      /* n
1f8f0 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  o-op */.    }els
1f900 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61  e if( pSeg->pLea
1f910 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  f==0 ){.      /*
1f920 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74   All keys from t
1f930 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  his input segmen
1f940 74 20 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e  t have been tran
1f950 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75  sfered to the ou
1f960 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53  tput..      ** S
1f970 65 74 20 62 6f 74 68 20 74 68 65 20 66 69 72 73  et both the firs
1f980 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d  t and last page-
1f990 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20  numbers to 0 to 
1f9a0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1f9b0 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
1f9c0 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e  nt is now empty.
1f9d0 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   */.      pSeg->
1f9e0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1f9f0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   0;.      pSeg->
1fa00 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
1fa10 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1fa20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
1fa30 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1fa40 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f  Offset;     /* O
1fa50 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72  ffset on new fir
1fa60 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  st leaf page */.
1fa70 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52        i64 iLeafR
1fa80 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35  owid;.      Fts5
1fa90 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
1faa0 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65     int iId = pSe
1fab0 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  g->pSeg->iSegid;
1fac0 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34  .      u8 aHdr[4
1fad0 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c  ] = {0x00, 0x00,
1fae0 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20   0x00, 0x00};.. 
1faf0 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20       iLeafRowid 
1fb00 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1fb10 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d 3e  OWID(iId, pSeg->
1fb20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
1fb30 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74        pData = ft
1fb40 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c  s5DataRead(p, iL
1fb50 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
1fb60 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
1fb70 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 70        if( iOff>p
1fb80 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Data->szLeaf ){.
1fb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
1fba0 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66 20 74  s can occur if t
1fbb0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 74 68  he pages that th
1fbc0 65 20 73 65 67 6d 65 6e 74 73 20 6f 63 63 75 70  e segments occup
1fbd0 79 20 6f 76 65 72 6c 61 70 20 2d 20 69 66 0a 20  y overlap - if. 
1fbe0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 69           ** a si
1fbf0 6e 67 6c 65 20 70 61 67 65 20 68 61 73 20 62 65  ngle page has be
1fc00 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 6d  en assigned to m
1fc10 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73 65 67  ore than one seg
1fc20 6d 65 6e 74 2e 20 49 6e 0a 20 20 20 20 20 20 20  ment. In.       
1fc30 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
1fc40 61 20 70 72 69 6f 72 20 69 74 65 72 61 74 69 6f  a prior iteratio
1fc50 6e 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 6d  n of this loop m
1fc60 61 79 20 68 61 76 65 20 63 6f 72 72 75 70 74 65  ay have corrupte
1fc70 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  d the.          
1fc80 2a 2a 20 73 65 67 6d 65 6e 74 20 63 75 72 72 65  ** segment curre
1fc90 6e 74 6c 79 20 62 65 69 6e 67 20 74 72 69 6d 6d  ntly being trimm
1fca0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ed.  */.        
1fcb0 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
1fcc0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
1fcd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1fce0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1fcf0 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  &buf);.         
1fd00 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28   fts5BufferGrow(
1fd10 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44  &p->rc, &buf, pD
1fd20 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20 20 20  ata->nn);.      
1fd30 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1fd40 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1fd50 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48   &buf, sizeof(aH
1fd60 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20  dr), aHdr);.    
1fd70 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fd80 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1fd90 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
1fda0 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
1fdb0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1fdc0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1fdd0 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
1fde0 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  m.n, pSeg->term.
1fdf0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  p);.          ft
1fe00 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1fe10 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1fe20 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69   pData->szLeaf-i
1fe30 4f 66 66 2c 26 70 44 61 74 61 2d 3e 70 5b 69 4f  Off,&pData->p[iO
1fe40 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ff]);.          
1fe50 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1fe60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1fe70 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73      /* Set the s
1fe80 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f 0a 20  zLeaf field */. 
1fe90 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50             fts5P
1fea0 75 74 55 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c  utU16(&buf.p[2],
1feb0 20 28 75 31 36 29 62 75 66 2e 6e 29 3b 0a 20 20   (u16)buf.n);.  
1fec0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1fed0 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74       /* Set up t
1fee0 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e 64 65  he new page-inde
1fef0 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  x array */.     
1ff00 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1ff10 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1ff20 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20  rc, &buf, 4);.  
1ff30 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67          if( pSeg
1ff40 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65  ->iLeafPgno==pSe
1ff50 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
1ff60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ff70 26 26 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44  && pSeg->iEndofD
1ff80 6f 63 6c 69 73 74 3c 70 44 61 74 61 2d 3e 73 7a  oclist<pData->sz
1ff90 4c 65 61 66 20 0a 20 20 20 20 20 20 20 20 20 20  Leaf .          
1ffa0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1ffb0 20 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61   int nDiff = pDa
1ffc0 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65  ta->szLeaf - pSe
1ffd0 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  g->iEndofDoclist
1ffe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
1fff0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
20000 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
20010 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e  f, buf.n - 1 - n
20020 44 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20  Diff - 4);.     
20030 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
20040 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
20050 72 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20  rc, &buf, .     
20060 20 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61             pData
20070 2d 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67  ->nn - pSeg->iPg
20080 69 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e  idxOff, &pData->
20090 70 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66  p[pSeg->iPgidxOf
200a0 66 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f].             
200b0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
200c0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  }..          pSe
200d0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  g->pSeg->pgnoFir
200e0 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d  st = pSeg->iTerm
200f0 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20  LeafPgno;.      
20100 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c 65      fts5DataDele
20110 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  te(p, FTS5_SEGME
20120 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31 29  NT_ROWID(iId, 1)
20130 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  , iLeafRowid);. 
20140 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
20150 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52  aWrite(p, iLeafR
20160 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66  owid, buf.p, buf
20170 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  .n);.        }. 
20180 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
20190 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
201a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
201b0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
201c0 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74  e(&buf);.}..stat
201d0 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
201e0 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a  eChunkCallback(.
201f0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
20200 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
20210 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75    const u8 *pChu
20220 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29  nk, int nChunk.)
20230 7b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  {.  Fts5SegWrite
20240 72 20 2a 70 57 72 69 74 65 72 20 3d 20 28 46 74  r *pWriter = (Ft
20250 73 35 53 65 67 57 72 69 74 65 72 2a 29 70 43 74  s5SegWriter*)pCt
20260 78 3b 0a 20 20 66 74 73 35 57 72 69 74 65 41 70  x;.  fts5WriteAp
20270 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
20280 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43 68 75  p, pWriter, pChu
20290 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a  nk, nChunk);.}..
202a0 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
202b0 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65  void fts5IndexMe
202c0 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35  rgeLevel(.  Fts5
202d0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
202e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
202f0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
20300 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
20310 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
20320 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
20330 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66 20 69  T: Stucture of i
20340 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndex */.  int iL
20350 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  vl,             
20360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
20370 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  el to read input
20380 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
20390 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20 20  pnRem           
203a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
203b0 69 74 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d  ite up to this m
203c0 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65  any output leave
203d0 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74  s */.){.  Fts5St
203e0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
203f0 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
20400 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
20410 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
20420 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
20430 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ];.  Fts5Structu
20440 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74  reLevel *pLvlOut
20450 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49  ;.  Fts5Iter *pI
20460 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
20470 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65  * Iterator to re
20480 61 64 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f  ad input data */
20490 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e  .  int nRem = pn
204a0 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30  Rem ? *pnRem : 0
204b0 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61  ;  /* Output lea
204c0 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20  f pages left to 
204d0 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
204e0 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20 20  Input;          
204f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20500 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65  mber of input se
20510 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35  gments */.  Fts5
20520 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
20530 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;           /* W
20540 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
20550 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
20560 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
20570 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d    /* Output segm
20580 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ent */.  Fts5Buf
20590 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20  fer term;.  int 
205a0 62 4f 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20  bOldest;        
205b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
205c0 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 70 75  rue if the outpu
205d0 74 20 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65  t segment is the
205e0 20 6f 6c 64 65 73 74 20 2a 2f 0a 20 20 69 6e 74   oldest */.  int
205f0 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
20600 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
20610 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
20620 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s = FTS5INDEX_QU
20630 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20  ERY_NOOUTPUT;.  
20640 69 6e 74 20 62 54 65 72 6d 57 72 69 74 74 65 6e  int bTermWritten
20650 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20660 2f 2a 20 54 72 75 65 20 69 66 20 63 75 72 72 65  /* True if curre
20670 6e 74 20 74 65 72 6d 20 61 6c 72 65 61 64 79 20  nt term already 
20680 6f 75 74 70 75 74 20 2a 2f 0a 0a 20 20 61 73 73  output */..  ass
20690 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63  ert( iLvl<pStruc
206a0 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61  t->nLevel );.  a
206b0 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65  ssert( pLvl->nMe
206c0 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20  rge<=pLvl->nSeg 
206d0 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72  );..  memset(&wr
206e0 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  iter, 0, sizeof(
206f0 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b  Fts5SegWriter));
20700 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c  .  memset(&term,
20710 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
20720 75 66 66 65 72 29 29 3b 0a 20 20 69 66 28 20 70  uffer));.  if( p
20730 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
20740 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53     pLvlOut = &pS
20750 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
20760 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  vl+1];.    asser
20770 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  t( pLvlOut->nSeg
20780 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74  >0 );.    nInput
20790 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b   = pLvl->nMerge;
207a0 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76  .    pSeg = &pLv
207b0 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
207c0 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20  ut->nSeg-1];..  
207d0 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28    fts5WriteInit(
207e0 70 2c 20 26 77 72 69 74 65 72 2c 20 70 53 65 67  p, &writer, pSeg
207f0 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 77  ->iSegid);.    w
20800 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67 6e  riter.writer.pgn
20810 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  o = pSeg->pgnoLa
20820 73 74 2b 31 3b 0a 20 20 20 20 77 72 69 74 65 72  st+1;.    writer
20830 2e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 20 20  .iBtPage = 0;.  
20840 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
20850 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f  Segid = fts5Allo
20860 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74  cateSegid(p, pSt
20870 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  ruct);..    /* E
20880 78 74 65 6e 64 20 74 68 65 20 46 74 73 35 53 74  xtend the Fts5St
20890 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 61  ructure object a
208a0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 6e  s required to en
208b0 73 75 72 65 20 74 68 65 20 6f 75 74 70 75 74 0a  sure the output.
208c0 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65      ** segment e
208d0 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66  xists. */.    if
208e0 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d  ( iLvl==pStruct-
208f0 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20  >nLevel-1 ){.   
20900 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
20910 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  AddLevel(&p->rc,
20920 20 70 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20   ppStruct);.    
20930 20 20 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53    pStruct = *ppS
20940 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20  truct;.    }.   
20950 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
20960 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
20970 2c 20 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b  , pStruct, iLvl+
20980 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  1, 1, 0);.    if
20990 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
209a0 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53  ;.    pLvl = &pS
209b0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
209c0 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74  vl];.    pLvlOut
209d0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
209e0 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20  vel[iLvl+1];..  
209f0 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28    fts5WriteInit(
20a00 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65 67  p, &writer, iSeg
20a10 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64  id);..    /* Add
20a20 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74   the new segment
20a30 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 6c   to the output l
20a40 65 76 65 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67  evel */.    pSeg
20a50 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
20a60 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d  g[pLvlOut->nSeg]
20a70 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e  ;.    pLvlOut->n
20a80 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d  Seg++;.    pSeg-
20a90 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a  >pgnoFirst = 1;.
20aa0 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64      pSeg->iSegid
20ab0 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 70   = iSegid;.    p
20ac0 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
20ad0 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  ++;..    /* Read
20ae0 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20   input from all 
20af0 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  segments in the 
20b00 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  input level */. 
20b10 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
20b20 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f  ->nSeg;.  }.  bO
20b30 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74  ldest = (pLvlOut
20b40 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53 74  ->nSeg==1 && pSt
20b50 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c  ruct->nLevel==iL
20b60 76 6c 2b 32 29 3b 0a 0a 20 20 61 73 73 65 72 74  vl+2);..  assert
20b70 28 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66  ( iLvl>=0 );.  f
20b80 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72  or(fts5MultiIter
20b90 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
20ba0 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20  flags, 0, 0, 0, 
20bb0 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70  iLvl, nInput, &p
20bc0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
20bd0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
20be0 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
20bf0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
20c00 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
20c10 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73   0).  ){.    Fts
20c20 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 49 74  5SegIter *pSegIt
20c30 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  er = &pIter->aSe
20c40 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
20c50 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
20c60 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20    int nPos;     
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c80 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  /* position-list
20c90 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61 6c 75   size field valu
20ca0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65  e */.    int nTe
20cb0 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38  rm;.    const u8
20cc0 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20 70 54   *pTerm;..    pT
20cd0 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  erm = fts5MultiI
20ce0 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
20cf0 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
20d00 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c  nTerm!=term.n ||
20d10 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74   memcmp(pTerm, t
20d20 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b  erm.p, nTerm) ){
20d30 0a 20 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d  .      if( pnRem
20d40 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66   && writer.nLeaf
20d50 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a  Written>nRem ){.
20d60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
20d80 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
20d90 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c  c, &term, nTerm,
20da0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62   pTerm);.      b
20db0 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 30 3b 0a  TermWritten =0;.
20dc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
20dd0 65 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69  eck for key anni
20de0 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  hilation. */.   
20df0 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e   if( pSegIter->n
20e00 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65  Pos==0 && (bOlde
20e10 73 74 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e  st || pSegIter->
20e20 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69  bDel==0) ) conti
20e30 6e 75 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  nue;..    if( p-
20e40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
20e50 26 20 62 54 65 72 6d 57 72 69 74 74 65 6e 3d 3d  & bTermWritten==
20e60 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
20e70 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d  is is a new term
20e80 2e 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20  . Append a term 
20e90 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  to the output se
20ea0 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  gment. */.      
20eb0 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
20ec0 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20  erm(p, &writer, 
20ed0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
20ee0 20 20 20 20 20 62 54 65 72 6d 57 72 69 74 74 65       bTermWritte
20ef0 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 1;.    }..  
20f00 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
20f10 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74  rowid to the out
20f20 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52  put */.    /* WR
20f30 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
20f40 2f 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41  /.    fts5WriteA
20f50 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77  ppendRowid(p, &w
20f60 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69  riter, fts5Multi
20f70 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
20f80 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74  );..    if( eDet
20f90 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
20fa0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
20fb0 66 28 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65  f( pSegIter->bDe
20fc0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  l ){.        fts
20fd0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
20fe0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69  int(&p->rc, &wri
20ff0 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20  ter.writer.buf, 
21000 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
21010 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3e 30  pSegIter->nPos>0
21020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
21030 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
21040 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72  rint(&p->rc, &wr
21050 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c  iter.writer.buf,
21060 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
21070 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
21080 7b 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  {.      /* Appen
21090 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  d the position-l
210a0 69 73 74 20 64 61 74 61 20 74 6f 20 74 68 65 20  ist data to the 
210b0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20  output */.      
210c0 6e 50 6f 73 20 3d 20 70 53 65 67 49 74 65 72 2d  nPos = pSegIter-
210d0 3e 6e 50 6f 73 2a 32 20 2b 20 70 53 65 67 49 74  >nPos*2 + pSegIt
210e0 65 72 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20  er->bDel;.      
210f0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
21100 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
21110 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75  writer.writer.bu
21120 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20  f, nPos);.      
21130 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
21140 28 70 2c 20 70 53 65 67 49 74 65 72 2c 20 28 76  (p, pSegIter, (v
21150 6f 69 64 2a 29 26 77 72 69 74 65 72 2c 20 66 74  oid*)&writer, ft
21160 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c  s5MergeChunkCall
21170 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  back);.    }.  }
21180 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
21190 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
211a0 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65  to disk. Set the
211b0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
211c0 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20  b-tree height.  
211d0 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66  ** and last leaf
211e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20   page number at 
211f0 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
21200 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69  */.  fts5WriteFi
21210 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
21220 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74   &pSeg->pgnoLast
21230 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75  );..  if( fts5Mu
21240 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
21250 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ter) ){.    int 
21260 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  i;..    /* Remov
21270 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
21280 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
21290 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  e %_data table *
212a0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
212b0 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20  <nInput; i++){. 
212c0 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d       fts5DataRem
212d0 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c  oveSegment(p, pL
212e0 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67  vl->aSeg[i].iSeg
212f0 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
21300 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65  /* Remove the re
21310 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73  dundant segments
21320 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
21330 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28  level */.    if(
21340 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e   pLvl->nSeg!=nIn
21350 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  put ){.      int
21360 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e   nMove = (pLvl->
21370 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a  nSeg - nInput) *
21380 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
21390 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
213a0 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76       memmove(pLv
213b0 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  l->aSeg, &pLvl->
213c0 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d  aSeg[nInput], nM
213d0 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ove);.    }.    
213e0 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
213f0 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20  t -= nInput;.   
21400 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e   pLvl->nSeg -= n
21410 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
21420 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20  >nMerge = 0;.   
21430 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   if( pSeg->pgnoL
21440 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
21450 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b  pLvlOut->nSeg--;
21460 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
21470 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  nSegment--;.    
21480 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
21490 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67 6e  ssert( pSeg->pgn
214a0 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66  oLast>0 );.    f
214b0 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
214c0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70  p, pIter);.    p
214d0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49  Lvl->nMerge = nI
214e0 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  nput;.  }..  fts
214f0 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
21500 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  Iter);.  fts5Buf
21510 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
21520 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70    if( pnRem ) *p
21530 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e  nRem -= writer.n
21540 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a  LeafWritten;.}..
21550 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e  /*.** Do up to n
21560 50 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f  Pg pages of auto
21570 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68  merge work on th
21580 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52  e index..**.** R
21590 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
215a0 79 20 63 68 61 6e 67 65 73 20 77 65 72 65 20 61  y changes were a
215b0 63 74 75 61 6c 6c 79 20 6d 61 64 65 2c 20 6f 72  ctually made, or
215c0 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
215d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
215e0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a  fts5IndexMerge(.
215f0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
21600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21610 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
21620 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
21630 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
21640 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
21650 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
21660 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
21670 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67  dex */.  int nPg
21680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21690 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
216a0 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s of work to do 
216b0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 20 20  */.  int nMin   
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216d0 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
216e0 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
216f0 74 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  ts to merge */.)
21700 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e  {.  int nRem = n
21710 50 67 3b 0a 20 20 69 6e 74 20 62 52 65 74 20 3d  Pg;.  int bRet =
21720 20 30 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74   0;.  Fts5Struct
21730 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
21740 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c  ppStruct;.  whil
21750 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e  e( nRem>0 && p->
21760 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21770 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21790 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74   /* To iterate t
217a0 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
217b0 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76  .    int iBestLv
217c0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
217d0 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69   /* Level offeri
217e0 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75  ng the most inpu
217f0 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
21800 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b    int nBest = 0;
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21820 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
21830 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73   segments on bes
21840 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20  t level */..    
21850 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20  /* Set iBestLvl 
21860 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20  to the level to 
21870 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65  read input segme
21880 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20  nts from. */.   
21890 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
218a0 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20  ->nLevel>0 );.  
218b0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
218c0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
218d0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
218e0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
218f0 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
21900 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
21910 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Lvl];.      if( 
21920 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
21930 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
21940 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29  ->nMerge>nBest )
21950 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73  {.          iBes
21960 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
21970 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
21980 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
21990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
219a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
219b0 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
219c0 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  eg>nBest ){.    
219d0 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c      nBest = pLvl
219e0 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20  ->nSeg;.        
219f0 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
21a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21a10 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20      /* If nBest 
21a20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e  is still 0, then
21a30 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   the index must 
21a40 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66  be empty. */.#if
21a50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
21a60 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
21a70 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76   nBest==0 && iLv
21a80 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
21a90 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
21aa0 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
21ab0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
21ac0 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  nSeg==0 );.    }
21ad0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
21ae0 20 6e 42 65 73 74 3c 6e 4d 69 6e 20 26 26 20 70   nBest<nMin && p
21af0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
21b00 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
21b10 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
21b20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 52 65  k;.    }.    bRe
21b30 74 20 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 49  t = 1;.    fts5I
21b40 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
21b50 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73  , &pStruct, iBes
21b60 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  tLvl, &nRem);.  
21b70 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
21b80 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63  ITE_OK && pStruc
21b90 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c  t->aLevel[iBestL
21ba0 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  vl].nMerge==0 ){
21bb0 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
21bc0 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
21bd0 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75  BestLvl+1, pStru
21be0 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ct);.    }.  }. 
21bf0 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
21c00 72 75 63 74 3b 0a 20 20 72 65 74 75 72 6e 20 62  ruct;.  return b
21c10 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  Ret;.}../*.** A 
21c20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c  total of nLeaf l
21c30 65 61 66 20 70 61 67 65 73 20 6f 66 20 64 61 74  eaf pages of dat
21c40 61 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  a has just been 
21c50 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76  flushed to a lev
21c60 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e  el-0.** segment.
21c70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   This function u
21c80 70 64 61 74 65 73 20 74 68 65 20 77 72 69 74 65  pdates the write
21c90 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69  -counter accordi
21ca0 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20  ngly and, if.** 
21cb0 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f  necessary, perfo
21cc0 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  rms incremental 
21cd0 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a  merge work..**.*
21ce0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
21cf0 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
21d00 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
21d10 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
21d20 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
21d30 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
21d40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
21d50 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
21d60 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41   void fts5IndexA
21d70 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35  utomerge(.  Fts5
21d80 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
21d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21da0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
21db0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
21dc0 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
21dd0 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
21de0 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
21df0 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
21e00 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20  .  int nLeaf    
21e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21e30 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75  output leaves ju
21e40 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b  st written */.){
21e50 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
21e60 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43  LITE_OK && p->pC
21e70 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67  onfig->nAutomerg
21e80 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53  e>0 ){.    Fts5S
21e90 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
21ea0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
21eb0 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20     u64 nWrite;  
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ed0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
21ee0 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74  e of write-count
21ef0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57  er */.    int nW
21f00 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ork;            
21f10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21f20 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61  r of work-quanta
21f30 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20   to perform */. 
21f40 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20     int nRem;    
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
21f70 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f  af pages left to
21f80 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f   write */..    /
21f90 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69  * Update the wri
21fa0 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c  te-counter. Whil
21fb0 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20  e doing so, set 
21fc0 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57  nWork. */.    nW
21fd0 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e  rite = pStruct->
21fe0 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
21ff0 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29     nWork = (int)
22000 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61  (((nWrite + nLea
22010 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  f) / p->nWorkUni
22020 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70  t) - (nWrite / p
22030 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20  ->nWorkUnit));. 
22040 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69     pStruct->nWri
22050 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65  teCounter += nLe
22060 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28  af;.    nRem = (
22070 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69  int)(p->nWorkUni
22080 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72  t * nWork * pStr
22090 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20  uct->nLevel);.. 
220a0 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
220b0 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e  e(p, ppStruct, n
220c0 52 65 6d 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  Rem, p->pConfig-
220d0 3e 6e 41 75 74 6f 6d 65 72 67 65 29 3b 0a 20 20  >nAutomerge);.  
220e0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
220f0 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
22100 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  merge(.  Fts5Ind
22110 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
22120 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
22130 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
22140 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
22150 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20  re **ppStruct   
22160 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
22170 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
22180 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  e of index */.){
22190 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72  .  const int nCr
221a0 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  isis = p->pConfi
221b0 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b  g->nCrisisMerge;
221c0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
221d0 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
221e0 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76  truct;.  int iLv
221f0 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
22200 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
22210 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e  OK || pStruct->n
22220 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69  Level>0 );.  whi
22230 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
22240 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d  E_OK && pStruct-
22250 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
22260 65 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20  eg>=nCrisis ){. 
22270 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
22280 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75  eLevel(p, &pStru
22290 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20  ct, iLvl, 0);.  
222a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
222b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
222c0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69  truct->nLevel>(i
222d0 4c 76 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66 74  Lvl+1) );.    ft
222e0 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
222f0 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53  te(p, iLvl+1, pS
22300 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c  truct);.    iLvl
22310 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72  ++;.  }.  *ppStr
22320 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d  uct = pStruct;.}
22330 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
22340 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73  5IndexReturn(Fts
22350 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
22360 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
22370 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
22380 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  K;.  return rc;.
22390 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
223a0 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 46  t Fts5FlushCtx F
223b0 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72  ts5FlushCtx;.str
223c0 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
223d0 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a   {.  Fts5Index *
223e0 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57  pIdx;.  Fts5SegW
223f0 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d  riter writer; .}
22400 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20  ;../*.** Buffer 
22410 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  aBuf[] contains 
22420 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74  a list of varint
22430 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f  s, all small eno
22440 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e  ugh to fit.** in
22450 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
22460 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  r. Return the si
22470 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ze of the larges
22480 74 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73  t prefix of this
22490 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62   .** list nMax b
224a0 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20  ytes or less in 
224b0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
224c0 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50  int fts5PoslistP
224d0 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a  refix(const u8 *
224e0 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b  aBuf, int nMax){
224f0 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33  .  int ret;.  u3
22500 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d  2 dummy;.  ret =
22510 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
22520 28 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20  (aBuf, dummy);. 
22530 20 69 66 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b   if( ret<nMax ){
22540 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
22550 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 66  .      int i = f
22560 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
22570 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79  aBuf[ret], dummy
22580 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 72 65  );.      if( (re
22590 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20  t + i) > nMax ) 
225a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 65 74  break;.      ret
225b0 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d   += i;.    }.  }
225c0 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
225d0 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68  ../*.** Flush th
225e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  e contents of in
225f0 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
22600 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65  le iHash to a ne
22610 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65  w level-0 .** se
22620 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41  gment on disk. A
22630 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63  lso update the c
22640 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72  orresponding str
22650 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a  ucture record..*
22660 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
22670 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
22680 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
22690 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
226a0 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
226b0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
226c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
226d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
226e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75  tic void fts5Flu
226f0 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e  shOneHash(Fts5In
22700 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48  dex *p){.  Fts5H
22710 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e  ash *pHash = p->
22720 70 48 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72  pHash;.  Fts5Str
22730 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
22740 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20  .  int iSegid;. 
22750 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20   int pgnoLast = 
22760 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22770 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20     /* Last leaf 
22780 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
22790 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  egment */..  /* 
227a0 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
227b0 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ce to the index 
227c0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
227d0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67  locate a new seg
227e0 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72  ment-id.  ** for
227f0 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30   the new level-0
22800 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20   segment.  */.  
22810 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
22820 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
22830 20 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41    iSegid = fts5A
22840 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20  llocateSegid(p, 
22850 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
22860 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
22870 61 74 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 69  ate(p);..  if( i
22880 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e  Segid ){.    con
22890 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d  st int pgsz = p-
228a0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a  >pConfig->pgsz;.
228b0 20 20 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20      int eDetail 
228c0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
228d0 65 74 61 69 6c 3b 0a 20 20 20 20 46 74 73 35 53  etail;.    Fts5S
228e0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
228f0 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20  *pSeg;   /* New 
22900 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70  segment within p
22910 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74  Struct */.    Ft
22920 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
22930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
22940 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
22950 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20  o assemble leaf 
22960 70 61 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35  page */.    Fts5
22970 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20  Buffer *pPgidx; 
22980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
22990 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
229a0 61 73 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a  assemble pgidx *
229b0 2f 0a 0a 20 20 20 20 46 74 73 35 53 65 67 57 72  /..    Fts5SegWr
229c0 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20  iter writer;.   
229d0 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
229e0 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69  , &writer, iSegi
229f0 64 29 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20  d);..    pBuf = 
22a00 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62  &writer.writer.b
22a10 75 66 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d  uf;.    pPgidx =
22a20 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
22a30 70 67 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66  pgidx;..    /* f
22a40 74 73 35 57 72 69 74 65 49 6e 69 74 28 29 20 73  ts5WriteInit() s
22a50 68 6f 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69  hould have initi
22a60 61 6c 69 7a 65 64 20 74 68 65 20 62 75 66 66 65  alized the buffe
22a70 72 73 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65  rs to (most like
22a80 6c 79 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d  ly).    ** the m
22a90 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
22aa0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73  uired. */.    as
22ab0 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70  sert( p->rc || p
22ac0 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67  Buf->nSpace>=(pg
22ad0 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  sz + FTS5_DATA_P
22ae0 41 44 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61  ADDING) );.    a
22af0 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
22b00 70 50 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d  pPgidx->nSpace>=
22b10 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54  (pgsz + FTS5_DAT
22b20 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20  A_PADDING) );.. 
22b30 20 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e     /* Begin scan
22b40 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73  ning through has
22b50 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e  h table entries.
22b60 20 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   This loop runs 
22b70 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20  once for each.  
22b80 20 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73    ** term/doclis
22b90 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  t currently stor
22ba0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 68 61  ed within the ha
22bb0 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  sh table. */.   
22bc0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
22bd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
22be0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
22bf0 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70  s5HashScanInit(p
22c00 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Hash, 0, 0);.   
22c10 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d   }.    while( p-
22c20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
22c30 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  & 0==sqlite3Fts5
22c40 48 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73  HashScanEof(pHas
22c50 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  h) ){.      cons
22c60 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20  t char *zTerm;  
22c70 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
22c80 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72  r containing ter
22c90 6d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  m */.      const
22ca0 20 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20   u8 *pDoclist;  
22cb0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
22cc0 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72  r to doclist for
22cd0 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
22ce0 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74      int nDoclist
22cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22d00 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
22d10 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  st in bytes */..
22d20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
22d30 68 65 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73  he term for this
22d40 20 65 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20   entry to disk. 
22d50 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
22d60 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72  Fts5HashScanEntr
22d70 79 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  y(pHash, &zTerm,
22d80 20 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f   &pDoclist, &nDo
22d90 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74  clist);.      ft
22da0 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
22db0 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69  m(p, &writer, (i
22dc0 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29  nt)strlen(zTerm)
22dd0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65  , (const u8*)zTe
22de0 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rm);.      if( p
22df0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
22e00 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
22e10 61 73 73 65 72 74 28 20 77 72 69 74 65 72 2e 62  assert( writer.b
22e20 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
22e30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
22e40 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20   pgsz>=(pBuf->n 
22e50 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44  + pPgidx->n + nD
22e60 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20  oclist + 1) ){. 
22e70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
22e80 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c  tire doclist wil
22e90 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72  l fit on the cur
22ea0 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20  rent leaf. */.  
22eb0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
22ec0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
22ed0 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e  Buf, pDoclist, n
22ee0 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Doclist);.      
22ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
22f00 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20  64 iRowid = 0;. 
22f10 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74         i64 iDelt
22f20 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  a = 0;.        i
22f30 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  nt iOff = 0;..  
22f40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
22f50 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c  ire doclist will
22f60 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73   not fit on this
22f70 20 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f   leaf. The follo
22f80 77 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  wing .        **
22f90 20 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74   loop iterates t
22fa0 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69  hrough the posli
22fb0 73 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  sts that make up
22fc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
22fd0 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74        ** doclist
22fe0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
22ff0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
23000 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44  TE_OK && iOff<nD
23010 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oclist ){.      
23020 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
23030 47 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c  GetVarint(&pDocl
23040 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ist[iOff], (u64*
23050 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
23060 20 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69       iRowid += i
23070 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20  Delta;.         
23080 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20   .          if( 
23090 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77  writer.bFirstRow
230a0 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
230b0 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55          fts5PutU
230c0 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20  16(&pBuf->p[0], 
230d0 28 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20 20  (u16)pBuf->n);  
230e0 20 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20   /* first rowid 
230f0 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  on page */.     
23100 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
23110 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  = sqlite3Fts5Put
23120 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
23130 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64  pBuf->n], iRowid
23140 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  );.            w
23150 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
23160 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  dInPage = 0;.   
23170 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
23180 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c  teDlidxAppend(p,
23190 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64   &writer, iRowid
231a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
231b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
231c0 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
231d0 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
231e0 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
231f0 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  ], iDelta);.    
23200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23210 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
23220 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20  n<=pBuf->nSpace 
23230 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
23240 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
23250 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
23260 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
23270 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20  Off<nDoclist && 
23280 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d  pDoclist[iOff]==
23290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
232a0 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d     pBuf->p[pBuf-
232b0 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  >n++] = 0;.     
232c0 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b           iOff++;
232d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
232e0 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  f( iOff<nDoclist
232f0 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66   && pDoclist[iOf
23300 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
23310 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70           pBuf->p
23320 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b  [pBuf->n++] = 0;
23330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23340 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20   iOff++;.       
23350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23370 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20     if( (pBuf->n 
23380 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67  + pPgidx->n)>=pg
23390 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
233a0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
233b0 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65  shLeaf(p, &write
233c0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
233d0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
233e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
233f0 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20  nt bDummy;.     
23400 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b         int nPos;
23410 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
23420 20 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74   nCopy = fts5Get
23430 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f  PoslistSize(&pDo
23440 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50  clist[iOff], &nP
23450 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
23460 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
23470 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  += nPos;.       
23480 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e       if( (pBuf->
23490 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20  n + pPgidx->n + 
234a0 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20 29  nCopy) <= pgsz )
234b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
234c0 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f  /* The entire po
234d0 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f  slist will fit o
234e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  n the current le
234f0 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20 20  af. So copy.    
23500 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
23510 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20  in one go. */.  
23520 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
23530 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
23540 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63  Blob(pBuf, &pDoc
23550 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70  list[iOff], nCop
23560 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
23570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23580 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
23590 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20  re poslist will 
235a0 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20  not fit on this 
235b0 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64  leaf. So it need
235c0 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
235d0 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20  ** to be broken 
235e0 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54  into sections. T
235f0 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63  he only qualific
23600 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20  ation being.    
23610 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
23620 74 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75  t each varint mu
23630 73 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e  st be stored con
23640 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20  tiguously.  */. 
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
23660 73 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74 20  st u8 *pPoslist 
23670 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  = &pDoclist[iOff
23680 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
23690 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20   int iPos = 0;. 
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69               whi
236b0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
236c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
236d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61          int nSpa
236e0 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66  ce = pgsz - pBuf
236f0 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e 3b  ->n - pPgidx->n;
23700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23710 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
23720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23730 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d  (nCopy - iPos)<=
23740 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  nSpace ){.      
23750 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
23760 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20  nCopy - iPos;.  
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
23780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23790 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50         n = fts5P
237a0 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26 70 50  oslistPrefix(&pP
237b0 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53  oslist[iPos], nS
237c0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  pace);.         
237d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
237e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
237f0 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   n>0 );.        
23800 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
23810 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
23820 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74  (pBuf, &pPoslist
23830 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20  [iPos], n);.    
23840 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73              iPos
23850 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   += n;.         
23860 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66         if( (pBuf
23870 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29  ->n + pPgidx->n)
23880 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  >=pgsz ){.      
23890 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
238a0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
238b0 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20  , &writer);.    
238c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
238e0 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20  ( iPos>=nCopy ) 
238f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
23900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23920 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a   iOff += nCopy;.
23930 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23940 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
23950 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20 44       /* TODO2: D
23960 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  oclist terminato
23970 72 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e 20  r written here. 
23980 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75 66  */.      /* pBuf
23990 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
239a0 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20 20   '\0'; */.      
239b0 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c  assert( pBuf->n<
239c0 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b  =pBuf->nSpace );
239d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
239e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73 71  ==SQLITE_OK ) sq
239f0 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
23a00 6e 4e 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20  nNext(pHash);.  
23a10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
23a20 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 48 61  ts5HashClear(pHa
23a30 73 68 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  sh);.    fts5Wri
23a40 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69  teFinish(p, &wri
23a50 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b  ter, &pgnoLast);
23a60 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
23a70 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  the Fts5Structur
23a80 65 2e 20 49 74 20 69 73 20 77 72 69 74 74 65 6e  e. It is written
23a90 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
23aa0 61 62 61 73 65 20 62 79 20 74 68 65 0a 20 20 20  abase by the.   
23ab0 20 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75 72   ** fts5Structur
23ac0 65 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20  eRelease() call 
23ad0 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69  below.  */.    i
23ae0 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  f( pStruct->nLev
23af0 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  el==0 ){.      f
23b00 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
23b10 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53  evel(&p->rc, &pS
23b20 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20  truct);.    }.  
23b30 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
23b40 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
23b50 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31  c, pStruct, 0, 1
23b60 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
23b70 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
23b80 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26  {.      pSeg = &
23b90 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
23ba0 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74  0].aSeg[ pStruct
23bb0 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67  ->aLevel[0].nSeg
23bc0 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67  ++ ];.      pSeg
23bd0 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
23be0 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  d;.      pSeg->p
23bf0 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  gnoFirst = 1;.  
23c00 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61      pSeg->pgnoLa
23c10 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20  st = pgnoLast;. 
23c20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53       pStruct->nS
23c30 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  egment++;.    }.
23c40 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
23c50 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70  ePromote(p, 0, p
23c60 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20  Struct);.  }..  
23c70 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72  fts5IndexAutomer
23c80 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  ge(p, &pStruct, 
23c90 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73  pgnoLast);.  fts
23ca0 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67  5IndexCrisismerg
23cb0 65 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a  e(p, &pStruct);.
23cc0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
23cd0 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29  rite(p, pStruct)
23ce0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
23cf0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
23d00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  );.}../*.** Flus
23d10 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  h any data store
23d20 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
23d30 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74  ry hash tables t
23d40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
23d50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
23d60 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74  ts5IndexFlush(Ft
23d70 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f  s5Index *p){.  /
23d80 2a 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65  * Unless it is e
23d90 6d 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20  mpty, flush the 
23da0 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69  hash table to di
23db0 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  sk */.  if( p->n
23dc0 50 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20  PendingData ){. 
23dd0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48     assert( p->pH
23de0 61 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50  ash );.    p->nP
23df0 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
23e00 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65      fts5FlushOne
23e10 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  Hash(p);.  }.}..
23e20 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63  static Fts5Struc
23e30 74 75 72 65 20 2a 66 74 73 35 49 6e 64 65 78 4f  ture *fts5IndexO
23e40 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28 0a 20  ptimizeStruct(. 
23e50 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
23e60 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
23e70 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20 46 74  *pStruct.){.  Ft
23e80 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65  s5Structure *pNe
23e90 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  w = 0;.  sqlite3
23ea0 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73  _int64 nByte = s
23eb0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
23ec0 75 72 65 29 3b 0a 20 20 69 6e 74 20 6e 53 65 67  ure);.  int nSeg
23ed0 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67   = pStruct->nSeg
23ee0 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ment;.  int i;..
23ef0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
23f00 69 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  if this structur
23f10 65 20 72 65 71 75 69 72 65 73 20 6f 70 74 69 6d  e requires optim
23f20 69 7a 61 74 69 6f 6e 2e 20 41 20 73 74 72 75 63  ization. A struc
23f30 74 75 72 65 20 64 6f 65 73 0a 20 20 2a 2a 20 6e  ture does.  ** n
23f40 6f 74 20 72 65 71 75 69 72 65 20 6f 70 74 69 6d  ot require optim
23f50 69 7a 61 74 69 6f 6e 20 69 66 20 65 69 74 68 65  ization if eithe
23f60 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 2b 20  r:.  **.  **  + 
23f70 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 66  it consists of f
23f80 65 77 65 72 20 74 68 61 6e 20 74 77 6f 20 73 65  ewer than two se
23f90 67 6d 65 6e 74 73 2c 20 6f 72 20 0a 20 20 2a 2a  gments, or .  **
23fa0 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73    + all segments
23fb0 20 61 72 65 20 6f 6e 20 74 68 65 20 73 61 6d 65   are on the same
23fc0 20 6c 65 76 65 6c 2c 20 6f 72 0a 20 20 2a 2a 20   level, or.  ** 
23fd0 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20   + all segments 
23fe0 65 78 63 65 70 74 20 6f 6e 65 20 61 72 65 20 63  except one are c
23ff0 75 72 72 65 6e 74 6c 79 20 69 6e 70 75 74 73 20  urrently inputs 
24000 74 6f 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61  to a merge opera
24010 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion..  **.  ** 
24020 49 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 73  In the first cas
24030 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  e, return NULL. 
24040 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 69  In the second, i
24050 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
24060 2d 63 6f 75 6e 74 0a 20 20 2a 2a 20 6f 6e 20 2a  -count.  ** on *
24070 70 53 74 72 75 63 74 20 61 6e 64 20 72 65 74 75  pStruct and retu
24080 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  rn a copy of the
24090 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a   pointer to it..
240a0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53 65 67 3c    */.  if( nSeg<
240b0 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
240c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75  for(i=0; i<pStru
240d0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  ct->nLevel; i++)
240e0 7b 0a 20 20 20 20 69 6e 74 20 6e 54 68 69 73 20  {.    int nThis 
240f0 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
24100 6c 5b 69 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 69  l[i].nSeg;.    i
24110 66 28 20 6e 54 68 69 73 3d 3d 6e 53 65 67 20 7c  f( nThis==nSeg |
24120 7c 20 28 6e 54 68 69 73 3d 3d 6e 53 65 67 2d 31  | (nThis==nSeg-1
24130 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
24140 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 6e  vel[i].nMerge==n
24150 54 68 69 73 29 20 29 7b 0a 20 20 20 20 20 20 66  This) ){.      f
24160 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
24170 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
24180 72 65 74 75 72 6e 20 70 53 74 72 75 63 74 3b 0a  return pStruct;.
24190 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
241a0 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ( pStruct->aLeve
241b0 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3c 3d 6e 54 68  l[i].nMerge<=nTh
241c0 69 73 20 29 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79  is );.  }..  nBy
241d0 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e  te += (pStruct->
241e0 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65  nLevel+1) * size
241f0 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
24200 4c 65 76 65 6c 29 3b 0a 20 20 70 4e 65 77 20 3d  Level);.  pNew =
24210 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a   (Fts5Structure*
24220 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
24230 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e  ocZero(&p->rc, n
24240 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 4e  Byte);..  if( pN
24250 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  ew ){.    Fts5St
24260 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
24270 76 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  vl;.    nByte = 
24280 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74  nSeg * sizeof(Ft
24290 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
242a0 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nt);.    pNew->n
242b0 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
242c0 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70  >nLevel+1;.    p
242d0 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
242e0 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43     pNew->nWriteC
242f0 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74  ounter = pStruct
24300 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  ->nWriteCounter;
24310 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65  .    pLvl = &pNe
24320 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63  w->aLevel[pStruc
24330 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  t->nLevel];.    
24340 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74  pLvl->aSeg = (Ft
24350 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
24360 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  nt*)sqlite3Fts5M
24370 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63  allocZero(&p->rc
24380 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
24390 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a  ( pLvl->aSeg ){.
243a0 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20        int iLvl, 
243b0 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  iSeg;.      int 
243c0 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20  iSegOut = 0;.   
243d0 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
243e0 72 6f 75 67 68 20 61 6c 6c 20 73 65 67 6d 65 6e  rough all segmen
243f0 74 73 2c 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20  ts, from oldest 
24400 74 6f 20 6e 65 77 65 73 74 2e 20 41 64 64 20 74  to newest. Add t
24410 68 65 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  hem to.      ** 
24420 74 68 65 20 6e 65 77 20 46 74 73 35 4c 65 76 65  the new Fts5Leve
24430 6c 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  l object so that
24440 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 30 5d 20 69   pLvl->aSeg[0] i
24450 73 20 74 68 65 20 6f 6c 64 65 73 74 0a 20 20 20  s the oldest.   
24460 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 6e     ** segment in
24470 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
24480 75 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  ure.  */.      f
24490 6f 72 28 69 4c 76 6c 3d 70 53 74 72 75 63 74 2d  or(iLvl=pStruct-
244a0 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 4c 76 6c 3e  >nLevel-1; iLvl>
244b0 3d 30 3b 20 69 4c 76 6c 2d 2d 29 7b 0a 20 20 20  =0; iLvl--){.   
244c0 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
244d0 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
244e0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
244f0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
24500 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b       pLvl->aSeg[
24510 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75  iSegOut] = pStru
24520 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
24530 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
24540 20 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b         iSegOut++
24550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24560 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
24570 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d  nSegment = pLvl-
24580 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20  >nSeg = nSeg;.  
24590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
245a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
245b0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
245c0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
245d0 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
245e0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
245f0 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73  ndexOptimize(Fts
24600 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
24610 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
24620 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
24630 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
24640 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
24650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
24660 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
24670 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  (p);.  pStruct =
24680 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24690 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72  ad(p);.  fts5Str
246a0 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
246b0 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 72  (p);..  if( pStr
246c0 75 63 74 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  uct ){.    pNew 
246d0 3d 20 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d  = fts5IndexOptim
246e0 69 7a 65 53 74 72 75 63 74 28 70 2c 20 70 53 74  izeStruct(p, pSt
246f0 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73  ruct);.  }.  fts
24700 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
24710 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 61  e(pStruct);..  a
24720 73 73 65 72 74 28 20 70 4e 65 77 3d 3d 30 20 7c  ssert( pNew==0 |
24730 7c 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74  | pNew->nSegment
24740 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  >0 );.  if( pNew
24750 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
24760 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ;.    for(iLvl=0
24770 3b 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69  ; pNew->aLevel[i
24780 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 4c  Lvl].nSeg==0; iL
24790 76 6c 2b 2b 29 7b 7d 0a 20 20 20 20 77 68 69 6c  vl++){}.    whil
247a0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
247b0 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c 65  _OK && pNew->aLe
247c0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30  vel[iLvl].nSeg>0
247d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   ){.      int nR
247e0 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f  em = FTS5_OPT_WO
247f0 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20 66  RK_UNIT;.      f
24800 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
24810 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c 76  el(p, &pNew, iLv
24820 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 7d  l, &nRem);.    }
24830 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ..    fts5Struct
24840 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e 65 77  ureWrite(p, pNew
24850 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
24860 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e 65 77  tureRelease(pNew
24870 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
24880 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
24890 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (p); .}../*.** T
248a0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  his is called to
248b0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73   implement the s
248c0 70 65 63 69 61 6c 20 22 56 41 4c 55 45 53 28 27  pecial "VALUES('
248d0 6d 65 72 67 65 27 2c 20 24 6e 4d 65 72 67 65 29  merge', $nMerge)
248e0 22 0a 2a 2a 20 49 4e 53 45 52 54 20 63 6f 6d 6d  ".** INSERT comm
248f0 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  and..*/.int sqli
24900 74 65 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67  te3Fts5IndexMerg
24910 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
24920 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46  int nMerge){.  F
24930 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
24940 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
24950 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
24960 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
24970 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 2d     int nMin = p-
24980 3e 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65 72 6d  >pConfig->nUserm
24990 65 72 67 65 3b 0a 20 20 20 20 66 74 73 35 53 74  erge;.    fts5St
249a0 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
249b0 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 4d  e(p);.    if( nM
249c0 65 72 67 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  erge<0 ){.      
249d0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
249e0 4e 65 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f  New = fts5IndexO
249f0 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c  ptimizeStruct(p,
24a00 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20   pStruct);.     
24a10 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24a20 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
24a30 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20        pStruct = 
24a40 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4d 69 6e  pNew;.      nMin
24a50 20 3d 20 32 3b 0a 20 20 20 20 20 20 6e 4d 65 72   = 2;.      nMer
24a60 67 65 20 3d 20 6e 4d 65 72 67 65 2a 2d 31 3b 0a  ge = nMerge*-1;.
24a70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
24a80 74 72 75 63 74 20 26 26 20 70 53 74 72 75 63 74  truct && pStruct
24a90 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  ->nLevel ){.    
24aa0 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 4d    if( fts5IndexM
24ab0 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
24ac0 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29 20  , nMerge, nMin) 
24ad0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
24ae0 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
24af0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20   pStruct);.     
24b00 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73   }.    }.    fts
24b10 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
24b20 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  e(pStruct);.  }.
24b30 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
24b40 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
24b50 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24b60 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46  AppendRowid(.  F
24b70 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
24b80 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73  64 iDelta,.  Fts
24b90 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64 2c 0a  5Iter *pUnused,.
24ba0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
24bb0 75 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  uf.){.  UNUSED_P
24bc0 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20  ARAM(pUnused);. 
24bd0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
24be0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
24bf0 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 7d  pBuf, iDelta);.}
24c00 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
24c10 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 28  s5AppendPoslist(
24c20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
24c30 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20  .  i64 iDelta,. 
24c40 20 46 74 73 35 49 74 65 72 20 2a 70 4d 75 6c 74   Fts5Iter *pMult
24c50 69 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i,.  Fts5Buffer 
24c60 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 6e  *pBuf.){.  int n
24c70 44 61 74 61 20 3d 20 70 4d 75 6c 74 69 2d 3e 62  Data = pMulti->b
24c80 61 73 65 2e 6e 44 61 74 61 3b 0a 20 20 61 73 73  ase.nData;.  ass
24c90 65 72 74 28 20 6e 44 61 74 61 3e 30 20 29 3b 0a  ert( nData>0 );.
24ca0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
24cb0 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74 73  ITE_OK && 0==fts
24cc0 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
24cd0 72 63 2c 20 70 42 75 66 2c 20 6e 44 61 74 61 2b  rc, pBuf, nData+
24ce0 39 2b 39 29 20 29 7b 0a 20 20 20 20 66 74 73 35  9+9) ){.    fts5
24cf0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
24d00 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65  Varint(pBuf, iDe
24d10 6c 74 61 29 3b 0a 20 20 20 20 66 74 73 35 42 75  lta);.    fts5Bu
24d20 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
24d30 72 69 6e 74 28 70 42 75 66 2c 20 6e 44 61 74 61  rint(pBuf, nData
24d40 2a 32 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  *2);.    fts5Buf
24d50 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
24d60 62 28 70 42 75 66 2c 20 70 4d 75 6c 74 69 2d 3e  b(pBuf, pMulti->
24d70 62 61 73 65 2e 70 44 61 74 61 2c 20 6e 44 61 74  base.pData, nDat
24d80 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74  a);.  }.}...stat
24d90 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
24da0 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35  istIterNext(Fts5
24db0 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
24dc0 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70  er){.  u8 *p = p
24dd0 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b  Iter->aPoslist +
24de0 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20   pIter->nSize + 
24df0 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b  pIter->nPoslist;
24e00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
24e10 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20  r->aPoslist );. 
24e20 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61   if( p>=pIter->a
24e30 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  Eof ){.    pIter
24e40 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a  ->aPoslist = 0;.
24e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
24e60 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20   iDelta;..    p 
24e70 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
24e80 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  (p, (u64*)&iDelt
24e90 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
24ea0 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
24eb0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f  ..    /* Read po
24ec0 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65  sition list size
24ed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d   */.    if( p[0]
24ee0 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20   & 0x80 ){.     
24ef0 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
24f00 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20   pIter->nSize = 
24f10 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
24f20 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20  p, nPos);.      
24f30 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20  pIter->nPoslist 
24f40 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20  = (nPos>>1);.   
24f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
24f60 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20  ter->nPoslist = 
24f70 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e  ((int)(p[0])) >>
24f80 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   1;.      pIter-
24f90 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20  >nSize = 1;.    
24fa0 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  }..    pIter->aP
24fb0 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a  oslist = p;.  }.
24fc0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
24fd0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
24fe0 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  it(.  Fts5Buffer
24ff0 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44   *pBuf, .  Fts5D
25000 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
25010 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49  r.){.  memset(pI
25020 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
25030 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
25040 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75  ->aPoslist = pBu
25050 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61  f->p;.  pIter->a
25060 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70  Eof = &pBuf->p[p
25070 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44  Buf->n];.  fts5D
25080 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
25090 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a  Iter);.}..#if 0.
250a0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64  /*.** Append a d
250b0 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72  oclist to buffer
250c0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
250d0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
250e0 65 73 20 74 68 61 74 20 73 70 61 63 65 20 77 69  es that space wi
250f0 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  thin the buffer 
25100 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
25110 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  .** allocated..*
25120 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
25130 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
25140 69 64 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  id(.  Fts5Buffer
25150 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
25160 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
25170 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
25180 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69   i64 *piLastRowi
25190 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
251a0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76   /* IN/OUT: Prev
251b0 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74 74  ious rowid writt
251c0 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  en (if any) */. 
251d0 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20   i64 iRowid     
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70   /* Rowid to app
25200 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  end */.){.  asse
25210 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c  rt( pBuf->n!=0 |
25220 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29  | (*piLastRowid)
25230 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66  ==0 );.  fts5Buf
25240 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
25250 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64  int(pBuf, iRowid
25260 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29   - *piLastRowid)
25270 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  ;.  *piLastRowid
25280 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e   = iRowid;.}.#en
25290 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  dif..#define fts
252a0 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
252b0 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77  d(pBuf, iLastRow
252c0 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20  id, iRowid) {   
252d0 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20      \.  assert( 
252e0 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20  (pBuf)->n!=0 || 
252f0 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20  (iLastRowid)==0 
25300 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
25310 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66       \.  fts5Buf
25320 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
25330 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f  int((pBuf), (iRo
25340 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77  wid) - (iLastRow
25350 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74  id)); \.  (iLast
25360 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64  Rowid) = (iRowid
25370 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
253a0 2a 20 53 77 61 70 20 74 68 65 20 63 6f 6e 74 65  * Swap the conte
253b0 6e 74 73 20 6f 66 20 62 75 66 66 65 72 20 2a 70  nts of buffer *p
253c0 31 20 77 69 74 68 20 74 68 61 74 20 6f 66 20 2a  1 with that of *
253d0 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  p2..*/.static vo
253e0 69 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61  id fts5BufferSwa
253f0 70 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31  p(Fts5Buffer *p1
25400 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32  , Fts5Buffer *p2
25410 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ){.  Fts5Buffer 
25420 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31  tmp = *p1;.  *p1
25430 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20   = *p2;.  *p2 = 
25440 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  tmp;.}..static v
25450 6f 69 64 20 66 74 73 35 4e 65 78 74 52 6f 77 69  oid fts5NextRowi
25460 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  d(Fts5Buffer *pB
25470 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66 2c 20  uf, int *piOff, 
25480 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20  i64 *piRowid){. 
25490 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66 66 3b   int i = *piOff;
254a0 0a 20 20 69 66 28 20 69 3e 3d 70 42 75 66 2d 3e  .  if( i>=pBuf->
254b0 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66 66 20  n ){.    *piOff 
254c0 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
254d0 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20     u64 iVal;.   
254e0 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20 73 71   *piOff = i + sq
254f0 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
25500 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d 2c 20  nt(&pBuf->p[i], 
25510 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 52  &iVal);.    *piR
25520 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
25530 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
25540 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  is the equivalen
25550 74 20 6f 66 20 66 74 73 35 4d 65 72 67 65 50 72  t of fts5MergePr
25560 65 66 69 78 4c 69 73 74 73 28 29 20 66 6f 72 20  efixLists() for 
25570 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65  detail=none mode
25580 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73  ..** In this cas
25590 65 20 74 68 65 20 62 75 66 66 65 72 73 20 63 6f  e the buffers co
255a0 6e 73 69 73 74 20 6f 66 20 61 20 64 65 6c 74 61  nsist of a delta
255b0 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74 20 6f 66  -encoded list of
255c0 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a 2a 2f   rowids only..*/
255d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
255e0 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73  5MergeRowidLists
255f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
25600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25610 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
25620 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
25630 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25650 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f  /* First list to
25660 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35   merge */.  Fts5
25670 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20  Buffer *p2      
25680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25690 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65  econd list to me
256a0 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rge */.){.  int 
256b0 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 32  i1 = 0;.  int i2
256c0 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77   = 0;.  i64 iRow
256d0 69 64 31 20 3d 20 30 3b 0a 20 20 69 36 34 20 69  id1 = 0;.  i64 i
256e0 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20 69 36  Rowid2 = 0;.  i6
256f0 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 46  4 iOut = 0;..  F
25700 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20  ts5Buffer out;. 
25710 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c   memset(&out, 0,
25720 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20   sizeof(out));. 
25730 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
25740 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
25750 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d  out, p1->n + p2-
25760 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  >n);.  if( p->rc
25770 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74   ) return;..  ft
25780 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20  s5NextRowid(p1, 
25790 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a  &i1, &iRowid1);.
257a0 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
257b0 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64  p2, &i2, &iRowid
257c0 32 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 31 3e  2);.  while( i1>
257d0 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b 0a 20  =0 || i2>=0 ){. 
257e0 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20     if( i1>=0 && 
257f0 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69 64 31  (i2<0 || iRowid1
25800 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a 20 20 20  <iRowid2) ){.   
25810 20 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d     assert( iOut=
25820 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e 69 4f  =0 || iRowid1>iO
25830 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ut );.      fts5
25840 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
25850 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f  Varint(&out, iRo
25860 77 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a 20 20  wid1 - iOut);.  
25870 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69      iOut = iRowi
25880 64 31 3b 0a 20 20 20 20 20 20 66 74 73 35 4e 65  d1;.      fts5Ne
25890 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c  xtRowid(p1, &i1,
258a0 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20   &iRowid1);.    
258b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
258c0 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20  ert( iOut==0 || 
258d0 69 52 6f 77 69 64 32 3e 69 4f 75 74 20 29 3b 0a  iRowid2>iOut );.
258e0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
258f0 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
25900 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 32 20 2d  (&out, iRowid2 -
25910 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f   iOut);.      iO
25920 75 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20 20  ut = iRowid2;.  
25930 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26      if( i1>=0 &&
25940 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77 69 64   iRowid1==iRowid
25950 32 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  2 ){.        fts
25960 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26  5NextRowid(p1, &
25970 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20  i1, &iRowid1);. 
25980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
25990 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26  5NextRowid(p2, &
259a0 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20  i2, &iRowid2);. 
259b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
259c0 42 75 66 66 65 72 53 77 61 70 28 26 6f 75 74 2c  BufferSwap(&out,
259d0 20 70 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66   p1);.  fts5Buff
259e0 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d 0a  erFree(&out);.}.
259f0 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70  ./*.** Buffers p
25a00 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e  1 and p2 contain
25a10 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20   doclists. This 
25a20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20  function merges 
25a30 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f  the content.** o
25a40 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73  f the two doclis
25a50 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20  ts together and 
25a60 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74  sets buffer p1 t
25a70 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66  o the result bef
25a80 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
25a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
25aa0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
25ab0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
25ac0 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61  t in p->rc. If a
25ad0 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61  n error has.** a
25ae0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
25af0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25b00 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
25b10 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
25b20 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a  rgePrefixLists(.
25b30 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b50 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
25b60 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
25b70 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20  s5Buffer *p1,   
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b90 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d   First list to m
25ba0 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  erge */.  Fts5Bu
25bb0 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20  ffer *p2        
25bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
25bd0 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  ond list to merg
25be0 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32  e */.){.  if( p2
25bf0 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ->n ){.    i64 i
25c00 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
25c10 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
25c20 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44  er i1;.    Fts5D
25c30 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20  oclistIter i2;. 
25c40 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75     Fts5Buffer ou
25c50 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20  t = {0, 0, 0};. 
25c60 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d     Fts5Buffer tm
25c70 70 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a  p = {0, 0, 0};..
25c80 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
25c90 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  um size of the o
25ca0 75 74 70 75 74 20 69 73 20 65 71 75 61 6c 20 74  utput is equal t
25cb0 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
25cc0 20 74 77 6f 20 0a 20 20 20 20 2a 2a 20 69 6e 70   two .    ** inp
25cd0 75 74 20 73 69 7a 65 73 20 2b 20 31 20 76 61 72  ut sizes + 1 var
25ce0 69 6e 74 20 28 39 20 62 79 74 65 73 29 2e 20 54  int (9 bytes). T
25cf0 68 65 20 65 78 74 72 61 20 76 61 72 69 6e 74 20  he extra varint 
25d00 69 73 20 62 65 63 61 75 73 65 20 69 66 20 74 68  is because if th
25d10 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 72  e.    ** first r
25d20 6f 77 69 64 20 69 6e 20 6f 6e 65 20 69 6e 70 75  owid in one inpu
25d30 74 20 69 73 20 61 20 6c 61 72 67 65 20 6e 65 67  t is a large neg
25d40 61 74 69 76 65 20 6e 75 6d 62 65 72 2c 20 61 6e  ative number, an
25d50 64 20 74 68 65 20 66 69 72 73 74 20 69 6e 0a 20  d the first in. 
25d60 20 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20     ** the other 
25d70 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e  a non-negative n
25d80 75 6d 62 65 72 2c 20 74 68 65 20 64 65 6c 74 61  umber, the delta
25d90 20 66 6f 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67   for the non-neg
25da0 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  ative.    ** num
25db0 62 65 72 20 77 69 6c 6c 20 62 65 20 6c 61 72 67  ber will be larg
25dc0 65 72 20 6f 6e 20 64 69 73 6b 20 74 68 61 6e 20  er on disk than 
25dd0 74 68 65 20 6c 69 74 65 72 61 6c 20 69 6e 74 65  the literal inte
25de0 67 65 72 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  ger value.    **
25df0 20 77 61 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66   was.  */.    if
25e00 28 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  ( sqlite3Fts5Buf
25e10 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
25e20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32  &out, p1->n + p2
25e30 2d 3e 6e 20 2b 20 39 29 20 29 20 72 65 74 75 72  ->n + 9) ) retur
25e40 6e 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  n;.    fts5Docli
25e50 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20 26  stIterInit(p1, &
25e60 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  i1);.    fts5Doc
25e70 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c  listIterInit(p2,
25e80 20 26 69 32 29 3b 0a 0a 20 20 20 20 77 68 69 6c   &i2);..    whil
25e90 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
25ea0 28 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69  ( i1.iRowid<i2.i
25eb0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
25ec0 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
25ed0 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20  rom i1 */.      
25ee0 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
25ef0 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
25f00 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77  stRowid, i1.iRow
25f10 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
25f20 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
25f30 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61  dBlob(&out, i1.a
25f40 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
25f50 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b 0a  list+i1.nSize);.
25f60 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
25f70 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29  istIterNext(&i1)
25f80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
25f90 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62  .aPoslist==0 ) b
25fa0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25fb0 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e      else if( i2.
25fc0 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69  iRowid!=i1.iRowi
25fd0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
25fe0 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
25ff0 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i2 */.        ft
26000 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
26010 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
26020 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b  wid, i2.iRowid);
26030 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
26040 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
26050 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c  b(&out, i2.aPosl
26060 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  ist, i2.nPoslist
26070 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20  +i2.nSize);.    
26080 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
26090 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20  terNext(&i2);.  
260a0 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f        if( i2.aPo
260b0 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  slist==0 ) break
260c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
260d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
260e0 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20 70   Merge the two p
260f0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a  osition lists. *
26100 2f 20 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  / .        i64 i
26110 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  Pos1 = 0;.      
26120 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30 3b    i64 iPos2 = 0;
26130 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
26140 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  f1 = 0;.        
26150 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a 20  int iOff2 = 0;. 
26160 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20         u8 *a1 = 
26170 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31 2e  &i1.aPoslist[i1.
26180 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  nSize];.        
26190 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50 6f  u8 *a2 = &i2.aPo
261a0 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b  slist[i2.nSize];
261b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
261c0 70 79 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  py;.        u8 *
261d0 61 43 6f 70 79 3b 0a 0a 20 20 20 20 20 20 20 20  aCopy;..        
261e0 69 36 34 20 69 50 72 65 76 20 3d 20 30 3b 0a 20  i64 iPrev = 0;. 
261f0 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69         Fts5Posli
26200 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  stWriter writer;
26210 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
26220 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  &writer, 0, size
26230 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20  of(writer));..  
26240 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
26250 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
26260 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e   iLastRowid, i2.
26270 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
26280 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
26290 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73  &tmp);.        s
262a0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
262b0 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 74 6d  Size(&p->rc, &tm
262c0 70 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2b  p, i1.nPoslist +
262d0 20 69 32 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20   i2.nPoslist);. 
262e0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
262f0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
26300 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26310 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20  slistNext64(a1, 
26320 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i1.nPoslist, &iO
26330 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20  ff1, &iPos1);.  
26340 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
26350 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
26360 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  2, i2.nPoslist, 
26370 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b  &iOff2, &iPos2);
26380 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26390 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f   iPos1>=0 && iPo
263a0 73 32 3e 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  s2>=0 );..      
263b0 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50 6f 73    if( iPos1<iPos
263c0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  2 ){.          s
263d0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
263e0 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
263f0 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29  , &iPrev, iPos1)
26400 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
26410 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
26420 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73  xt64(a1, i1.nPos
26430 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69  list, &iOff1, &i
26440 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  Pos1);.        }
26450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26460 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
26470 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d  stSafeAppend(&tm
26480 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32  p, &iPrev, iPos2
26490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
264a0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
264b0 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f  ext64(a2, i2.nPo
264c0 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26  slist, &iOff2, &
264d0 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
264e0 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  }..        if( i
264f0 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32  Pos1>=0 && iPos2
26500 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
26510 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
26520 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
26530 73 31 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20  s1<iPos2 ){.    
26540 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
26550 6f 73 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20  os1!=iPrev ){.  
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26570 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26580 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
26590 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b   &iPrev, iPos1);
265a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
265b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
265c0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
265d0 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e  tNext64(a1, i1.n
265e0 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c  Poslist, &iOff1,
265f0 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20   &iPos1);.      
26600 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
26610 31 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  1<0 ) break;.   
26620 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
26640 73 65 72 74 28 20 69 50 6f 73 32 21 3d 69 50 72  sert( iPos2!=iPr
26650 65 76 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ev );.          
26660 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26670 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
26680 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
26690 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos2);.         
266a0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
266b0 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32  PoslistNext64(a2
266c0 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i2.nPoslist, &
266d0 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a  iOff2, &iPos2);.
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
266f0 28 20 69 50 6f 73 32 3c 30 20 29 20 62 72 65 61  ( iPos2<0 ) brea
26700 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
26710 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26720 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
26730 69 66 28 20 69 50 6f 73 31 3e 3d 30 20 29 7b 0a  if( iPos1>=0 ){.
26740 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
26750 6f 73 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20  os1!=iPrev ){.  
26760 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26770 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
26780 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
26790 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20  rev, iPos1);.   
267a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
267b0 20 20 20 61 43 6f 70 79 20 3d 20 26 61 31 5b 69     aCopy = &a1[i
267c0 4f 66 66 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  Off1];.         
267d0 20 6e 43 6f 70 79 20 3d 20 69 31 2e 6e 50 6f 73   nCopy = i1.nPos
267e0 6c 69 73 74 20 2d 20 69 4f 66 66 31 3b 0a 20 20  list - iOff1;.  
267f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
26810 50 6f 73 32 3e 3d 30 20 26 26 20 69 50 6f 73 32  Pos2>=0 && iPos2
26820 21 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20  !=iPrev );.     
26830 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
26840 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
26850 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
26860 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
26870 20 20 61 43 6f 70 79 20 3d 20 26 61 32 5b 69 4f    aCopy = &a2[iO
26880 66 66 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  ff2];.          
26890 6e 43 6f 70 79 20 3d 20 69 32 2e 6e 50 6f 73 6c  nCopy = i2.nPosl
268a0 69 73 74 20 2d 20 69 4f 66 66 32 3b 0a 20 20 20  ist - iOff2;.   
268b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
268c0 66 28 20 6e 43 6f 70 79 3e 30 20 29 7b 0a 20 20  f( nCopy>0 ){.  
268d0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
268e0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
268f0 28 26 74 6d 70 2c 20 61 43 6f 70 79 2c 20 6e 43  (&tmp, aCopy, nC
26900 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  opy);.        }.
26910 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54  .        /* WRIT
26920 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
26930 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
26940 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
26950 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a  nt(&out, tmp.n *
26960 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   2);.        fts
26970 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
26980 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e  dBlob(&out, tmp.
26990 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20  p, tmp.n);.     
269a0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
269b0 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
269c0 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
269d0 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
269e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
269f0 75 74 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b 70 32 2d  ut.n<=(p1->n+p2-
26a00 3e 6e 2b 39 29 20 29 3b 0a 20 20 20 20 20 20 20  >n+9) );.       
26a10 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74   if( i1.aPoslist
26a20 3d 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69  ==0 || i2.aPosli
26a30 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  st==0 ) break;. 
26a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
26a50 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73    if( i1.aPoslis
26a60 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  t ){.      fts5M
26a70 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
26a80 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
26a90 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i1.iRowid);.  
26aa0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
26ab0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75  feAppendBlob(&ou
26ac0 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20  t, i1.aPoslist, 
26ad0 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e 61 50 6f  i1.aEof - i1.aPo
26ae0 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  slist);.    }.  
26af0 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e 61 50    else if( i2.aP
26b00 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oslist ){.      
26b10 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
26b20 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
26b30 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
26b40 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
26b50 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
26b60 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c  b(&out, i2.aPosl
26b70 69 73 74 2c 20 69 32 2e 61 45 6f 66 20 2d 20 69  ist, i2.aEof - i
26b80 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  2.aPoslist);.   
26b90 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f   }.    assert( o
26ba0 75 74 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b 70 32 2d  ut.n<=(p1->n+p2-
26bb0 3e 6e 2b 39 29 20 29 3b 0a 0a 20 20 20 20 66 74  >n+9) );..    ft
26bc0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
26bd0 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f  rc, p1, out.n, o
26be0 75 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42  ut.p);.    fts5B
26bf0 75 66 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b  ufferFree(&tmp);
26c00 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
26c10 72 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d  ree(&out);.  }.}
26c20 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
26c30 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65  s5SetupPrefixIte
26c40 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r(.  Fts5Index *
26c50 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
26c60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
26c70 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
26c80 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20  int bDesc,      
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ca0 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44  /* True for "ORD
26cb0 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
26cc0 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  " */.  const u8 
26cd0 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20  *pToken,        
26ce0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
26cf0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66   containing pref
26d00 69 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20  ix to match */. 
26d10 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20   int nToken,    
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
26d40 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74  er pToken in byt
26d50 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  es */.  Fts5Cols
26d60 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20  et *pColset,    
26d70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
26d80 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
26d90 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  hese columns */.
26da0 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70 49    Fts5Iter **ppI
26db0 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
26dc0 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f  OUT: New iterato
26dd0 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74  r */.){.  Fts5St
26de0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
26df0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ;.  Fts5Buffer *
26e00 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  aBuf;.  const in
26e10 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20  t nBuf = 32;..  
26e20 76 6f 69 64 20 28 2a 78 4d 65 72 67 65 29 28 46  void (*xMerge)(F
26e30 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 42  ts5Index*, Fts5B
26e40 75 66 66 65 72 2a 2c 20 46 74 73 35 42 75 66 66  uffer*, Fts5Buff
26e50 65 72 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78  er*);.  void (*x
26e60 41 70 70 65 6e 64 29 28 46 74 73 35 49 6e 64 65  Append)(Fts5Inde
26e70 78 2a 2c 20 69 36 34 2c 20 46 74 73 35 49 74 65  x*, i64, Fts5Ite
26e80 72 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29  r*, Fts5Buffer*)
26e90 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66  ;.  if( p->pConf
26ea0 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
26eb0 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
26ec0 0a 20 20 20 20 78 4d 65 72 67 65 20 3d 20 66 74  .    xMerge = ft
26ed0 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74  s5MergeRowidList
26ee0 73 3b 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d  s;.    xAppend =
26ef0 20 66 74 73 35 41 70 70 65 6e 64 52 6f 77 69 64   fts5AppendRowid
26f00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
26f10 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67  Merge = fts5Merg
26f20 65 50 72 65 66 69 78 4c 69 73 74 73 3b 0a 20 20  ePrefixLists;.  
26f30 20 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35    xAppend = fts5
26f40 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 3b 0a 20  AppendPoslist;. 
26f50 20 7d 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74   }..  aBuf = (Ft
26f60 73 35 42 75 66 66 65 72 2a 29 66 74 73 35 49 64  s5Buffer*)fts5Id
26f70 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
26f80 66 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42  f(Fts5Buffer)*nB
26f90 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  uf);.  pStruct =
26fa0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
26fb0 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42  ad(p);..  if( aB
26fc0 75 66 20 26 26 20 70 53 74 72 75 63 74 20 29 7b  uf && pStruct ){
26fd0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
26fe0 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58  lags = FTS5INDEX
26ff0 5f 51 55 45 52 59 5f 53 43 41 4e 20 0a 20 20 20  _QUERY_SCAN .   
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27010 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   | FTS5INDEX_QUE
27020 52 59 5f 53 4b 49 50 45 4d 50 54 59 20 0a 20 20  RY_SKIPEMPTY .  
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27040 20 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55    | FTS5INDEX_QU
27050 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20  ERY_NOOUTPUT;.  
27060 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34    int i;.    i64
27070 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
27080 0a 20 20 20 20 46 74 73 35 49 74 65 72 20 2a 70  .    Fts5Iter *p
27090 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74  1 = 0;     /* It
270a0 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67  erator used to g
270b0 61 74 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20  ather data from 
270c0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73  index */.    Fts
270d0 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20  5Data *pData;.  
270e0 20 20 46 74 73 35 42 75 66 66 65 72 20 64 6f 63    Fts5Buffer doc
270f0 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e  list;.    int bN
27100 65 77 54 65 72 6d 20 3d 20 31 3b 0a 0a 20 20 20  ewTerm = 1;..   
27110 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74   memset(&doclist
27120 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c  , 0, sizeof(docl
27130 69 73 74 29 29 3b 0a 20 20 20 20 66 74 73 35 4d  ist));.    fts5M
27140 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
27150 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 70  Struct, flags, p
27160 43 6f 6c 73 65 74 2c 20 70 54 6f 6b 65 6e 2c 20  Colset, pToken, 
27170 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26  nToken, -1, 0, &
27180 70 31 29 3b 0a 20 20 20 20 66 74 73 35 49 74 65  p1);.    fts5Ite
27190 72 53 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d  rSetOutputCb(&p-
271a0 3e 72 63 2c 20 70 31 29 3b 0a 20 20 20 20 66 6f  >rc, p1);.    fo
271b0 72 28 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 3b  r( /* no-op */ ;
271c0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
271d0 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29  tiIterEof(p, p1)
271e0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ==0;.        fts
271f0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28  5MultiIterNext2(
27200 70 2c 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d  p, p1, &bNewTerm
27210 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46  ).    ){.      F
27220 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
27230 20 3d 20 26 70 31 2d 3e 61 53 65 67 5b 20 70 31   = &p1->aSeg[ p1
27240 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
27250 73 74 20 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  st ];.      int 
27260 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65  nTerm = pSeg->te
27270 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  rm.n;.      cons
27280 74 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 70 53  t u8 *pTerm = pS
27290 65 67 2d 3e 74 65 72 6d 2e 70 3b 0a 20 20 20 20  eg->term.p;.    
272a0 20 20 70 31 2d 3e 78 53 65 74 4f 75 74 70 75 74    p1->xSetOutput
272b0 73 28 70 31 2c 20 70 53 65 67 29 3b 0a 0a 20 20  s(p1, pSeg);..  
272c0 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6d      assert_nc( m
272d0 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
272e0 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c  erm, MIN(nToken,
272f0 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20   nTerm))<=0 );. 
27300 20 20 20 20 20 69 66 28 20 62 4e 65 77 54 65 72       if( bNewTer
27310 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  m ){.        if(
27320 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c   nTerm<nToken ||
27330 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20   memcmp(pToken, 
27340 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29  pTerm, nToken) )
27350 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
27360 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 62  .      if( p1->b
27370 61 73 65 2e 6e 44 61 74 61 3d 3d 30 20 29 20 63  ase.nData==0 ) c
27380 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20  ontinue;..      
27390 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f  if( p1->base.iRo
273a0 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 20  wid<=iLastRowid 
273b0 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 29  && doclist.n>0 )
273c0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
273d0 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
273e0 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e  _OK && doclist.n
273f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
27400 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75 66    assert( i<nBuf
27410 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
27420 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29  ( aBuf[i].n==0 )
27430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
27440 73 35 42 75 66 66 65 72 53 77 61 70 28 26 64 6f  s5BufferSwap(&do
27450 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
27460 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
27470 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64 6f  s5BufferZero(&do
27480 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  clist);.        
27490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
274a0 20 20 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26       xMerge(p, &
274b0 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69  doclist, &aBuf[i
274c0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
274d0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
274e0 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
274f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27500 20 20 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77          iLastRow
27510 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  id = 0;.      }.
27520 0a 20 20 20 20 20 20 78 41 70 70 65 6e 64 28 70  .      xAppend(p
27530 2c 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69  , p1->base.iRowi
27540 64 2d 69 4c 61 73 74 52 6f 77 69 64 2c 20 70 31  d-iLastRowid, p1
27550 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20  , &doclist);.   
27560 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20     iLastRowid = 
27570 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3b  p1->base.iRowid;
27580 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
27590 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b  i=0; i<nBuf; i++
275a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
275b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
275c0 0a 20 20 20 20 20 20 20 20 78 4d 65 72 67 65 28  .        xMerge(
275d0 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42  p, &doclist, &aB
275e0 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  uf[i]);.      }.
275f0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
27600 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a  Free(&aBuf[i]);.
27610 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75      }.    fts5Mu
27620 6c 74 69 49 74 65 72 46 72 65 65 28 70 31 29 3b  ltiIterFree(p1);
27630 0a 0a 20 20 20 20 70 44 61 74 61 20 3d 20 66 74  ..    pData = ft
27640 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73  s5IdxMalloc(p, s
27650 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29 2b  izeof(Fts5Data)+
27660 64 6f 63 6c 69 73 74 2e 6e 2b 46 54 53 35 5f 44  doclist.n+FTS5_D
27670 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
27680 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  );.    if( pData
27690 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 2d   ){.      pData-
276a0 3e 70 20 3d 20 28 75 38 2a 29 26 70 44 61 74 61  >p = (u8*)&pData
276b0 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44 61 74 61  [1];.      pData
276c0 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e 73 7a  ->nn = pData->sz
276d0 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73 74 2e 6e  Leaf = doclist.n
276e0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c  ;.      if( docl
276f0 69 73 74 2e 6e 20 29 20 6d 65 6d 63 70 79 28 70  ist.n ) memcpy(p
27700 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69 73 74  Data->p, doclist
27710 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a  .p, doclist.n);.
27720 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
27730 74 65 72 4e 65 77 32 28 70 2c 20 70 44 61 74 61  terNew2(p, pData
27740 2c 20 62 44 65 73 63 2c 20 70 70 49 74 65 72 29  , bDesc, ppIter)
27750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
27760 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c  BufferFree(&docl
27770 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  ist);.  }..  fts
27780 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
27790 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71  e(pStruct);.  sq
277a0 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29  lite3_free(aBuf)
277b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  ;.}.../*.** Indi
277c0 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75  cate that all su
277d0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
277e0 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
277f0 65 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69  exWrite() pertai
27800 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75  n.** to the docu
27810 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20  ment with rowid 
27820 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73  iRowid..*/.int s
27830 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42  qlite3Fts5IndexB
27840 65 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e  eginWrite(Fts5In
27850 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 6c  dex *p, int bDel
27860 65 74 65 2c 20 69 36 34 20 69 52 6f 77 69 64 29  ete, i64 iRowid)
27870 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
27880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
27890 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
278a0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 66  he hash table if
278b0 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
278c0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
278d0 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ed */.  if( p->p
278e0 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Hash==0 ){.    p
278f0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
27900 73 35 48 61 73 68 4e 65 77 28 70 2d 3e 70 43 6f  s5HashNew(p->pCo
27910 6e 66 69 67 2c 20 26 70 2d 3e 70 48 61 73 68 2c  nfig, &p->pHash,
27920 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74   &p->nPendingDat
27930 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c  a);.  }..  /* Fl
27940 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62  ush the hash tab
27950 6c 65 20 74 6f 20 64 69 73 6b 20 69 66 20 72 65  le to disk if re
27960 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20  quired */.  if( 
27970 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72 69 74 65  iRowid<p->iWrite
27980 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20 28 69 52  Rowid .   || (iR
27990 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69 74 65 52  owid==p->iWriteR
279a0 6f 77 69 64 20 26 26 20 70 2d 3e 62 44 65 6c 65  owid && p->bDele
279b0 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 70 2d  te==0).   || (p-
279c0 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3e 20  >nPendingData > 
279d0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 48 61 73  p->pConfig->nHas
279e0 68 53 69 7a 65 29 20 0a 20 20 29 7b 0a 20 20 20  hSize) .  ){.   
279f0 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
27a00 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 57  p);.  }..  p->iW
27a10 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52 6f 77  riteRowid = iRow
27a20 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c 65 74 65  id;.  p->bDelete
27a30 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20 20 72 65   = bDelete;.  re
27a40 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
27a50 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
27a60 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f  * Commit data to
27a70 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
27a80 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 79  lite3Fts5IndexSy
27a90 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  nc(Fts5Index *p)
27aa0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
27ab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
27ac0 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
27ad0 28 70 29 3b 0a 20 20 66 74 73 35 43 6c 6f 73 65  (p);.  fts5Close
27ae0 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74  Reader(p);.  ret
27af0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
27b00 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
27b10 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74   Discard any dat
27b20 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
27b30 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
27b40 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72  ables. Do not wr
27b50 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65  ite it.** to the
27b60 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
27b70 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20  ionally, assume 
27b80 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
27b90 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a  s of the %_data.
27ba0 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76  ** table may hav
27bb0 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73  e changed on dis
27bc0 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d  k. So any in-mem
27bd0 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f  ory caches of %_
27be0 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73  data .** records
27bf0 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64   must be invalid
27c00 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
27c10 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c  ite3Fts5IndexRol
27c20 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20  lback(Fts5Index 
27c30 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65  *p){.  fts5Close
27c40 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73  Reader(p);.  fts
27c50 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
27c60 61 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  a(p);.  fts5Stru
27c70 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28  ctureInvalidate(
27c80 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74 28  p);.  /* assert(
27c90 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
27ca0 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74 75 72 6e  K ); */.  return
27cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27cc0 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
27cd0 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74  table is complet
27ce0 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74  ely empty when t
27cf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27d00 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20  called. This.** 
27d10 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
27d20 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20 69  es it with the i
27d30 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72 65  nitial structure
27d40 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
27d50 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20  h index,.** and 
27d60 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73  the initial vers
27d70 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72  ion of the "aver
27d80 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61 20  ages" record (a 
27d90 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e  zero-byte blob).
27da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
27db0 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46  ts5IndexReinit(F
27dc0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
27dd0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73 3b  Fts5Structure s;
27de0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
27df0 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20  Invalidate(p);. 
27e00 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
27e10 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
27e20 75 72 65 29 29 3b 0a 20 20 66 74 73 35 44 61 74  ure));.  fts5Dat
27e30 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41  aWrite(p, FTS5_A
27e40 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 28  VERAGES_ROWID, (
27e50 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29  const u8*)"", 0)
27e60 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
27e70 65 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 20  eWrite(p, &s);. 
27e80 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
27e90 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
27ea0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
27eb0 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
27ec0 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65  . If the bCreate
27ed0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
27ee0 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64  e, create.** and
27ef0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
27f00 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74  underlying %_dat
27f10 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
27f20 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
27f30 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
27f40 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
27f50 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
27f60 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77  TE_OK..** Otherw
27f70 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ise, set *pp to 
27f80 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20  NULL and return 
27f90 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
27fa0 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
27fb0 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
27fc0 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  n(.  Fts5Config 
27fd0 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74  *pConfig, .  int
27fe0 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73   bCreate, .  Fts
27ff0 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63  5Index **pp,.  c
28000 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
28010 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28020 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  _OK;.  Fts5Index
28030 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
28040 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
28050 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d  ject */..  *pp =
28060 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a   p = (Fts5Index*
28070 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
28080 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
28090 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a  of(Fts5Index));.
280a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
280b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43  _OK ){.    p->pC
280c0 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b  onfig = pConfig;
280d0 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  .    p->nWorkUni
280e0 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e  t = FTS5_WORK_UN
280f0 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61  IT;.    p->zData
28100 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Tbl = sqlite3Fts
28110 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25  5Mprintf(&rc, "%
28120 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67  s_data", pConfig
28130 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
28140 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26  ( p->zDataTbl &&
28150 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20   bCreate ){.    
28160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
28170 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20  s5CreateTable(. 
28180 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
28190 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e  , "data", "id IN
281a0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
281b0 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20  Y, block BLOB", 
281c0 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29  0, pzErr.      )
281d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
281e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
281f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28200 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
28210 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c  (pConfig, "idx",
28220 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73   .            "s
28230 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f  egid, term, pgno
28240 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65  , PRIMARY KEY(se
28250 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20  gid, term)", .  
28260 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45            1, pzE
28270 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  rr.        );.  
28280 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
282a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
282b0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
282c0 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  init(p);.      }
282d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
282e0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
282f0 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
28300 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
28310 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
28320 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
28330 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30  (p);.    *pp = 0
28340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28350 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
28360 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65  e a handle opene
28370 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
28380 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46  call to sqlite3F
28390 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a  ts5IndexOpen()..
283a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
283b0 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73  s5IndexClose(Fts
283c0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
283d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
283e0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
283f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
28400 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74  der==0 );.    ft
28410 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
28420 69 64 61 74 65 28 70 29 3b 0a 20 20 20 20 73 71  idate(p);.    sq
28430 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
28440 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  ->pWriter);.    
28450 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
28460 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
28470 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
28480 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65  ize(p->pIdxWrite
28490 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
284a0 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
284b0 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71  Deleter);.    sq
284c0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
284d0 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20  ->pIdxSelect);. 
284e0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
284f0 69 7a 65 28 70 2d 3e 70 44 61 74 61 56 65 72 73  ize(p->pDataVers
28500 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ion);.    sqlite
28510 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70 2d  3Fts5HashFree(p-
28520 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c  >pHash);.    sql
28530 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61  ite3_free(p->zDa
28540 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69  taTbl);.    sqli
28550 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
28560 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28570 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
28580 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  p points to a bu
28590 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
285a0 75 74 66 2d 38 20 74 65 78 74 20 74 68 61 74 20  utf-8 text that 
285b0 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a  is n bytes in .*
285c0 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74  * size. Return t
285d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
285e0 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72 20  es in the nChar 
285f0 63 68 61 72 61 63 74 65 72 20 70 72 65 66 69 78  character prefix
28600 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66 65   of the.** buffe
28610 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72 65  r, or 0 if there
28620 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e   are less than n
28630 43 68 61 72 20 63 68 61 72 61 63 74 65 72 73 20  Char characters 
28640 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 69 6e 74  in total..*/.int
28650 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28660 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
28670 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
28680 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42 79 74 65  *p, .  int nByte
28690 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61 72 0a 29  , .  int nChar.)
286a0 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
286b0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
286c0 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
286d0 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79  {.    if( n>=nBy
286e0 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  te ) return 0;  
286f0 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e      /* Input con
28700 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
28710 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a   nChar chars */.
28720 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
28730 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30  d char)p[n++]>=0
28740 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69  xc0 ){.      whi
28750 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30  le( (p[n] & 0xc0
28760 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 20  )==0x80 ){.     
28770 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20     n++;.        
28780 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 62  if( n>=nByte ) b
28790 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
287a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
287b0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e   n;.}../*.** pIn
287c0 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
287d0 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20  ded string, nIn 
287e0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52  bytes in size. R
287f0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
28800 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63   of.** unicode c
28810 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
28820 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
28830 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
28840 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68  Charlen(const ch
28850 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *pIn, int nIn
28860 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d  ){.  int nChar =
28870 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a   0;            .
28880 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77    int i = 0;.  w
28890 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20  hile( i<nIn ){. 
288a0 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
288b0 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d   char)pIn[i++]>=
288c0 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
288d0 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70  ile( i<nIn && (p
288e0 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30  In[i] & 0xc0)==0
288f0 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d  x80 ) i++;.    }
28900 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20  .    nChar++;.  
28910 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72  }.  return nChar
28920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
28930 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61  t or remove data
28940 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
28950 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65  index. Each time
28960 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a   a document is .
28970 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72  ** added to or r
28980 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
28990 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63  index, this func
289a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
289b0 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69  ne or more.** ti
289c0 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  mes..**.** For a
289d0 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73  n insert, it mus
289e0 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  t be called once
289f0 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20   for each token 
28a00 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d  in the new docum
28a10 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ent..** If the o
28a20 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65  peration is a de
28a30 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65  lete, it must be
28a40 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73   called (at leas
28a50 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  t) once for each
28a60 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e  .** unique token
28a70 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
28a80 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61   with an iCol va
28a90 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65  lue less than ze
28aa0 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20  ro. The iPos.** 
28ab0 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f  argument is igno
28ac0 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65  red for a delete
28ad0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28ae0 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a  Fts5IndexWrite(.
28af0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
28b20 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
28b30 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
28b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
28b50 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65  olumn token appe
28b60 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64  ars in (-ve -> d
28b70 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20  elete) */.  int 
28b80 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
28b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28ba0 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  osition of token
28bb0 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a   within column *
28bc0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28bd0 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
28be0 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20  en  /* Token to 
28bf0 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f  add or remove to
28c00 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a   or from index *
28c10 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
28c40 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
28c50 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  h indexes */.  i
28c60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28c70 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
28c80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
28c90 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
28ca0 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
28cb0 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fig;..  assert( 
28cc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
28cd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69   );.  assert( (i
28ce0 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c 65  Col<0)==p->bDele
28cf0 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  te );..  /* Add 
28d00 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  the entry to the
28d10 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65   main terms inde
28d20 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  x. */.  rc = sql
28d30 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
28d40 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61 73  e(.      p->pHas
28d50 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  h, p->iWriteRowi
28d60 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46  d, iCol, iPos, F
28d70 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c  TS5_MAIN_PREFIX,
28d80 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a   pToken, nToken.
28d90 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b    );..  for(i=0;
28da0 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65   i<pConfig->nPre
28db0 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  fix && rc==SQLIT
28dc0 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
28dd0 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68 61 72 20  const int nChar 
28de0 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  = pConfig->aPref
28df0 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  ix[i];.    int n
28e00 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74  Byte = sqlite3Ft
28e10 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
28e20 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20  Bytelen(pToken, 
28e30 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72 29 3b 0a  nToken, nChar);.
28e40 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
28e50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
28e60 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74 65  te3Fts5HashWrite
28e70 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20 20  (p->pHash, .    
28e80 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65 52        p->iWriteR
28e90 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
28ea0 2c 20 28 63 68 61 72 29 28 46 54 53 35 5f 4d 41  , (char)(FTS5_MA
28eb0 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31 29 2c 20  IN_PREFIX+i+1), 
28ec0 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20 20  pToken,.        
28ed0 20 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b    nByte.      );
28ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
28ef0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28f00 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65  * Open a new ite
28f10 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65  rator to iterate
28f20 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69   though all rowi
28f30 64 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  d that match the
28f40 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74   .** specified t
28f50 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
28f60 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  efix..*/.int sql
28f70 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
28f80 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ry(.  Fts5Index 
28f90 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
28fa0 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
28fb0 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  ex to query */. 
28fc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
28fd0 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  ken, int nToken,
28fe0 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72   /* Token (or pr
28ff0 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66  efix) to query f
29000 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  or */.  int flag
29010 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
29020 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
29030 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  of FTS5INDEX_QUE
29040 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  RY_X flags */.  
29050 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
29060 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
29070 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20 63  /* Match these c
29080 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20  olumns only */. 
29090 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
290a0 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
290b0 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65   /* OUT: New ite
290c0 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  rator object */.
290d0 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
290e0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
290f0 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 74 65  onfig;.  Fts5Ite
29100 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 46  r *pRet = 0;.  F
29110 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
29120 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a  {0, 0, 0};..  /*
29130 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 53 43   If the QUERY_SC
29140 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  AN flag is set, 
29150 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20  all other flags 
29160 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a  must be clear. *
29170 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
29180 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
29190 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c 7c  UERY_SCAN)==0 ||
291a0 20 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44 45   flags==FTS5INDE
291b0 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 29 3b 0a  X_QUERY_SCAN );.
291c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74  .  if( sqlite3Ft
291d0 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
291e0 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b 65  >rc, &buf, nToke
291f0 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  n+1)==0 ){.    i
29200 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20  nt iIdx = 0;    
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29220 49 6e 64 65 78 20 74 6f 20 73 65 61 72 63 68 20  Index to search 
29230 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  */.    if( nToke
29240 6e 20 29 20 6d 65 6d 63 70 79 28 26 62 75 66 2e  n ) memcpy(&buf.
29250 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  p[1], pToken, nT
29260 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  oken);..    /* F
29270 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
29280 69 6e 64 65 78 20 74 6f 20 73 65 61 72 63 68 20  index to search 
29290 61 6e 64 20 73 65 74 20 69 49 64 78 20 61 63 63  and set iIdx acc
292a0 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 74 68 69  ordingly. If thi
292b0 73 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 70 72  s.    ** is a pr
292c0 65 66 69 78 20 71 75 65 72 79 20 66 6f 72 20 77  efix query for w
292d0 68 69 63 68 20 74 68 65 72 65 20 69 73 20 6e 6f  hich there is no
292e0 20 70 72 65 66 69 78 20 69 6e 64 65 78 2c 20 73   prefix index, s
292f0 65 74 20 69 49 64 78 20 74 6f 0a 20 20 20 20 2a  et iIdx to.    *
29300 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  * greater than p
29310 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
29320 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
29330 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20   the query will 
29340 62 65 0a 20 20 20 20 2a 2a 20 73 61 74 69 73 66  be.    ** satisf
29350 69 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  ied by scanning 
29360 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
29370 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78  n the main index
29380 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
29390 49 66 20 74 68 65 20 51 55 45 52 59 5f 54 45 53  If the QUERY_TES
293a0 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20 77 61 73  T_NOIDX flag was
293b0 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
293c0 20 74 68 69 73 20 6d 75 73 74 20 62 65 20 61 0a   this must be a.
293d0 20 20 20 20 2a 2a 20 70 72 65 66 69 78 2d 71 75      ** prefix-qu
293e0 65 72 79 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ery. Instead of 
293f0 75 73 69 6e 67 20 61 20 70 72 65 66 69 78 2d 69  using a prefix-i
29400 6e 64 65 78 20 28 69 66 20 6f 6e 65 20 65 78 69  ndex (if one exi
29410 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a 20 65 76  sts), .    ** ev
29420 61 6c 75 61 74 65 20 74 68 65 20 70 72 65 66 69  aluate the prefi
29430 78 20 71 75 65 72 79 20 75 73 69 6e 67 20 74 68  x query using th
29440 65 20 6d 61 69 6e 20 46 54 53 20 69 6e 64 65 78  e main FTS index
29450 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20  . This is used. 
29460 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74 65 72 6e     ** for intern
29470 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
29480 6e 67 20 62 79 20 74 68 65 20 69 6e 74 65 67 72  ng by the integr
29490 69 74 79 2d 63 68 65 63 6b 20 69 6e 20 64 65 62  ity-check in deb
294a0 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  ug .    ** mode 
294b0 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69 66 64 65 66  only.  */.#ifdef
294c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
294d0 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62    if( pConfig->b
294e0 50 72 65 66 69 78 49 6e 64 65 78 3d 3d 30 20 7c  PrefixIndex==0 |
294f0 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  | (flags & FTS5I
29500 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
29510 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20 20 20 20  NOIDX) ){.      
29520 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
29530 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
29540 50 52 45 46 49 58 20 29 3b 0a 20 20 20 20 20 20  PREFIX );.      
29550 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e 66 69 67  iIdx = 1+pConfig
29560 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20 20 20 7d  ->nPrefix;.    }
29570 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
29580 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
29590 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
295a0 49 58 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  IX ){.      int 
295b0 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e 64 65  nChar = fts5Inde
295c0 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c  xCharlen(pToken,
295d0 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20   nToken);.      
295e0 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78  for(iIdx=1; iIdx
295f0 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
29600 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20  ix; iIdx++){.   
29610 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67       if( pConfig
29620 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d 31  ->aPrefix[iIdx-1
29630 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65 61 6b  ]==nChar ) break
29640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29650 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c 3d 70  .    if( iIdx<=p
29660 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
29670 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 74 72 61  ){.      /* Stra
29680 69 67 68 74 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ight index looku
29690 70 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53  p */.      Fts5S
296a0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
296b0 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
296c0 65 52 65 61 64 28 70 29 3b 0a 20 20 20 20 20 20  eRead(p);.      
296d0 62 75 66 2e 70 5b 30 5d 20 3d 20 28 75 38 29 28  buf.p[0] = (u8)(
296e0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
296f0 20 2b 20 69 49 64 78 29 3b 0a 20 20 20 20 20 20   + iIdx);.      
29700 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
29710 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
29720 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75  IterNew(p, pStru
29730 63 74 2c 20 66 6c 61 67 73 20 7c 20 46 54 53 35  ct, flags | FTS5
29740 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50  INDEX_QUERY_SKIP
29750 45 4d 50 54 59 2c 20 0a 20 20 20 20 20 20 20 20  EMPTY, .        
29760 20 20 20 20 70 43 6f 6c 73 65 74 2c 20 62 75 66      pColset, buf
29770 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31  .p, nToken+1, -1
29780 2c 20 30 2c 20 26 70 52 65 74 0a 20 20 20 20 20  , 0, &pRet.     
29790 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74     );.        ft
297a0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
297b0 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20  se(pStruct);.   
297c0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
297d0 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 6d 75        /* Scan mu
297e0 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20  ltiple terms in 
297f0 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78 20 2a  the main index *
29800 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 73  /.      int bDes
29810 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53  c = (flags & FTS
29820 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
29830 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75 66  C)!=0;.      buf
29840 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41 49  .p[0] = FTS5_MAI
29850 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20 20  N_PREFIX;.      
29860 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49  fts5SetupPrefixI
29870 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62 75  ter(p, bDesc, bu
29880 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 70  f.p, nToken+1, p
29890 43 6f 6c 73 65 74 2c 20 26 70 52 65 74 29 3b 0a  Colset, &pRet);.
298a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
298b0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
298c0 7c 20 70 52 65 74 2d 3e 70 43 6f 6c 73 65 74 3d  | pRet->pColset=
298d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  =0 );.      fts5
298e0 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28  IterSetOutputCb(
298f0 26 70 2d 3e 72 63 2c 20 70 52 65 74 29 3b 0a 20  &p->rc, pRet);. 
29900 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
29910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29920 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
29930 20 2a 70 53 65 67 20 3d 20 26 70 52 65 74 2d 3e   *pSeg = &pRet->
29940 61 53 65 67 5b 70 52 65 74 2d 3e 61 46 69 72 73  aSeg[pRet->aFirs
29950 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20  t[1].iFirst];.  
29960 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
29970 70 4c 65 61 66 20 29 20 70 52 65 74 2d 3e 78 53  pLeaf ) pRet->xS
29980 65 74 4f 75 74 70 75 74 73 28 70 52 65 74 2c 20  etOutputs(pRet, 
29990 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSeg);.      }. 
299a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
299b0 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >rc ){.      sql
299c0 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
299d0 65 28 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  e((Fts5IndexIter
299e0 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20 70  *)pRet);.      p
299f0 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Ret = 0;.      f
29a00 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
29a10 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70  );.    }..    *p
29a20 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 6e 64  pIter = (Fts5Ind
29a30 65 78 49 74 65 72 2a 29 70 52 65 74 3b 0a 20 20  exIter*)pRet;.  
29a40 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
29a50 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20  ferFree(&buf);. 
29a60 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35   }.  return fts5
29a70 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
29a80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
29a90 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72  true if the iter
29aa0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
29ab0 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
29ac0 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 2f   is at EOF..*/./
29ad0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
29ae0 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72   next matching r
29af0 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  owid. .*/.int sq
29b00 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
29b10 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  t(Fts5IndexIter 
29b20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20  *pIndexIter){.  
29b30 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20  Fts5Iter *pIter 
29b40 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e  = (Fts5Iter*)pIn
29b50 64 65 78 49 74 65 72 3b 0a 20 20 61 73 73 65 72  dexIter;.  asser
29b60 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
29b70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
29b80 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  );.  fts5MultiIt
29b90 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49  erNext(pIter->pI
29ba0 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30 2c 20  ndex, pIter, 0, 
29bb0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  0);.  return fts
29bc0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
29bd0 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
29be0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
29bf0 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
29c00 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65 64  term/rowid. Used
29c10 20 62 79 20 74 68 65 20 66 74 73 35 76 6f 63 61   by the fts5voca
29c20 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74  b module..*/.int
29c30 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
29c40 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e 64  NextScan(Fts5Ind
29c50 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74  exIter *pIndexIt
29c60 65 72 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20  er){.  Fts5Iter 
29c70 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74  *pIter = (Fts5It
29c80 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a  er*)pIndexIter;.
29c90 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d    Fts5Index *p =
29ca0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a   pIter->pIndex;.
29cb0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
29cc0 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
29cd0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66 74  LITE_OK );..  ft
29ce0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
29cf0 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b  p, pIter, 0, 0);
29d00 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
29d10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
29d20 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
29d30 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
29d40 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
29d50 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
29d60 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20  if( pSeg->pLeaf 
29d70 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 5b  && pSeg->term.p[
29d80 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50 52  0]!=FTS5_MAIN_PR
29d90 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66 74  EFIX ){.      ft
29da0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 53  s5DataRelease(pS
29db0 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  eg->pLeaf);.    
29dc0 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d 20    pSeg->pLeaf = 
29dd0 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  0;.      pIter->
29de0 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20  base.bEof = 1;. 
29df0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
29e00 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
29e10 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
29e20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
29e30 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
29e40 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74  ching rowid that
29e50 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61 66   occurs at or af
29e60 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a  ter iMatch. The.
29e70 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  ** definition of
29e80 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20 64   "at or after" d
29e90 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
29ea0 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  r this iterator 
29eb0 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61  iterates.** in a
29ec0 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63  scending or desc
29ed0 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64  ending rowid ord
29ee0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
29ef0 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
29f00 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  om(Fts5IndexIter
29f10 20 2a 70 49 6e 64 65 78 49 74 65 72 2c 20 69 36   *pIndexIter, i6
29f20 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 46 74 73  4 iMatch){.  Fts
29f30 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28  5Iter *pIter = (
29f40 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78  Fts5Iter*)pIndex
29f50 49 74 65 72 3b 0a 20 20 66 74 73 35 4d 75 6c 74  Iter;.  fts5Mult
29f60 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49  iIterNextFrom(pI
29f70 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
29f80 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 72  er, iMatch);.  r
29f90 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
29fa0 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
29fb0 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dex);.}../*.** R
29fc0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
29fd0 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74  t term..*/.const
29fe0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74   char *sqlite3Ft
29ff0 73 35 49 74 65 72 54 65 72 6d 28 46 74 73 35 49  s5IterTerm(Fts5I
2a000 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78  ndexIter *pIndex
2a010 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a  Iter, int *pn){.
2a020 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
2a030 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
2a040 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74  t char*)fts5Mult
2a050 69 49 74 65 72 54 65 72 6d 28 28 46 74 73 35 49  iIterTerm((Fts5I
2a060 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 2c  ter*)pIndexIter,
2a070 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d   &n);.  *pn = n-
2a080 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b 31  1;.  return &z[1
2a090 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ];.}../*.** Clos
2a0a0 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70  e an iterator op
2a0b0 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
2a0c0 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
2a0d0 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
2a0e0 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
2a0f0 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
2a100 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
2a110 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20 69  pIndexIter){.  i
2a120 66 28 20 70 49 6e 64 65 78 49 74 65 72 20 29 7b  f( pIndexIter ){
2a130 0a 20 20 20 20 46 74 73 35 49 74 65 72 20 2a 70  .    Fts5Iter *p
2a140 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65 72  Iter = (Fts5Iter
2a150 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20  *)pIndexIter;.  
2a160 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e    Fts5Index *pIn
2a170 64 65 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e  dex = pIter->pIn
2a180 64 65 78 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  dex;.    fts5Mul
2a190 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72  tiIterFree(pIter
2a1a0 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65  );.    fts5Close
2a1b0 52 65 61 64 65 72 28 70 49 6e 64 65 78 29 3b 0a  Reader(pIndex);.
2a1c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
2a1d0 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74 68 65  d and decode the
2a1e0 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
2a1f0 72 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  rd from the data
2a200 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50 61 72  base. .**.** Par
2a210 61 6d 65 74 65 72 20 61 6e 53 69 7a 65 20 6d 75  ameter anSize mu
2a220 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61  st point to an a
2a230 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e 43 6f  rray of size nCo
2a240 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20 69 73  l, where nCol is
2a250 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
2a260 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  f user defined c
2a270 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54  olumns in the FT
2a280 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  S table..*/.int 
2a290 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2a2a0 47 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35  GetAverages(Fts5
2a2b0 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 2a 70  Index *p, i64 *p
2a2c0 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53 69 7a  nRow, i64 *anSiz
2a2d0 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  e){.  int nCol =
2a2e0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f   p->pConfig->nCo
2a2f0 6c 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  l;.  Fts5Data *p
2a300 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f 77 20  Data;..  *pnRow 
2a310 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 61 6e  = 0;.  memset(an
2a320 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Size, 0, sizeof(
2a330 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20  i64) * nCol);.  
2a340 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
2a350 52 65 61 64 28 70 2c 20 46 54 53 35 5f 41 56 45  Read(p, FTS5_AVE
2a360 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a 20 20  RAGES_ROWID);.  
2a370 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
2a380 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d 3e 6e  E_OK && pData->n
2a390 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  n ){.    int i =
2a3a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   0;.    int iCol
2a3b0 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47  ;.    i += fts5G
2a3c0 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
2a3d0 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70 6e 52  >p[i], (u64*)pnR
2a3e0 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f  ow);.    for(iCo
2a3f0 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e 6e  l=0; i<pData->nn
2a400 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69   && iCol<nCol; i
2a410 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20  Col++){.      i 
2a420 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2a430 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28  (&pData->p[i], (
2a440 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69 43 6f  u64*)&anSize[iCo
2a450 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l]);.    }.  }..
2a460 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
2a470 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  e(pData);.  retu
2a480 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
2a490 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
2a4a0 52 65 70 6c 61 63 65 20 74 68 65 20 63 75 72 72  Replace the curr
2a4b0 65 6e 74 20 22 61 76 65 72 61 67 65 73 22 20 72  ent "averages" r
2a4c0 65 63 6f 72 64 20 77 69 74 68 20 74 68 65 20 63  ecord with the c
2a4d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
2a4e0 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69  uffer .** suppli
2a4f0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2a500 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
2a510 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2a520 65 78 53 65 74 41 76 65 72 61 67 65 73 28 46 74  exSetAverages(Ft
2a530 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73  s5Index *p, cons
2a540 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74  t u8 *pData, int
2a550 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73 65 72   nData){.  asser
2a560 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
2a570 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44 61 74  _OK );.  fts5Dat
2a580 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41  aWrite(p, FTS5_A
2a590 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70  VERAGES_ROWID, p
2a5a0 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
2a5b0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
2a5c0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
2a5d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
2a5e0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
2a5f0 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75 6c  locks this modul
2a600 65 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d 20  e has read from 
2a610 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61  the %_data.** ta
2a620 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61 73  ble since it was
2a630 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74   created..*/.int
2a640 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2a650 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65 78  xReads(Fts5Index
2a660 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
2a670 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->nRead;.}../*.*
2a680 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62 69 74  * Set the 32-bit
2a690 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73 74   cookie value st
2a6a0 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
2a6b0 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63 74 75  t of all structu
2a6c0 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  re .** records t
2a6d0 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
2a6e0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2a6f0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
2a700 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2a710 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
2a720 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
2a730 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
2a740 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  rror.** occurs..
2a750 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2a760 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65  s5IndexSetCookie
2a770 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
2a780 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74 20  nt iNew){.  int 
2a790 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2a7c0 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
2a7d0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
2a7e0 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43 6f 6e  onfig;    /* Con
2a7f0 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63  figuration objec
2a800 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f 6b 69  t */.  u8 aCooki
2a810 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20  e[4];           
2a820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2a830 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74 61  inary representa
2a840 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a 2f 0a  tion of iNew */.
2a850 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
2a860 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20 61 73  pBlob = 0;..  as
2a870 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
2a880 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
2a890 74 65 33 46 74 73 35 50 75 74 33 32 28 61 43 6f  te3Fts5Put32(aCo
2a8a0 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a 20 20  okie, iNew);..  
2a8b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
2a8c0 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e  b_open(pConfig->
2a8d0 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62  db, pConfig->zDb
2a8e0 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a  , p->zDataTbl, .
2a8f0 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c 20 46        "block", F
2a900 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
2a910 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62 0a 20  WID, 1, &pBlob. 
2a920 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
2a930 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2a940 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
2a950 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65  e(pBlob, aCookie
2a960 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  , 4, 0);.    rc 
2a970 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63  = sqlite3_blob_c
2a980 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20 7d  lose(pBlob);.  }
2a990 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2a9a0 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
2a9b0 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67  5IndexLoadConfig
2a9c0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
2a9d0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
2a9e0 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53 74 72  *pStruct;.  pStr
2a9f0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
2aa00 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 66 74  ureRead(p);.  ft
2aa10 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
2aa20 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72  se(pStruct);.  r
2aa30 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
2aa40 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a  eturn(p);.}.../*
2aa50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa90 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2aaa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aae0 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69  ***.** Below thi
2aaf0 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69  s point is the i
2ab00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2ab10 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
2ab20 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  heck .** functio
2ab30 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  nality..*/../*.*
2ab40 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c  * Return a simpl
2ab50 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  e checksum value
2ab60 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72   based on the ar
2ab70 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20  guments..*/.u64 
2ab80 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2ab90 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36  EntryCksum(.  i6
2aba0 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74  4 iRowid, .  int
2abb0 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50   iCol, .  int iP
2abc0 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c  os, .  int iIdx,
2abd0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
2abe0 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65 72  Term,.  int nTer
2abf0 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  m.){.  int i;.  
2ac00 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77 69 64  u64 ret = iRowid
2ac10 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
2ac20 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65  <3) + iCol;.  re
2ac30 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
2ac40 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49 64 78  iPos;.  if( iIdx
2ac50 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28 72 65  >=0 ) ret += (re
2ac60 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f 4d 41  t<<3) + (FTS5_MA
2ac70 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78  IN_PREFIX + iIdx
2ac80 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2ac90 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20  nTerm; i++) ret 
2aca0 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 70 54  += (ret<<3) + pT
2acb0 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e  erm[i];.  return
2acc0 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   ret;.}..#ifdef 
2acd0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
2ace0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2acf0 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20 69 6e   is purely an in
2ad00 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20  ternal test. It 
2ad10 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
2ad20 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66  ute to .** FTS f
2ad30 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72  unctionality, or
2ad40 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72   even the integr
2ad50 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e  ity-check, in an
2ad60 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  y way..**.** Ins
2ad70 74 65 61 64 2c 20 69 74 20 74 65 73 74 73 20 74  tead, it tests t
2ad80 68 61 74 20 74 68 65 20 73 61 6d 65 20 73 65 74  hat the same set
2ad90 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20 63   of pgno/rowid c
2ada0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
2adb0 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65 67 61  .** visited rega
2adc0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2add0 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  r the doclist-in
2ade0 64 65 78 20 69 64 65 6e 74 69 66 69 65 64 20 62  dex identified b
2adf0 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20  y parameters.** 
2ae00 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73 20  iSegid/iLeaf is 
2ae10 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72 77  iterated in forw
2ae20 61 72 64 73 20 6f 72 20 72 65 76 65 72 73 65 20  ards or reverse 
2ae30 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2ae40 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 44 6c   void fts5TestDl
2ae50 69 64 78 52 65 76 65 72 73 65 28 0a 20 20 46 74  idxReverse(.  Ft
2ae60 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69  s5Index *p, .  i
2ae70 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20  nt iSegid,      
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ae90 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20  * Segment id to 
2aea0 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  load from */.  i
2aeb0 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20 20 20  nt iLeaf        
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aed0 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69  * Load doclist-i
2aee0 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65  ndex for this le
2aef0 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  af */.){.  Fts5D
2af00 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
2af10 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b 73 75   = 0;.  u64 cksu
2af20 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34 20 63  m1 = 13;.  u64 c
2af30 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66  ksum2 = 13;..  f
2af40 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c  or(pDlidx=fts5Dl
2af50 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30  idxIterInit(p, 0
2af60 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29  , iSegid, iLeaf)
2af70 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
2af80 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
2af90 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  dx)==0;.      ft
2afa0 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
2afb0 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a  p, pDlidx).  ){.
2afc0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
2afd0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f   fts5DlidxIterRo
2afe0 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  wid(pDlidx);.   
2aff0 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35   int pgno = fts5
2b000 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
2b010 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72  lidx);.    asser
2b020 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20 29 3b  t( pgno>iLeaf );
2b030 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20 69  .    cksum1 += i
2b040 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70 67  Rowid + ((i64)pg
2b050 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66  no<<32);.  }.  f
2b060 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
2b070 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69  (pDlidx);.  pDli
2b080 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70  dx = 0;..  for(p
2b090 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
2b0a0 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 53  terInit(p, 1, iS
2b0b0 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20  egid, iLeaf);.  
2b0c0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2b0d0 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d  rEof(p, pDlidx)=
2b0e0 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  =0;.      fts5Dl
2b0f0 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20 70  idxIterPrev(p, p
2b100 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20  Dlidx).  ){.    
2b110 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
2b120 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
2b130 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74  pDlidx);.    int
2b140 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64   pgno = fts5Dlid
2b150 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
2b160 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  );.    assert( f
2b170 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2b180 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66 20 29  (pDlidx)>iLeaf )
2b190 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b 3d 20  ;.    cksum2 += 
2b1a0 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70  iRowid + ((i64)p
2b1b0 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20  gno<<32);.  }.  
2b1c0 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
2b1d0 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c  e(pDlidx);.  pDl
2b1e0 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  idx = 0;..  if( 
2b1f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2b200 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73 75   && cksum1!=cksu
2b210 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  m2 ) p->rc = FTS
2b220 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73 74  5_CORRUPT;.}..st
2b230 61 74 69 63 20 69 6e 74 20 66 74 73 35 51 75 65  atic int fts5Que
2b240 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 49  ryCksum(.  Fts5I
2b250 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
2b260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
2b270 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  s5 index object 
2b280 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20  */.  int iIdx,. 
2b290 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
2b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2b0 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20 74 6f   /* Index key to
2b2c0 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20   query for */.  
2b2d0 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64 65 78  /* Size of index
2b300 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20 2a 2f   key in bytes */
2b310 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b330 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
2b340 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 20 2a  Fts5IndexQuery *
2b350 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 20  /.  u64 *pCksum 
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
2b380 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a 2f  hecksum value */
2b390 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69  .){.  int eDetai
2b3a0 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
2b3b0 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63  eDetail;.  u64 c
2b3c0 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a  ksum = *pCksum;.
2b3d0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
2b3e0 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e  *pIter = 0;.  in
2b3f0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  t rc = sqlite3Ft
2b400 73 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20  s5IndexQuery(p, 
2b410 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c 20  z, n, flags, 0, 
2b420 26 70 49 74 65 72 29 3b 0a 0a 20 20 77 68 69 6c  &pIter);..  whil
2b430 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2b440 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74   && 0==sqlite3Ft
2b450 73 35 49 74 65 72 45 6f 66 28 70 49 74 65 72 29  s5IterEof(pIter)
2b460 20 29 7b 0a 20 20 20 20 69 36 34 20 72 6f 77 69   ){.    i64 rowi
2b470 64 20 3d 20 70 49 74 65 72 2d 3e 69 52 6f 77 69  d = pIter->iRowi
2b480 64 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74  d;..    if( eDet
2b490 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
2b4a0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
2b4b0 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46  ksum ^= sqlite3F
2b4c0 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2b4d0 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20 30 2c 20  um(rowid, 0, 0, 
2b4e0 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  iIdx, z, n);.   
2b4f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74   }else{.      Ft
2b500 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
2b510 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 66  sReader;.      f
2b520 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35 50 6f  or(sqlite3Fts5Po
2b530 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28  slistReaderInit(
2b540 70 49 74 65 72 2d 3e 70 44 61 74 61 2c 20 70 49  pIter->pData, pI
2b550 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26 73 52 65  ter->nData, &sRe
2b560 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ader);.         
2b570 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d 3d 30   sReader.bEof==0
2b580 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2b590 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
2b5a0 61 64 65 72 4e 65 78 74 28 26 73 52 65 61 64 65  aderNext(&sReade
2b5b0 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  r).      ){.    
2b5c0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46      int iCol = F
2b5d0 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73  TS5_POS2COLUMN(s
2b5e0 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20  Reader.iPos);.  
2b5f0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
2b600 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
2b610 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a  (sReader.iPos);.
2b620 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d          cksum ^=
2b630 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2b640 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69  xEntryCksum(rowi
2b650 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69  d, iCol, iOff, i
2b660 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  Idx, z, n);.    
2b670 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2b680 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b690 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2b6a0 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
2b6b0 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a  t(pIter);.    }.
2b6c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73    }.  sqlite3Fts
2b6d0 35 49 74 65 72 43 6c 6f 73 65 28 70 49 74 65 72  5IterClose(pIter
2b6e0 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20  );..  *pCksum = 
2b6f0 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20  cksum;.  return 
2b700 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
2b710 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2b720 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20 69 6e  lso purely an in
2b730 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20  ternal test. It 
2b740 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
2b750 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66  ute to .** FTS f
2b760 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72  unctionality, or
2b770 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72   even the integr
2b780 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e  ity-check, in an
2b790 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  y way..*/.static
2b7a0 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 54 65   void fts5TestTe
2b7b0 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rm(.  Fts5Index 
2b7c0 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66 66 65  *p, .  Fts5Buffe
2b7d0 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20 20 20  r *pPrev,       
2b7e0 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
2b7f0 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e  us term */.  con
2b800 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
2b810 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
2b820 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74 65 72  Possibly new ter
2b830 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 75  m to test */.  u
2b840 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20 20 75  64 expected,.  u
2b850 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20 20  64 *pCksum.){.  
2b860 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
2b870 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e 3d 3d    if( pPrev->n==
2b880 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  0 ){.    fts5Buf
2b890 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72 65  ferSet(&rc, pPre
2b8a0 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a  v, n, (const u8*
2b8b0 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69  )z);.  }else.  i
2b8c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b8d0 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21 3d 6e   && (pPrev->n!=n
2b8e0 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72 65 76   || memcmp(pPrev
2b8f0 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a 20  ->p, z, n)) ){. 
2b900 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20     u64 cksum3 = 
2b910 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63 6f 6e  *pCksum;.    con
2b920 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
2b930 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 70   (const char*)&p
2b940 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20  Prev->p[1];  /* 
2b950 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66 69 78  term sans prefix
2b960 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74  -byte */.    int
2b970 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76 2d 3e   nTerm = pPrev->
2b980 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  n-1;            
2b990 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d  /* Size of zTerm
2b9a0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2b9b0 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70 50 72   int iIdx = (pPr
2b9c0 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53 35 5f  ev->p[0] - FTS5_
2b9d0 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a 20 20  MAIN_PREFIX);.  
2b9e0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 69    int flags = (i
2b9f0 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54 53  Idx==0 ? 0 : FTS
2ba00 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
2ba10 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20 63 6b  FIX);.    u64 ck
2ba20 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34 20 63  1 = 0;.    u64 c
2ba30 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  k2 = 0;..    /* 
2ba40 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72  Check that the r
2ba50 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20  esults returned 
2ba60 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45 53 43  for ASC and DESC
2ba70 20 71 75 65 72 69 65 73 20 61 72 65 0a 20 20 20   queries are.   
2ba80 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 49 66   ** the same. If
2ba90 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73 20   not, call this 
2baa0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
2bab0 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
2bac0 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
2bad0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
2bae0 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20 20  lags, &ck1);.   
2baf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bb00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
2bb10 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
2bb20 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a  DEX_QUERY_DESC;.
2bb30 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
2bb40 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
2bb50 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
2bb60 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 7d   f, &ck2);.    }
2bb70 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2bb80 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
2bb90 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
2bba0 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f 2a 20  ORRUPT;..    /* 
2bbb0 49 66 20 74 68 69 73 20 69 73 20 61 20 70 72 65  If this is a pre
2bbc0 66 69 78 20 71 75 65 72 79 2c 20 63 68 65 63 6b  fix query, check
2bbd0 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
2bbe0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
2bbf0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64  e.    ** the ind
2bc00 65 78 20 69 73 20 64 69 73 61 62 6c 65 64 20 61  ex is disabled a
2bc10 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49 6e 20  re the same. In 
2bc20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44 45 53  both ASC and DES
2bc30 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20 2a 2a  C order. .    **
2bc40 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63 68 65  .    ** This che
2bc50 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 70  ck may only be p
2bc60 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 20  erformed if the 
2bc70 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 65 6d  hash table is em
2bc80 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  pty. This.    **
2bc90 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
2bca0 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c 79 20  hash table only 
2bcb0 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67 6c  supports a singl
2bcc0 65 20 73 63 61 6e 20 71 75 65 72 79 20 61 74 0a  e scan query at.
2bcd0 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c 20 61      ** a time, a
2bce0 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69 74 65  nd the multi-ite
2bcf0 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68 69 63  r loop from whic
2bd00 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  h this function 
2bd10 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a  is called.    **
2bd20 20 69 73 20 61 6c 72 65 61 64 79 20 70 65 72 66   is already perf
2bd30 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20 73 63  orming such a sc
2bd40 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  an. */.    if( p
2bd50 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d  ->nPendingData==
2bd60 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
2bd70 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c  Idx>0 && rc==SQL
2bd80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bd90 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c    int f = flags|
2bda0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2bdb0 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20 20  TEST_NOIDX;.    
2bdc0 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20      ck2 = 0;.   
2bdd0 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75       rc = fts5Qu
2bde0 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
2bdf0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
2be00 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20  f, &ck2);.      
2be10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2be20 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
2be30 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
2be40 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
2be50 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26     if( iIdx>0 &&
2be60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2be70 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 20  {.        int f 
2be80 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45  = flags|FTS5INDE
2be90 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49  X_QUERY_TEST_NOI
2bea0 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  DX|FTS5INDEX_QUE
2beb0 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 20  RY_DESC;.       
2bec0 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   ck2 = 0;.      
2bed0 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79    rc = fts5Query
2bee0 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a  Cksum(p, iIdx, z
2bef0 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20  Term, nTerm, f, 
2bf00 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69  &ck2);.        i
2bf10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bf20 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72   && ck1!=ck2 ) r
2bf30 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2bf40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bf50 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20 63  .    cksum3 ^= c
2bf60 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  k1;.    fts5Buff
2bf70 65 72 53 65 74 28 26 72 63 2c 20 70 50 72 65 76  erSet(&rc, pPrev
2bf80 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  , n, (const u8*)
2bf90 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d  z);..    if( rc=
2bfa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
2bfb0 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64 20 29  sum3!=expected )
2bfc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46 54 53  {.      rc = FTS
2bfd0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2bfe0 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63  .    *pCksum = c
2bff0 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ksum3;.  }.  p->
2c000 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65 6c  rc = rc;.}. .#el
2c010 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  se.# define fts5
2c020 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65  TestDlidxReverse
2c030 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  (x,y,z).# define
2c040 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 75 2c   fts5TestTerm(u,
2c050 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
2c060 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  f../*.** Check t
2c070 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  hat:.**.**   1) 
2c080 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53  All leaves of pS
2c090 65 67 20 62 65 74 77 65 65 6e 20 69 46 69 72 73  eg between iFirs
2c0a0 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63  t and iLast (inc
2c0b0 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61 6e  lusive) exist an
2c0c0 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69  d.**      contai
2c0d0 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a 2a 2a  n zero terms..**
2c0e0 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76 65 73     2) All leaves
2c0f0 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e   of pSeg between
2c100 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20 69 4c   iNoRowid and iL
2c110 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20  ast (inclusive) 
2c120 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20  exist and.**    
2c130 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 72    contain zero r
2c140 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  owids..*/.static
2c150 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49   void fts5IndexI
2c160 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70  ntegrityCheckEmp
2c170 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ty(.  Fts5Index 
2c180 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  *p,.  Fts5Struct
2c190 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
2c1a0 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74  ,     /* Segment
2c1b0 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e   to check intern
2c1c0 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a  al consistency *
2c1d0 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 0a  /.  int iFirst,.
2c1e0 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64 2c 0a    int iNoRowid,.
2c1f0 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b 0a 20    int iLast.){. 
2c200 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4e 6f   int i;..  /* No
2c210 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
2c220 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61   iter.nEmpty lea
2c230 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ves following th
2c240 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20  e current leaf. 
2c250 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e   ** (a) exist an
2c260 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f  d (b) contain no
2c270 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66 6f 72   terms. */.  for
2c280 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e 72 63  (i=iFirst; p->rc
2c290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
2c2a0 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a 20  <=iLast; i++){. 
2c2b0 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
2c2c0 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
2c2d0 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
2c2e0 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
2c2f0 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20 20 69  egid, i));.    i
2c300 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
2c310 20 20 69 66 28 20 21 66 74 73 35 4c 65 61 66 49    if( !fts5LeafI
2c320 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66 29  sTermless(pLeaf)
2c330 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
2c340 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 69  CORRUPT;.      i
2c350 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64 20 26  f( i>=iNoRowid &
2c360 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46 69 72  & 0!=fts5LeafFir
2c370 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
2c380 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  ) ) p->rc = FTS5
2c390 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a  _CORRUPT;.    }.
2c3a0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
2c3b0 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d 0a  ase(pLeaf);.  }.
2c3c0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
2c3d0 74 73 35 49 6e 74 65 67 72 69 74 79 43 68 65 63  ts5IntegrityChec
2c3e0 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64 65 78  kPgidx(Fts5Index
2c3f0 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20 2a 70   *p, Fts5Data *p
2c400 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69 54 65  Leaf){.  int iTe
2c410 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69 6e 74  rmOff = 0;.  int
2c420 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75 66 66   ii;..  Fts5Buff
2c430 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30 2c 30  er buf1 = {0,0,0
2c440 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  };.  Fts5Buffer 
2c450 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a  buf2 = {0,0,0};.
2c460 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d 3e 73  .  ii = pLeaf->s
2c470 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65 28 20  zLeaf;.  while( 
2c480 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26 26 20  ii<pLeaf->nn && 
2c490 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2c4a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   ){.    int res;
2c4b0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
2c4c0 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 0a 20     int nIncr;.. 
2c4d0 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47 65 74     ii += fts5Get
2c4e0 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
2c4f0 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29 3b 0a  >p[ii], nIncr);.
2c500 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20      iTermOff += 
2c510 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66 66 20  nIncr;.    iOff 
2c520 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20  = iTermOff;..   
2c530 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66   if( iOff>=pLeaf
2c540 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
2c550 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
2c560 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73  ORRUPT;.    }els
2c570 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 3d 3d  e if( iTermOff==
2c580 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20 20 69  nIncr ){.      i
2c590 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  nt nByte;.      
2c5a0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
2c5b0 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
2c5c0 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  p[iOff], nByte);
2c5d0 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66  .      if( (iOff
2c5e0 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73  +nByte)>pLeaf->s
2c5f0 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
2c600 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2c610 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  RRUPT;.      }el
2c620 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
2c630 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
2c640 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20  , &buf1, nByte, 
2c650 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29  &pLeaf->p[iOff])
2c660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2c670 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
2c680 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20 20 20  Keep, nByte;.   
2c690 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2c6a0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2c6b0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  f->p[iOff], nKee
2c6c0 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  p);.      iOff +
2c6d0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2c6e0 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
2c6f0 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
2c700 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66 31 2e   if( nKeep>buf1.
2c710 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79 74 65  n || (iOff+nByte
2c720 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  )>pLeaf->szLeaf 
2c730 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
2c740 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2c750 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2c760 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d 20 6e        buf1.n = n
2c770 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74  Keep;.        ft
2c780 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
2c790 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31  ob(&p->rc, &buf1
2c7a0 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d  , nByte, &pLeaf-
2c7b0 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  >p[iOff]);.     
2c7c0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d   }..      if( p-
2c7d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
2c7e0 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
2c7f0 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
2c800 65 28 26 62 75 66 31 2c 20 26 62 75 66 32 29 3b  e(&buf1, &buf2);
2c810 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
2c820 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  <=0 ) p->rc = FT
2c830 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2c840 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
2c850 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
2c860 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66 31 2e  rc, &buf2, buf1.
2c870 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20 7d 0a  n, buf1.p);.  }.
2c880 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
2c890 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74 73 35  e(&buf1);.  fts5
2c8a0 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 32  BufferFree(&buf2
2c8b0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
2c8c0 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67  d fts5IndexInteg
2c8d0 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74  rityCheckSegment
2c8e0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
2c8f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c900 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
2c910 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
2c920 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2c930 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20  ment *pSeg      
2c940 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68  /* Segment to ch
2c950 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e  eck internal con
2c960 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20  sistency */.){. 
2c970 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2c980 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
2c990 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  g;.  sqlite3_stm
2c9a0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
2c9b0 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74 20 69  int rc2;.  int i
2c9c0 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53  IdxPrevLeaf = pS
2c9d0 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b  eg->pgnoFirst-1;
2c9e0 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50 72 65  .  int iDlidxPre
2c9f0 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67  vLeaf = pSeg->pg
2ca00 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28 20 70  noLast;..  if( p
2ca10 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
2ca20 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66  0 ) return;..  f
2ca30 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
2ca40 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c 20 73  tmt(p, &pStmt, s
2ca50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
2ca60 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 65        "SELECT se
2ca70 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67 6e 6f  gid, term, (pgno
2ca80 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29 20 46  >>1), (pgno&1) F
2ca90 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78 27 20  ROM %Q.'%q_idx' 
2caa0 57 48 45 52 45 20 73 65 67 69 64 3d 25 64 22 2c  WHERE segid=%d",
2cab0 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e  .      pConfig->
2cac0 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  zDb, pConfig->zN
2cad0 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  ame, pSeg->iSegi
2cae0 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 74  d.  ));..  /* It
2caf0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
2cb00 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  e b-tree hierarc
2cb10 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  hy.  */.  while(
2cb20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2cb30 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
2cb40 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
2cb50 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36 34 20  tmt) ){.    i64 
2cb60 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  iRow;           
2cb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
2cb80 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  id for this leaf
2cb90 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61   */.    Fts5Data
2cba0 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
2cbb0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
2cbc0 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 0a  r this leaf */..
2cbd0 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65 72 6d      int nIdxTerm
2cbe0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2cbf0 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31  n_bytes(pStmt, 1
2cc00 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
2cc10 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20 28 63  r *zIdxTerm = (c
2cc20 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
2cc30 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2cc40 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69 6e  Stmt, 1);.    in
2cc50 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73 71 6c  t iIdxLeaf = sql
2cc60 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
2cc70 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69  pStmt, 2);.    i
2cc80 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d 20 73  nt bIdxDlidx = s
2cc90 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2cca0 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20  t(pStmt, 3);..  
2ccb0 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66    /* If the leaf
2ccc0 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73   in question has
2ccd0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72   already been tr
2cce0 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73  immed from the s
2ccf0 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20  egment, .    ** 
2cd00 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72  ignore this b-tr
2cd10 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77  ee entry. Otherw
2cd20 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74  ise, load it int
2cd30 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20  o memory. */.   
2cd40 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c 70 53   if( iIdxLeaf<pS
2cd50 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20  eg->pgnoFirst ) 
2cd60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52  continue;.    iR
2cd70 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ow = FTS5_SEGMEN
2cd80 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
2cd90 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b  egid, iIdxLeaf);
2cda0 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73  .    pLeaf = fts
2cdb0 35 4c 65 61 66 52 65 61 64 28 70 2c 20 69 52 6f  5LeafRead(p, iRo
2cdc0 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61  w);.    if( pLea
2cdd0 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  f==0 ) break;.. 
2cde0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
2cdf0 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69   the leaf contai
2ce00 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
2ce10 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20 69  term, and that i
2ce20 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20 2a  t is equal.    *
2ce30 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20 74  * to or larger t
2ce40 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65  han the split-ke
2ce50 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e 20 20  y in zIdxTerm.  
2ce60 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20  Also check that 
2ce70 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  if there.    ** 
2ce80 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69 64 20  is also a rowid 
2ce90 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e 20 74  pointer within t
2cea0 68 65 20 6c 65 61 66 20 70 61 67 65 20 68 65 61  he leaf page hea
2ceb0 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73 20 74  der, it points t
2cec0 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63 61 74  o a.    ** locat
2ced0 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 20 74  ion before the t
2cee0 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  erm.  */.    if(
2cef0 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c 65 61   pLeaf->nn<=pLea
2cf00 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
2cf10 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2cf20 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c  CORRUPT;.    }el
2cf30 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f  se{.      int iO
2cf40 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
2cf50 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2cf60 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  of first term on
2cf70 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69   leaf */.      i
2cf80 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20 20 20  nt iRowidOff;   
2cf90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2cfa0 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 72 6f  fset of first ro
2cfb0 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20  wid on leaf */. 
2cfc0 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20       int nTerm; 
2cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfe0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
2cff0 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65   on leaf in byte
2d000 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  s */.      int r
2d010 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
2d020 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
2d030 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64  ison of term and
2d040 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a 20   split-key */.. 
2d050 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35       iOff = fts5
2d060 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
2d070 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69  (pLeaf);.      i
2d080 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c  RowidOff = fts5L
2d090 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
2d0a0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69  (pLeaf);.      i
2d0b0 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 69 4f  f( iRowidOff>=iO
2d0c0 66 66 20 7c 7c 20 69 4f 66 66 3e 3d 70 4c 65 61  ff || iOff>=pLea
2d0d0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
2d0e0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2d0f0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2d100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d110 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
2d120 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
2d130 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b  p[iOff], nTerm);
2d140 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d  .        res = m
2d150 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b  emcmp(&pLeaf->p[
2d160 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c  iOff], zIdxTerm,
2d170 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78   MIN(nTerm, nIdx
2d180 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  Term));.        
2d190 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73  if( res==0 ) res
2d1a0 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54   = nTerm - nIdxT
2d1b0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
2d1c0 20 72 65 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d   res<0 ) p->rc =
2d1d0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2d1e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
2d1f0 73 35 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  s5IntegrityCheck
2d200 50 67 69 64 78 28 70 2c 20 70 4c 65 61 66 29 3b  Pgidx(p, pLeaf);
2d210 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
2d220 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
2d230 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
2d240 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
2d250 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  * Now check that
2d260 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79   the iter.nEmpty
2d270 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e   leaves followin
2d280 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  g the current le
2d290 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78  af.    ** (a) ex
2d2a0 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ist and (b) cont
2d2b0 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f  ain no terms. */
2d2c0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e  .    fts5IndexIn
2d2d0 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74  tegrityCheckEmpt
2d2e0 79 28 0a 20 20 20 20 20 20 20 20 70 2c 20 70 53  y(.        p, pS
2d2f0 65 67 2c 20 69 49 64 78 50 72 65 76 4c 65 61 66  eg, iIdxPrevLeaf
2d300 2b 31 2c 20 69 44 6c 69 64 78 50 72 65 76 4c 65  +1, iDlidxPrevLe
2d310 61 66 2b 31 2c 20 69 49 64 78 4c 65 61 66 2d 31  af+1, iIdxLeaf-1
2d320 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
2d330 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
2d340 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2d350 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
2d360 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69  ex, check that i
2d370 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a  t looks right. *
2d380 2f 0a 20 20 20 20 69 66 28 20 62 49 64 78 44 6c  /.    if( bIdxDl
2d390 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73  idx ){.      Fts
2d3a0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
2d3b0 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20  dx = 0;  /* For 
2d3c0 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
2d3d0 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  h doclist index 
2d3e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72  */.      int iPr
2d3f0 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61  evLeaf = iIdxLea
2d400 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  f;.      int iSe
2d410 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67  gid = pSeg->iSeg
2d420 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 50  id;.      int iP
2d430 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34  g = 0;.      i64
2d440 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f   iKey;..      fo
2d450 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
2d460 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c  dxIterInit(p, 0,
2d470 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61   iSegid, iIdxLea
2d480 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  f);.          ft
2d490 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
2d4a0 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
2d4b0 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
2d4c0 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c  xIterNext(p, pDl
2d4d0 69 64 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20  idx).      ){.. 
2d4e0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2d4f0 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73 20 70  any rowid-less p
2d500 61 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ages that occur 
2d510 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
2d520 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20  nt leaf. */.    
2d530 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65      for(iPg=iPre
2d540 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66 74 73  vLeaf+1; iPg<fts
2d550 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2d560 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a  Dlidx); iPg++){.
2d570 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d            iKey =
2d580 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
2d590 57 49 44 28 69 53 65 67 69 64 2c 20 69 50 67 29  WID(iSegid, iPg)
2d5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61  ;.          pLea
2d5b0 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
2d5c0 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20  (p, iKey);.     
2d5d0 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
2d5e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2d5f0 28 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  ( fts5LeafFirstR
2d600 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 21 3d  owidOff(pLeaf)!=
2d610 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
2d620 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2d630 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
2d640 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
2d650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d660 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50 72 65    }.        iPre
2d670 76 4c 65 61 66 20 3d 20 66 74 73 35 44 6c 69 64  vLeaf = fts5Dlid
2d680 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
2d690 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  );..        /* C
2d6a0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65  heck that the le
2d6b0 61 66 20 70 61 67 65 20 69 6e 64 69 63 61 74 65  af page indicate
2d6c0 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
2d6d0 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20  r really does.  
2d6e0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
2d6f0 20 74 68 65 20 72 6f 77 69 64 20 73 75 67 67 65   the rowid sugge
2d700 73 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  sted by the same
2d710 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65  . */.        iKe
2d720 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  y = FTS5_SEGMENT
2d730 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
2d740 50 72 65 76 4c 65 61 66 29 3b 0a 20 20 20 20 20  PrevLeaf);.     
2d750 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
2d760 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
2d770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
2d780 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2d790 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
2d7a0 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
2d7b0 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  dOff = fts5LeafF
2d7c0 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
2d7d0 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 41  af);.          A
2d7e0 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
2d7f0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
2d800 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e    if( iRowidOff>
2d810 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
2d820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
2d830 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2d840 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  PT;.          }e
2d850 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2d860 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
2d870 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f  pLeaf->p[iRowidO
2d880 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77  ff], (u64*)&iRow
2d890 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
2d8a0 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66 74 73   if( iRowid!=fts
2d8b0 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
2d8c0 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72 63 20  pDlidx) ) p->rc 
2d8d0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2d8e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d8f0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
2d900 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
2d910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d920 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50 72 65  .      iDlidxPre
2d930 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a 20 20 20  vLeaf = iPg;.   
2d940 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
2d950 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
2d960 20 20 20 20 66 74 73 35 54 65 73 74 44 6c 69 64      fts5TestDlid
2d970 78 52 65 76 65 72 73 65 28 70 2c 20 69 53 65 67  xReverse(p, iSeg
2d980 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20  id, iIdxLeaf);. 
2d990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d9a0 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d  iDlidxPrevLeaf =
2d9b0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b   pSeg->pgnoLast;
2d9c0 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
2d9d0 43 68 65 63 6b 20 74 68 65 72 65 20 69 73 20 6e  Check there is n
2d9e0 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  o doclist index 
2d9f0 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 49  */.    }..    iI
2da00 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64  dxPrevLeaf = iId
2da10 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 72 63  xLeaf;.  }..  rc
2da20 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
2da30 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
2da40 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2da50 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
2da60 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69 74  2;..  /* Page it
2da70 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e 6f  er.iLeaf must no
2da80 77 20 62 65 20 74 68 65 20 72 69 67 68 74 6d 6f  w be the rightmo
2da90 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69 6e 20  st leaf-page in 
2daa0 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 23  the segment */.#
2dab0 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e 72 63  if 0.  if( p->rc
2dac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
2dad0 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d  ter.iLeaf!=pSeg-
2dae0 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
2daf0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2db00 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  RRUPT;.  }.#endi
2db10 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  f.}.../*.** Run 
2db20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20  internal checks 
2db30 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
2db40 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 61 29  he FTS index (a)
2db50 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a   is internally .
2db60 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e  ** consistent an
2db70 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20 65  d (b) contains e
2db80 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69 63 68  ntries for which
2db90 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20   the XOR of the 
2dba0 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20  checksums.** as 
2dbb0 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 73 71  calculated by sq
2dbc0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
2dbd0 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b  tryCksum() is ck
2dbe0 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  sum..**.** Retur
2dbf0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2dc00 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69   if any of the i
2dc10 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66  nternal checks f
2dc20 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a  ail, or if the.*
2dc30 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20  * checksum does 
2dc40 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72  not match. Retur
2dc50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
2dc60 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73 20 77  ll checks pass w
2dc70 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c  ithout.** error,
2dc80 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53   or some other S
2dc90 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2dca0 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f   if another erro
2dcb0 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20  r (e.g. OOM).** 
2dcc0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
2dcd0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49  qlite3Fts5IndexI
2dce0 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74  ntegrityCheck(Ft
2dcf0 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20  s5Index *p, u64 
2dd00 63 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 65 44  cksum){.  int eD
2dd10 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66  etail = p->pConf
2dd20 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75  ig->eDetail;.  u
2dd30 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20  64 cksum2 = 0;  
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dd50 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
2dd60 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   on contents of 
2dd70 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73  indexes */.  Fts
2dd80 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20  5Buffer poslist 
2dd90 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20  = {0,0,0};   /* 
2dda0 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68  Buffer used to h
2ddb0 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f  old a poslist */
2ddc0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
2ddd0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2dde0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
2ddf0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e  erate through en
2de00 74 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  tire index */.  
2de10 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2de20 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20 20  Struct;         
2de30 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
2de40 72 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  re */..#ifdef SQ
2de50 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
2de60 55 73 65 64 20 62 79 20 65 78 74 72 61 20 69 6e  Used by extra in
2de70 74 65 72 6e 61 6c 20 74 65 73 74 73 20 6f 6e 6c  ternal tests onl
2de80 79 20 72 75 6e 20 69 66 20 4e 44 45 42 55 47 20  y run if NDEBUG 
2de90 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 2a  is not defined *
2dea0 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d  /.  u64 cksum3 =
2deb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2dec0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
2ded0 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
2dee0 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
2def0 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
2df00 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20  m = {0,0,0};    
2df10 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
2df20 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65   to hold most re
2df30 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 23 65 6e  cent term */.#en
2df40 64 69 66 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  dif.  const int 
2df50 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45  flags = FTS5INDE
2df60 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54  X_QUERY_NOOUTPUT
2df70 3b 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ;.  .  /* Load t
2df80 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74 72  he FTS index str
2df90 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 53 74 72  ucture */.  pStr
2dfa0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
2dfb0 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f  ureRead(p);..  /
2dfc0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2dfd0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20   internal nodes 
2dfe0 6f 66 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20  of each segment 
2dff0 6d 61 74 63 68 20 74 68 65 20 6c 65 61 76 65 73  match the leaves
2e000 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63   */.  if( pStruc
2e010 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76  t ){.    int iLv
2e020 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 66 6f 72  l, iSeg;.    for
2e030 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
2e040 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
2e050 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  Lvl++){.      fo
2e060 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
2e070 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
2e080 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
2e090 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  +){.        Fts5
2e0a0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2e0b0 20 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75 63   *pSeg = &pStruc
2e0c0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
2e0d0 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
2e0e0 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74      fts5IndexInt
2e0f0 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
2e100 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20  nt(p, pSeg);.   
2e110 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2e120 20 20 2f 2a 20 54 68 65 20 63 6b 73 75 6d 20 61    /* The cksum a
2e130 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
2e140 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
2e150 69 73 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61  is a checksum ca
2e160 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61  lculated.  ** ba
2e170 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63  sed on all expec
2e180 74 65 64 20 65 6e 74 72 69 65 73 20 69 6e 20 74  ted entries in t
2e190 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 69 6e  he FTS index (in
2e1a0 63 6c 75 64 69 6e 67 20 70 72 65 66 69 78 20 69  cluding prefix i
2e1b0 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65  ndex.  ** entrie
2e1c0 73 29 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 63  s). This block c
2e1d0 68 65 63 6b 73 20 74 68 61 74 20 61 20 63 68 65  hecks that a che
2e1e0 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64  cksum calculated
2e1f0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20   based on the.  
2e200 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e  ** actual conten
2e210 74 73 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20  ts of FTS index 
2e220 69 73 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20  is identical..  
2e230 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76 65 72 73  **.  ** Two vers
2e240 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65  ions of the same
2e250 20 63 68 65 63 6b 73 75 6d 20 61 72 65 20 63 61   checksum are ca
2e260 6c 63 75 6c 61 74 65 64 2e 20 54 68 65 20 66 69  lculated. The fi
2e270 72 73 74 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20  rst (stack.  ** 
2e280 76 61 72 69 61 62 6c 65 20 63 6b 73 75 6d 32 29  variable cksum2)
2e290 20 62 61 73 65 64 20 6f 6e 20 65 6e 74 72 69 65   based on entrie
2e2a0 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
2e2b0 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
2e2c0 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20  ndex.  ** while 
2e2d0 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73  doing a linear s
2e2e0 63 61 6e 20 6f 66 20 65 61 63 68 20 69 6e 64 69  can of each indi
2e2f0 76 69 64 75 61 6c 20 69 6e 64 65 78 20 69 6e 20  vidual index in 
2e300 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  turn. .  **.  **
2e310 20 41 73 20 65 61 63 68 20 74 65 72 6d 20 76 69   As each term vi
2e320 73 69 74 65 64 20 62 79 20 74 68 65 20 6c 69 6e  sited by the lin
2e330 65 61 72 20 73 63 61 6e 73 2c 20 61 20 73 65 70  ear scans, a sep
2e340 61 72 61 74 65 20 71 75 65 72 79 20 66 6f 72 20  arate query for 
2e350 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65  the.  ** same te
2e360 72 6d 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  rm is performed.
2e370 20 63 6b 73 75 6d 33 20 69 73 20 63 61 6c 63 75   cksum3 is calcu
2e380 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  lated based on t
2e390 68 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  he entries.  ** 
2e3a0 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65  extracted by the
2e3b0 73 65 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  se queries..  */
2e3c0 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69  .  for(fts5Multi
2e3d0 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75  IterNew(p, pStru
2e3e0 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c  ct, flags, 0, 0,
2e3f0 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74 65   0, -1, 0, &pIte
2e400 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
2e410 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
2e420 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
2e430 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
2e440 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
2e450 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  .  ){.    int n;
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e470 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2e480 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a   term in bytes *
2e490 2f 0a 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d  /.    i64 iPos =
2e4a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e4b0 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 72 65    /* Position re
2e4c0 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20  ad from poslist 
2e4d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20  */.    int iOff 
2e4e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2e4f0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 77 69 74     /* Offset wit
2e500 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20  hin poslist */. 
2e510 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
2e520 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
2e530 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 63  id(pIter);.    c
2e540 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29  har *z = (char*)
2e550 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
2e560 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20  m(pIter, &n);.. 
2e570 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2e580 20 61 20 6e 65 77 20 74 65 72 6d 2c 20 71 75 65   a new term, que
2e590 72 79 20 66 6f 72 20 69 74 2e 20 55 70 64 61 74  ry for it. Updat
2e5a0 65 20 63 6b 73 75 6d 33 20 77 69 74 68 20 74 68  e cksum3 with th
2e5b0 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20  e results. */.  
2e5c0 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70    fts5TestTerm(p
2e5d0 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63  , &term, z, n, c
2e5e0 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b  ksum2, &cksum3);
2e5f0 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
2e600 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
2e610 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ONE ){.      if(
2e620 20 30 3d 3d 66 74 73 35 4d 75 6c 74 69 49 74 65   0==fts5MultiIte
2e630 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65  rIsEmpty(p, pIte
2e640 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6b  r) ){.        ck
2e650 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33 46  sum2 ^= sqlite3F
2e660 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2e670 75 6d 28 69 52 6f 77 69 64 2c 20 30 2c 20 30 2c  um(iRowid, 0, 0,
2e680 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20   -1, z, n);.    
2e690 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2e6a0 20 20 20 20 20 70 6f 73 6c 69 73 74 2e 6e 20 3d       poslist.n =
2e6b0 20 30 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65   0;.      fts5Se
2e6c0 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20  giterPoslist(p, 
2e6d0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74  &pIter->aSeg[pIt
2e6e0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
2e6f0 69 72 73 74 5d 2c 20 30 2c 20 26 70 6f 73 6c 69  irst], 0, &posli
2e700 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
2e710 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  ( 0==sqlite3Fts5
2e720 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 70 6f  PoslistNext64(po
2e730 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73 74  slist.p, poslist
2e740 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f 73  .n, &iOff, &iPos
2e750 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
2e760 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53   iCol = FTS5_POS
2e770 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20  2COLUMN(iPos);. 
2e780 20 20 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f         int iTokO
2e790 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46  ff = FTS5_POS2OF
2e7a0 46 53 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20  FSET(iPos);.    
2e7b0 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71      cksum2 ^= sq
2e7c0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
2e7d0 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
2e7e0 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20   iCol, iTokOff, 
2e7f0 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  -1, z, n);.     
2e800 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
2e810 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26  ts5TestTerm(p, &
2e820 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75  term, 0, 0, cksu
2e830 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20  m2, &cksum3);.. 
2e840 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
2e850 65 65 28 70 49 74 65 72 29 3b 0a 20 20 69 66 28  ee(pIter);.  if(
2e860 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2e870 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75  K && cksum!=cksu
2e880 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  m2 ) p->rc = FTS
2e890 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74  5_CORRUPT;..  ft
2e8a0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
2e8b0 73 65 28 70 53 74 72 75 63 74 29 3b 0a 23 69 66  se(pStruct);.#if
2e8c0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2e8d0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
2e8e0 65 28 26 74 65 72 6d 29 3b 0a 23 65 6e 64 69 66  e(&term);.#endif
2e8f0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
2e900 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 72  e(&poslist);.  r
2e910 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
2e920 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 2a  eturn(p);.}../**
2e930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e970 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2e980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e9c0 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73  **.** Below this
2e9d0 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d   point is the im
2e9e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2e9f0 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2ea00 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63  ) scalar.** func
2ea10 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f  tion only..*/../
2ea20 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73 65  *.** Decode a se
2ea30 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77 69 64  gment-data rowid
2ea40 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
2ea50 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
2ea60 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20  ction is.** the 
2ea70 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61 63 72  opposite of macr
2ea80 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  o FTS5_SEGMENT_R
2ea90 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  OWID()..*/.stati
2eaa0 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2eab0 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20 69 52  eRowid(.  i64 iR
2eac0 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
2ead0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
2eae0 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61 20 74  id from %_data t
2eaf0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  able */.  int *p
2eb00 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
2eb10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2eb20 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  : Segment id */.
2eb30 20 20 69 6e 74 20 2a 70 62 44 6c 69 64 78 2c 20    int *pbDlidx, 
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb50 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64 78 20    /* OUT: Dlidx 
2eb60 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  flag */.  int *p
2eb70 69 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20  iHeight,        
2eb80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2eb90 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e  : Height */.  in
2eba0 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20  t *piPgno       
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ebc0 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65   OUT: Page numbe
2ebd0 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e  r */.){.  *piPgn
2ebe0 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  o = (int)(iRowid
2ebf0 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
2ec00 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29  TS5_DATA_PAGE_B)
2ec10 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64   - 1));.  iRowid
2ec20 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50   >>= FTS5_DATA_P
2ec30 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69  AGE_B;..  *piHei
2ec40 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  ght = (int)(iRow
2ec50 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
2ec60 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48   FTS5_DATA_HEIGH
2ec70 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  T_B) - 1));.  iR
2ec80 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
2ec90 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20  TA_HEIGHT_B;..  
2eca0 2a 70 62 44 6c 69 64 78 20 3d 20 28 69 6e 74 29  *pbDlidx = (int)
2ecb0 28 69 52 6f 77 69 64 20 26 20 30 78 30 30 30 31  (iRowid & 0x0001
2ecc0 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
2ecd0 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 3b  FTS5_DATA_DLI_B;
2ece0 0a 0a 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28  ..  *piSegid = (
2ecf0 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
2ed00 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
2ed10 41 54 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b  ATA_ID_B) - 1));
2ed20 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
2ed30 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 69  fts5DebugRowid(i
2ed40 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
2ed50 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69  fer *pBuf, i64 i
2ed60 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 53 65 67  Key){.  int iSeg
2ed70 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67  id, iHeight, iPg
2ed80 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20 20 20 20  no, bDlidx;     
2ed90 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65    /* Rowid compe
2eda0 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44  nents */.  fts5D
2edb0 65 63 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c  ecodeRowid(iKey,
2edc0 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64   &iSegid, &bDlid
2edd0 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50  x, &iHeight, &iP
2ede0 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  gno);..  if( iSe
2edf0 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  gid==0 ){.    if
2ee00 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45  ( iKey==FTS5_AVE
2ee10 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20  RAGES_ROWID ){. 
2ee20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2ee30 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2ee40 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b  tf(pRc, pBuf, "{
2ee50 61 76 65 72 61 67 65 73 7d 20 22 29 3b 0a 20 20  averages} ");.  
2ee60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2ee70 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2ee80 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2ee90 2c 20 70 42 75 66 2c 20 22 7b 73 74 72 75 63 74  , pBuf, "{struct
2eea0 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ure}");.    }.  
2eeb0 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  }.  else{.    sq
2eec0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2eed0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2eee0 20 70 42 75 66 2c 20 22 7b 25 73 73 65 67 69 64   pBuf, "{%ssegid
2eef0 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64  =%d h=%d pgno=%d
2ef00 7d 22 2c 0a 20 20 20 20 20 20 20 20 62 44 6c 69  }",.        bDli
2ef10 64 78 20 3f 20 22 64 6c 69 64 78 20 22 20 3a 20  dx ? "dlidx " : 
2ef20 22 22 2c 20 69 53 65 67 69 64 2c 20 69 48 65 69  "", iSegid, iHei
2ef30 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29  ght, iPgno.    )
2ef40 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
2ef50 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74  void fts5DebugSt
2ef60 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a  ructure(.  int *
2ef70 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
2ef80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2ef90 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
2efa0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2efb0 20 2a 70 42 75 66 2c 0a 20 20 46 74 73 35 53 74   *pBuf,.  Fts5St
2efc0 72 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20  ructure *p.){.  
2efd0 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20  int iLvl, iSeg; 
2efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eff0 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
2f000 67 68 20 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65  gh levels, segme
2f010 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c  nts */..  for(iL
2f020 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c  vl=0; iLvl<p->nL
2f030 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
2f040 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
2f050 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
2f060 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
2f070 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2f080 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2f090 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20  f(pRc, pBuf, .  
2f0a0 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20        " {lvl=%d 
2f0b0 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65 67 3d 25  nMerge=%d nSeg=%
2f0c0 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e  d", iLvl, pLvl->
2f0d0 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53  nMerge, pLvl->nS
2f0e0 65 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f  eg.    );.    fo
2f0f0 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
2f100 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl->nSeg; iSeg+
2f110 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
2f120 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
2f130 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53  pSeg = &pLvl->aS
2f140 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
2f150 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2f160 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2f170 63 2c 20 70 42 75 66 2c 20 22 20 7b 69 64 3d 25  c, pBuf, " {id=%
2f180 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d  d leaves=%d..%d}
2f190 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 53  ", .          pS
2f1a0 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67  eg->iSegid, pSeg
2f1b0 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65  ->pgnoFirst, pSe
2f1c0 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20  g->pgnoLast.    
2f1d0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
2f1e0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f1f0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f200 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20  , pBuf, "}");.  
2f210 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2f220 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
2f230 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62  ts5_decode() deb
2f240 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a  ugging aid..**.*
2f250 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f  * Arguments pBlo
2f260 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20  b/nBlob contain 
2f270 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46 74 73  a serialized Fts
2f280 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
2f290 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t. This.** funct
2f2a0 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75  ion appends a hu
2f2b0 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70  man-readable rep
2f2c0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
2f2d0 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a 2a  he same object.*
2f2e0 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  * to the buffer 
2f2f0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2f300 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a  cond argument. .
2f310 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2f320 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75  ts5DecodeStructu
2f330 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  re(.  int *pRc, 
2f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f350 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2f360 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
2f370 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2f380 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  f,.  const u8 *p
2f390 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a  Blob, int nBlob.
2f3a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
2f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2f3d0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ode */.  Fts5Str
2f3e0 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b 20 20  ucture *p = 0;  
2f3f0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f           /* Deco
2f400 64 65 64 20 73 74 72 75 63 74 75 72 65 20 6f 62  ded structure ob
2f410 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  ject */..  rc = 
2f420 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
2f430 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  ode(pBlob, nBlob
2f440 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66 28 20  , 0, &p);.  if( 
2f450 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f460 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a  .    *pRc = rc;.
2f470 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2f480 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75  .  fts5DebugStru
2f490 63 74 75 72 65 28 70 52 63 2c 20 70 42 75 66 2c  cture(pRc, pBuf,
2f4a0 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   p);.  fts5Struc
2f4b0 74 75 72 65 52 65 6c 65 61 73 65 28 70 29 3b 0a  tureRelease(p);.
2f4c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
2f4d0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 74 73   part of the fts
2f4e0 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75 67  5_decode() debug
2f4f0 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20  ging aid..**.** 
2f500 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f  Arguments pBlob/
2f510 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 6e  nBlob contain an
2f520 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
2f530 72 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  rd. This functio
2f540 6e 20 0a 2a 2a 20 61 70 70 65 6e 64 73 20 61 20  n .** appends a 
2f550 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72  human-readable r
2f560 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2f570 20 72 65 63 6f 72 64 20 74 6f 20 74 68 65 20 62   record to the b
2f580 75 66 66 65 72 20 70 61 73 73 65 64 20 0a 2a 2a  uffer passed .**
2f590 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2f5a0 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61  rgument. .*/.sta
2f5b0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
2f5c0 6f 64 65 41 76 65 72 61 67 65 73 28 0a 20 20 69  odeAverages(.  i
2f5d0 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
2f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f5f0 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20  * IN/OUT: error 
2f600 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
2f610 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f  ffer *pBuf,.  co
2f620 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69  nst u8 *pBlob, i
2f630 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e  nt nBlob.){.  in
2f640 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  t i = 0;.  const
2f650 20 63 68 61 72 20 2a 7a 53 70 61 63 65 20 3d 20   char *zSpace = 
2f660 22 22 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c  "";..  while( i<
2f670 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 75 36 34  nBlob ){.    u64
2f680 20 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20   iVal;.    i += 
2f690 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
2f6a0 72 69 6e 74 28 26 70 42 6c 6f 62 5b 69 5d 2c 20  rint(&pBlob[i], 
2f6b0 26 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  &iVal);.    sqli
2f6c0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2f6d0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2f6e0 42 75 66 2c 20 22 25 73 25 64 22 2c 20 7a 53 70  Buf, "%s%d", zSp
2f6f0 61 63 65 2c 20 28 69 6e 74 29 69 56 61 6c 29 3b  ace, (int)iVal);
2f700 0a 20 20 20 20 7a 53 70 61 63 65 20 3d 20 22 20  .    zSpace = " 
2f710 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ";.  }.}../*.** 
2f720 42 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20  Buffer (a/n) is 
2f730 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
2f740 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72  in a list of ser
2f750 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e  ialized varints.
2f760 20 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61   Read.** each va
2f770 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20  rint and append 
2f780 69 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65  its string repre
2f790 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66  sentation to buf
2f7a0 66 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e  fer pBuf. Return
2f7b0 0a 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72  .** after either
2f7c0 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2f7d0 72 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f  r is exhausted o
2f7e0 72 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72  r a 0 value is r
2f7f0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ead..**.** The r
2f800 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
2f810 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2f820 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
2f830 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
2f840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2f850 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69  5DecodePoslist(i
2f860 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
2f870 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
2f880 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
2f890 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
2f8a0 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20    while( iOff<n 
2f8b0 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b  ){.    int iVal;
2f8c0 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  .    iOff += fts
2f8d0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
2f8e0 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20  iOff], iVal);.  
2f8f0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2f900 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2f910 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22  pRc, pBuf, " %d"
2f920 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72  , iVal);.  }.  r
2f930 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f  eturn iOff;.}../
2f940 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f  *.** The start o
2f950 66 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63  f buffer (a/n) c
2f960 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 72  ontains the star
2f970 74 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20  t of a doclist. 
2f980 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d  The doclist.** m
2f990 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69  ay or may not fi
2f9a0 6e 69 73 68 20 77 69 74 68 69 6e 20 74 68 65 20  nish within the 
2f9b0 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e  buffer. This fun
2f9c0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
2f9d0 74 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e  text.** represen
2f9e0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  tation of the pa
2f9f0 72 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73  rt of the doclis
2fa00 74 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  t that is presen
2fa10 74 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70  t to buffer.** p
2fa20 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Buf. .**.** The 
2fa30 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
2fa40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2fa50 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  tes read from th
2fa60 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a  e input buffer..
2fa70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
2fa80 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28  s5DecodeDoclist(
2fa90 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75  int *pRc, Fts5Bu
2faa0 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73  ffer *pBuf, cons
2fab0 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b  t u8 *a, int n){
2fac0 0a 20 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20  .  i64 iDocid = 
2fad0 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  0;.  int iOff = 
2fae0 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b  0;..  if( n>0 ){
2faf0 0a 20 20 20 20 69 4f 66 66 20 3d 20 73 71 6c 69  .    iOff = sqli
2fb00 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2fb10 28 61 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69  (a, (u64*)&iDoci
2fb20 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  d);.    sqlite3F
2fb30 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2fb40 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2fb50 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f   " id=%lld", iDo
2fb60 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  cid);.  }.  whil
2fb70 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
2fb80 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69   int nPos;.    i
2fb90 6e 74 20 62 44 65 6c 3b 0a 20 20 20 20 69 4f 66  nt bDel;.    iOf
2fba0 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  f += fts5GetPosl
2fbb0 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d  istSize(&a[iOff]
2fbc0 2c 20 26 6e 50 6f 73 2c 20 26 62 44 65 6c 29 3b  , &nPos, &bDel);
2fbd0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2fbe0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2fbf0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2fc00 6e 50 6f 73 3d 25 64 25 73 22 2c 20 6e 50 6f 73  nPos=%d%s", nPos
2fc10 2c 20 62 44 65 6c 3f 22 2a 22 3a 22 22 29 3b 0a  , bDel?"*":"");.
2fc20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2fc30 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52  DecodePoslist(pR
2fc40 63 2c 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66  c, pBuf, &a[iOff
2fc50 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e  ], MIN(n-iOff, n
2fc60 50 6f 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69  Pos));.    if( i
2fc70 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69  Off<n ){.      i
2fc80 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
2fc90 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
2fca0 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
2fcb0 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
2fcc0 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 44  Delta);.      iD
2fcd0 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  ocid += iDelta;.
2fce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2fcf0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2fd00 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2fd10 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69   id=%lld", iDoci
2fd20 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
2fd30 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a   return iOff;.}.
2fd40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2fd50 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
2fd60 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2fd70 29 20 64 65 62 75 67 67 69 6e 67 20 66 75 6e 63  ) debugging func
2fd80 74 69 6f 6e 2e 20 49 74 20 69 73 20 0a 2a 2a 20  tion. It is .** 
2fd90 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 77  only ever used w
2fda0 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20  ith detail=none 
2fdb0 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75  tables..**.** Bu
2fdc0 66 66 65 72 20 28 70 44 61 74 61 2f 6e 44 61 74  ffer (pData/nDat
2fdd0 61 29 20 63 6f 6e 74 61 69 6e 73 20 61 20 64 6f  a) contains a do
2fde0 63 6c 69 73 74 20 69 6e 20 74 68 65 20 66 6f 72  clist in the for
2fdf0 6d 61 74 20 75 73 65 64 20 62 79 20 64 65 74 61  mat used by deta
2fe00 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74 61 62 6c 65  il=none.** table
2fe10 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
2fe20 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e   appends a human
2fe30 2d 72 65 61 64 61 62 6c 65 20 76 65 72 73 69 6f  -readable versio
2fe40 6e 20 6f 66 20 74 68 61 74 20 6c 69 73 74 20 74  n of that list t
2fe50 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
2fe60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ..**.** If *pRc 
2fe70 69 73 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  is other than SQ
2fe80 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
2fe90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2fea0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 0a 2a 2a  lled, it is a.**
2feb0 20 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e 20 4f 4f   no-op. If an OO
2fec0 4d 20 6f 72 20 6f 74 68 65 72 20 65 72 72 6f 72  M or other error
2fed0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
2fee0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70  his function, *p
2fef0 52 63 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  Rc is.** set to 
2ff00 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
2ff10 63 6f 64 65 20 62 65 66 6f 72 65 20 72 65 74 75  code before retu
2ff20 72 6e 69 6e 67 2e 20 54 68 65 20 66 69 6e 61 6c  rning. The final
2ff30 20 73 74 61 74 65 20 6f 66 20 62 75 66 66 65 72   state of buffer
2ff40 0a 2a 2a 20 70 42 75 66 20 69 73 20 75 6e 64 65  .** pBuf is unde
2ff50 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
2ff60 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
2ff70 69 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  id fts5DecodeRow
2ff80 69 64 4c 69 73 74 28 0a 20 20 69 6e 74 20 2a 70  idList(.  int *p
2ff90 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
2ffa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2ffb0 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
2ffc0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2ffd0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
2ffe0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
2fff0 6f 20 61 70 70 65 6e 64 20 74 65 78 74 20 74 6f  o append text to
30000 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
30010 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
30020 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
30030 20 64 65 63 6f 64 65 20 6c 69 73 74 2d 6f 66 2d   decode list-of-
30040 72 6f 77 69 64 73 20 66 72 6f 6d 20 2a 2f 0a 29  rowids from */.)
30050 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
30060 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b   i64 iRowid = 0;
30070 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 44 61  ..  while( i<nDa
30080 74 61 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ta ){.    const 
30090 63 68 61 72 20 2a 7a 41 70 70 20 3d 20 22 22 3b  char *zApp = "";
300a0 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20  .    u64 iVal;. 
300b0 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46     i += sqlite3F
300c0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
300d0 61 74 61 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a  ata[i], &iVal);.
300e0 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 56      iRowid += iV
300f0 61 6c 3b 0a 0a 20 20 20 20 69 66 28 20 69 3c 6e  al;..    if( i<n
30100 44 61 74 61 20 26 26 20 70 44 61 74 61 5b 69 5d  Data && pData[i]
30110 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20 20 20 20  ==0x00 ){.      
30120 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  i++;.      if( i
30130 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74 61 5b  <nData && pData[
30140 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20 20  i]==0x00 ){.    
30150 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
30160 20 7a 41 70 70 20 3d 20 22 2b 22 3b 0a 20 20 20   zApp = "+";.   
30170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30180 20 20 7a 41 70 70 20 3d 20 22 2a 22 3b 0a 20 20    zApp = "*";.  
30190 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
301a0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
301b0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
301c0 52 63 2c 20 70 42 75 66 2c 20 22 20 25 6c 6c 64  Rc, pBuf, " %lld
301d0 25 73 22 2c 20 69 52 6f 77 69 64 2c 20 7a 41 70  %s", iRowid, zAp
301e0 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
301f0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
30200 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69  ion of user-defi
30210 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
30220 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28  ion fts5_decode(
30230 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
30240 64 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63  d fts5DecodeFunc
30250 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
30260 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
30270 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
30280 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74  ion call context
30290 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
302a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
302c0 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20  of args (always 
302d0 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  2) */.  sqlite3_
302e0 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
302f0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
30300 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
30310 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  .){.  i64 iRowid
30320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30330 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
30340 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20  or record being 
30350 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  decoded */.  int
30360 20 69 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c   iSegid,iHeight,
30370 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20  iPgno,bDlidx;/* 
30380 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73  Rowid components
30390 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
303a0 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20  aBlob; int n;   
303b0 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20        /* Record 
303c0 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75  to decode */.  u
303d0 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35  8 *a = 0;.  Fts5
303e0 42 75 66 66 65 72 20 73 3b 20 20 20 20 20 20 20  Buffer s;       
303f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
30400 75 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20  uild up text to 
30410 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20  return here */. 
30420 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30430 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
30440 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
30450 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
30460 36 34 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a 20  64 nSpace = 0;. 
30470 20 69 6e 74 20 65 44 65 74 61 69 6c 4e 6f 6e 65   int eDetailNone
30480 20 3d 20 28 73 71 6c 69 74 65 33 5f 75 73 65 72   = (sqlite3_user
30490 5f 64 61 74 61 28 70 43 74 78 29 21 3d 30 29 3b  _data(pCtx)!=0);
304a0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ..  assert( nArg
304b0 3d 3d 32 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==2 );.  UNUSED_
304c0 50 41 52 41 4d 28 6e 41 72 67 29 3b 0a 20 20 6d  PARAM(nArg);.  m
304d0 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
304e0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
304f0 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  ;.  iRowid = sql
30500 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
30510 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f  (apVal[0]);..  /
30520 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
30530 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
30540 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29 20 69 6e  ment (a blob) in
30550 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42   aBlob[]. The aB
30560 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20  lob[].  ** copy 
30570 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46  is followed by F
30580 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
30590 44 44 49 4e 47 20 30 78 30 30 20 62 79 74 65 73  DDING 0x00 bytes
305a0 2c 20 77 68 69 63 68 20 70 72 65 76 65 6e 74 73  , which prevents
305b0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 6f 76 65  .  ** buffer ove
305c0 72 72 65 61 64 73 20 65 76 65 6e 20 69 66 20 74  rreads even if t
305d0 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
305e0 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20  rupt.  */.  n = 
305f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
30600 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  tes(apVal[1]);. 
30610 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   aBlob = sqlite3
30620 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61  _value_blob(apVa
30630 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20  l[1]);.  nSpace 
30640 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  = n + FTS5_DATA_
30650 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20  ZERO_PADDING;.  
30660 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  a = (u8*)sqlite3
30670 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
30680 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  rc, nSpace);.  i
30690 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64  f( a==0 ) goto d
306a0 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 69 66 28  ecode_out;.  if(
306b0 20 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 61 2c   n>0 ) memcpy(a,
306c0 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 20 20 66   aBlob, n);..  f
306d0 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69  ts5DecodeRowid(i
306e0 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64 2c 20  Rowid, &iSegid, 
306f0 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68  &bDlidx, &iHeigh
30700 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 66  t, &iPgno);..  f
30710 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26 72  ts5DebugRowid(&r
30720 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b 0a  c, &s, iRowid);.
30730 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a    if( bDlidx ){.
30740 20 20 20 20 46 74 73 35 44 61 74 61 20 64 6c 69      Fts5Data dli
30750 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  dx;.    Fts5Dlid
30760 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20 64  xLvl lvl;..    d
30770 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20  lidx.p = a;.    
30780 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20  dlidx.nn = n;.. 
30790 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c 20     memset(&lvl, 
307a0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
307b0 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c 76  idxLvl));.    lv
307c0 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69 64 78  l.pData = &dlidx
307d0 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66 50  ;.    lvl.iLeafP
307e0 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20  gno = iPgno;..  
307f0 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 4c    for(fts5DlidxL
30800 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c 76  vlNext(&lvl); lv
30810 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44  l.bEof==0; fts5D
30820 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c  lidxLvlNext(&lvl
30830 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  )){.      sqlite
30840 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
30850 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
30860 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 25 64   .          " %d
30870 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c 65  (%lld)", lvl.iLe
30880 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77  afPgno, lvl.iRow
30890 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
308a0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53  }.  }else if( iS
308b0 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  egid==0 ){.    i
308c0 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f  f( iRowid==FTS5_
308d0 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
308e0 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f  {.      fts5Deco
308f0 64 65 41 76 65 72 61 67 65 73 28 26 72 63 2c 20  deAverages(&rc, 
30900 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d  &s, a, n);.    }
30910 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
30920 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
30930 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a  &rc, &s, a, n);.
30940 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
30950 28 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20 29 7b  ( eDetailNone ){
30960 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
30970 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
30980 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65     /* Current te
30990 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67  rm read from pag
309a0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  e */.    int szL
309b0 65 61 66 3b 0a 20 20 20 20 69 6e 74 20 69 50 67  eaf;.    int iPg
309c0 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20  idxOff = szLeaf 
309d0 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
309e0 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 54 65  2]);.    int iTe
309f0 72 6d 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e  rmOff;.    int n
30a00 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Keep = 0;.    in
30a10 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 6d 65 6d  t iOff;..    mem
30a20 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
30a30 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
30a40 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64  );..    /* Decod
30a50 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
30a60 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
30a70 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2e 20  the first term. 
30a80 2a 2f 0a 20 20 20 20 69 66 28 20 73 7a 4c 65 61  */.    if( szLea
30a90 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 50 67  f<n ){.      iPg
30aa0 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  idxOff += fts5Ge
30ab0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
30ac0 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66  idxOff], iTermOf
30ad0 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
30ae0 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
30af0 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20  szLeaf;.    }.  
30b00 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
30b10 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  dList(&rc, &s, &
30b20 61 5b 34 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 34  a[4], iTermOff-4
30b30 29 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20 69  );..    iOff = i
30b40 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 77 68 69  TermOff;.    whi
30b50 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20  le( iOff<szLeaf 
30b60 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 70  ){.      int nAp
30b70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pend;..      /* 
30b80 52 65 61 64 20 74 68 65 20 74 65 72 6d 20 64 61  Read the term da
30b90 74 61 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ta for the next 
30ba0 74 65 72 6d 2a 2f 0a 20 20 20 20 20 20 69 4f 66  term*/.      iOf
30bb0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
30bc0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
30bd0 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 20 20 74  Append);.      t
30be0 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20  erm.n = nKeep;. 
30bf0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
30c00 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26  ppendBlob(&rc, &
30c10 74 65 72 6d 2c 20 6e 41 70 70 65 6e 64 2c 20 26  term, nAppend, &
30c20 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  a[iOff]);.      
30c30 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
30c40 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20  rAppendPrintf(. 
30c50 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73           &rc, &s
30c60 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20  , " term=%.*s", 
30c70 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63  term.n, (const c
30c80 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20  har*)term.p.    
30c90 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20    );.      iOff 
30ca0 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20 20  += nAppend;..   
30cb0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
30cc0 20 77 68 65 72 65 20 74 68 65 20 64 6f 63 6c 69   where the docli
30cd0 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  st for this term
30ce0 20 65 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20 69   ends */.      i
30cf0 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29  f( iPgidxOff<n )
30d00 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 49  {.        int nI
30d10 6e 63 72 3b 0a 20 20 20 20 20 20 20 20 69 50 67  ncr;.        iPg
30d20 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  idxOff += fts5Ge
30d30 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
30d40 69 64 78 4f 66 66 5d 2c 20 6e 49 6e 63 72 29 3b  idxOff], nIncr);
30d50 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66  .        iTermOf
30d60 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20  f += nIncr;.    
30d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30d80 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65   iTermOff = szLe
30d90 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  af;.      }..   
30da0 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77     fts5DecodeRow
30db0 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  idList(&rc, &s, 
30dc0 26 61 5b 69 4f 66 66 5d 2c 20 69 54 65 72 6d 4f  &a[iOff], iTermO
30dd0 66 66 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20  ff-iOff);.      
30de0 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
30df0 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
30e00 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
30e10 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
30e20 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
30e30 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
30e40 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
30e50 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
30e60 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
30e70 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65     Fts5Buffer te
30e80 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
30e90 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d   /* Current term
30ea0 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67 65 20   read from page 
30eb0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 61  */.    int szLea
30ec0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
30ed0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
30ee0 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d 20 2a  f pgidx in a[] *
30ef0 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78  /.    int iPgidx
30f00 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69 50 67  Off;.    int iPg
30f10 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20 20 20  idxPrev = 0;    
30f20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
30f30 75 73 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  us value read fr
30f40 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20 20 20  om pgidx */.    
30f50 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30  int iTermOff = 0
30f60 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64  ;.    int iRowid
30f70 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Off = 0;.    int
30f80 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e   iOff;.    int n
30f90 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65  Doclist;..    me
30fa0 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
30fb0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
30fc0 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3c 34  ));..    if( n<4
30fd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30fe0 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
30ff0 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f 6e 73  rc, &s, 7, (cons
31000 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29  t u8*)"corrupt")
31010 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63  ;.      goto dec
31020 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 65 6c  ode_out;.    }el
31030 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64  se{.      iRowid
31040 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
31050 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69  (&a[0]);.      i
31060 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61  PgidxOff = szLea
31070 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
31080 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[2]);.      if(
31090 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
310a0 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
310b0 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
310c0 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29  xOff], iTermOff)
310d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
310e0 28 20 69 50 67 69 64 78 4f 66 66 3e 6e 20 29 7b  ( iPgidxOff>n ){
310f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54  .        rc = FT
31100 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
31110 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f      goto decode_
31120 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
31130 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
31140 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  e the position l
31150 69 73 74 20 74 61 69 6c 20 61 74 20 74 68 65 20  ist tail at the 
31160 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67  start of the pag
31170 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f  e */.    if( iRo
31180 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20  widOff!=0 ){.   
31190 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64     iOff = iRowid
311a0 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Off;.    }else i
311b0 66 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20 29  f( iTermOff!=0 )
311c0 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  {.      iOff = i
311d0 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c  TermOff;.    }el
311e0 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  se{.      iOff =
311f0 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20   szLeaf;.    }. 
31200 20 20 20 69 66 28 20 69 4f 66 66 3e 6e 20 29 7b     if( iOff>n ){
31210 0a 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35  .      rc = FTS5
31220 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
31230 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b  goto decode_out;
31240 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
31250 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63  ecodePoslist(&rc
31260 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66  , &s, &a[4], iOf
31270 66 2d 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  f-4);..    /* De
31280 63 6f 64 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f  code any more do
31290 63 6c 69 73 74 20 64 61 74 61 20 74 68 61 74 20  clist data that 
312a0 61 70 70 65 61 72 73 20 6f 6e 20 74 68 65 20 70  appears on the p
312b0 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  age before the. 
312c0 20 20 20 2a 2a 20 66 69 72 73 74 20 74 65 72 6d     ** first term
312d0 2e 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73  . */.    nDoclis
312e0 74 20 3d 20 28 69 54 65 72 6d 4f 66 66 20 3f 20  t = (iTermOff ? 
312f0 69 54 65 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61  iTermOff : szLea
31300 66 29 20 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66  f) - iOff;.    f
31310 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
31320 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
31330 66 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a  f], nDoclist);..
31340 20 20 20 20 77 68 69 6c 65 28 20 69 50 67 69 64      while( iPgid
31350 78 4f 66 66 3c 6e 20 26 26 20 72 63 3d 3d 53 51  xOff<n && rc==SQ
31360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31370 20 69 6e 74 20 62 46 69 72 73 74 20 3d 20 28 69   int bFirst = (i
31380 50 67 69 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66  PgidxOff==szLeaf
31390 29 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66  );     /* True f
313a0 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  or first term on
313b0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
313c0 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
313d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313e0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
313f0 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69   data */.      i
31400 6e 74 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a  nt iEnd;.      .
31410 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
31420 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
31430 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
31440 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
31450 69 50 67 69 64 78 50 72 65 76 20 2b 3d 20 6e 42  iPgidxPrev += nB
31460 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  yte;.      iOff 
31470 3d 20 69 50 67 69 64 78 50 72 65 76 3b 0a 0a 20  = iPgidxPrev;.. 
31480 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f       if( iPgidxO
31490 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
314a0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
314b0 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e  &a[iPgidxOff], n
314c0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
314d0 45 6e 64 20 3d 20 69 50 67 69 64 78 50 72 65 76  End = iPgidxPrev
314e0 20 2b 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   + nByte;.      
314f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
31500 45 6e 64 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  End = szLeaf;.  
31510 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31520 69 45 6e 64 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  iEnd>szLeaf ){. 
31530 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35         rc = FTS5
31540 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
31550 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
31560 0a 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 72  ..      if( bFir
31570 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
31580 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
31590 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
315a0 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
315b0 20 20 20 69 66 28 20 6e 42 79 74 65 3e 74 65 72     if( nByte>ter
315c0 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  m.n ){.         
315d0 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
315e0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  PT;.          br
315f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
31600 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20         term.n = 
31610 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nByte;.      }. 
31620 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
31630 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
31640 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
31650 20 20 20 20 20 69 66 28 20 69 4f 66 66 2b 6e 42       if( iOff+nB
31660 79 74 65 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20  yte>n ){.       
31670 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
31680 50 54 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  PT;.        brea
31690 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
316a0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
316b0 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d  dBlob(&rc, &term
316c0 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66  , nByte, &a[iOff
316d0 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ]);.      iOff +
316e0 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20  = nByte;..      
316f0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
31700 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20  rAppendPrintf(. 
31710 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73           &rc, &s
31720 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20  , " term=%.*s", 
31730 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63  term.n, (const c
31740 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20  har*)term.p.    
31750 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20    );.      iOff 
31760 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  += fts5DecodeDoc
31770 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
31780 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66  [iOff], iEnd-iOf
31790 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  f);.    }..    f
317a0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
317b0 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65  erm);.  }.  . de
317c0 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  code_out:.  sqli
317d0 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69  te3_free(a);.  i
317e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
317f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
31800 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
31810 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
31820 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f  .p, s.n, SQLITE_
31830 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
31840 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
31850 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
31860 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
31870 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
31880 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(&s);.}../*.**
31890 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
318a0 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69  ion of user-defi
318b0 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
318c0 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29  ion fts5_rowid()
318d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
318e0 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
318f0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
31900 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
31910 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
31920 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
31930 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
31940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31950 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31960 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
31970 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
31980 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
31990 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
319a0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
319b0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
319c0 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67  zArg;.  if( nArg
319d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
319e0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
319f0 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65  pCtx, "should be
31a00 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62  : fts5_rowid(sub
31a10 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31  ject, ....)", -1
31a20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
31a30 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  zArg = (const ch
31a40 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
31a50 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
31a60 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
31a70 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
31a80 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b  g, "segment") ){
31a90 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
31aa0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65 67  d;.      int seg
31ab0 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  id, pgno;.      
31ac0 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20  if( nArg!=3 ){. 
31ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
31ae0 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
31af0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
31b00 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f  should be: fts5_
31b10 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27 2c  rowid('segment',
31b20 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c   segid, pgno))",
31b30 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   -1.        );. 
31b40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31b50 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69      segid = sqli
31b60 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
31b70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Val[1]);.       
31b80 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f   pgno = sqlite3_
31b90 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
31ba0 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f  2]);.        iRo
31bb0 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
31bc0 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20  NT_ROWID(segid, 
31bd0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  pgno);.        s
31be0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
31bf0 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69 64  t64(pCtx, iRowid
31c00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
31c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
31c20 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
31c30 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20  (pCtx, .        
31c40 22 66 69 72 73 74 20 61 72 67 20 74 6f 20 66 74  "first arg to ft
31c50 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74 20  s5_rowid() must 
31c60 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20 2c 20  be 'segment'" , 
31c70 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  -1.      );.    
31c80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
31c90 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73  his is called as
31ca0 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74 65   part of registe
31cb0 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f  ring the FTS5 mo
31cc0 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61  dule with databa
31cd0 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
31ce0 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65 72   db. It register
31cf0 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64  s several user-d
31d00 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
31d10 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a  nctions useful.*
31d20 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a  * with FTS5..**.
31d30 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
31d40 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
31d50 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
31d60 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d  rror occurs, som
31d70 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74  e other.** SQLit
31d80 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
31d90 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
31da0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31db0 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71  Fts5IndexInit(sq
31dc0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
31dd0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  t rc = sqlite3_c
31de0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
31df0 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
31e00 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49  decode", 2, SQLI
31e10 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
31e20 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20  DecodeFunction, 
31e30 30 2c 20 30 0a 20 20 29 3b 0a 0a 20 20 69 66 28  0, 0.  );..  if(
31e40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31e50 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
31e60 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
31e70 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20  on(.        db, 
31e80 22 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e 6f 6e  "fts5_decode_non
31e90 65 22 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20  e", 2, .        
31ea0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
31eb0 69 64 2a 29 64 62 2c 20 66 74 73 35 44 65 63 6f  id*)db, fts5Deco
31ec0 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  deFunction, 0, 0
31ed0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
31ee0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31ef0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
31f00 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
31f10 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62  tion(.        db
31f20 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20  , "fts5_rowid", 
31f30 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
31f40 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e   0, fts5RowidFun
31f50 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20  ction, 0, 0.    
31f60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
31f70 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69  rc;.}...int sqli
31f80 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 73 65  te3Fts5IndexRese
31f90 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
31fa0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
31fb0 74 72 75 63 74 3d 3d 30 20 7c 7c 20 70 2d 3e 69  truct==0 || p->i
31fc0 53 74 72 75 63 74 56 65 72 73 69 6f 6e 21 3d 30  StructVersion!=0
31fd0 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 49 6e   );.  if( fts5In
31fe0 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e 28 70  dexDataVersion(p
31ff0 29 21 3d 70 2d 3e 69 53 74 72 75 63 74 56 65 72  )!=p->iStructVer
32000 73 69 6f 6e 20 29 7b 0a 20 20 20 20 66 74 73 35  sion ){.    fts5
32010 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
32020 61 74 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ate(p);.  }.  re
32030 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
32040 74 75 72 6e 28 70 29 3b 0a 7d 0a                 turn(p);.}.