/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact ec0ca720bf3d564adc659791c6a9e7b98b019b4083882b4ea9173e1870035645:


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 6e 6e 20 7c 7c 20 6e 4b 65 65 70 3e 70 49 74  >nn || nKeep>pIt
cfa0: 65 72 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20  er->term.n ){.  
cfb0: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
cfc0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75  ORRUPT;.    retu
cfd0: 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d  rn;.  }.  pIter-
cfe0: 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b  >term.n = nKeep;
cff0: 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
d000: 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
d010: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e  &pIter->term, nN
d020: 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  ew, &a[iOff]);. 
d030: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
d040: 74 65 72 6d 2e 6e 3c 3d 70 49 74 65 72 2d 3e 74  term.n<=pIter->t
d050: 65 72 6d 2e 6e 53 70 61 63 65 20 29 3b 0a 20 20  erm.nSpace );.  
d060: 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20  iOff += nNew;.  
d070: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
d080: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
d090: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
d0a0: 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
d0b0: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70 49 74 65  LeafPgno;.  pIte
d0c0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d0d0: 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70 49   iOff;..  if( pI
d0e0: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 3e 3d  ter->iPgidxOff>=
d0f0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
d100: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
d110: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
d120: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
d130: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
d140: 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20  int nExtra;.    
d150: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
d160: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
d170: 74 33 32 28 26 61 5b 70 49 74 65 72 2d 3e 69 50  t32(&a[pIter->iP
d180: 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78 74 72 61  gidxOff], nExtra
d190: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45  );.    pIter->iE
d1a0: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b 3d 20 6e  ndofDoclist += n
d1b0: 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20 20 66 74  Extra;.  }..  ft
d1c0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77  s5SegIterLoadRow
d1d0: 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  id(p, pIter);.}.
d1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d1f0: 35 53 65 67 49 74 65 72 4e 65 78 74 28 46 74 73  5SegIterNext(Fts
d200: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
d210: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74  Iter*, int*);.st
d220: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d230: 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73  gIterNext_Revers
d240: 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74  e(Fts5Index*, Ft
d250: 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a  s5SegIter*, int*
d260: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  );.static void f
d270: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e  ts5SegIterNext_N
d280: 6f 6e 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  one(Fts5Index*, 
d290: 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e  Fts5SegIter*, in
d2a0: 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69  t*);..static voi
d2b0: 64 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74  d fts5SegIterSet
d2c0: 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a  Next(Fts5Index *
d2d0: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
d2e0: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
d2f0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
d300: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
d310: 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  E ){.    pIter->
d320: 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67 49  xNext = fts5SegI
d330: 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65 3b  terNext_Reverse;
d340: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
d350: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
d360: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
d370: 4e 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  NE ){.    pIter-
d380: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67  >xNext = fts5Seg
d390: 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a 20  IterNext_None;. 
d3a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
d3b0: 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53  r->xNext = fts5S
d3c0: 65 67 49 74 65 72 4e 65 78 74 3b 0a 20 20 7d 0a  egIterNext;.  }.
d3d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
d3e0: 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ize the iterator
d3f0: 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
d400: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
d410: 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a   the entries in.
d420: 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e  ** segment pSeg.
d430: 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   The iterator is
d440: 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
d450: 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
d460: 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  y when .** this 
d470: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
d480: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
d490: 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
d4a0: 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
d4b0: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
d4c0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
d4d0: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
d4e0: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
d4f0: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
d500: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
d510: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
d520: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
d530: 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a  ts5SegIterInit(.
d540: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f    /* FTS index o
d570: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
d580: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
d590: 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65  *pSeg,     /* De
d5a0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67  scription of seg
d5b0: 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ment */.  Fts5Se
d5c0: 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
d5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
d5e0: 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
d5f0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67  */.){.  if( pSeg
d600: 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29  ->pgnoFirst==0 )
d610: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
d620: 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65 67  ppens if the seg
d630: 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73  ment is being us
d640: 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74  ed as an input t
d650: 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  o an incremental
d660: 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e  .    ** merge an
d670: 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61  d all data has a
d680: 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72 69  lready been "tri
d690: 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74  mmed". See funct
d6a0: 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54  ion.    ** fts5T
d6b0: 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f  rimSegments() fo
d6c0: 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68  r details. In th
d6d0: 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74 68  is case leave th
d6e0: 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79  e iterator empty
d6f0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
d700: 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65  ler will see the
d710: 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d   (pIter->pLeaf==
d720: 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  0) and assume th
d730: 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20  e iterator is.  
d740: 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65    ** at EOF alre
d750: 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ady. */.    asse
d760: 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  rt( pIter->pLeaf
d770: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
d780: 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  n;.  }..  if( p-
d790: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
d7a0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  {.    memset(pIt
d7b0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
d7c0: 49 74 65 72 29 29 3b 0a 20 20 20 20 66 74 73 35  Iter));.    fts5
d7d0: 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 70  SegIterSetNext(p
d7e0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49  , pIter);.    pI
d7f0: 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ter->pSeg = pSeg
d800: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
d810: 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70  afPgno = pSeg->p
d820: 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20  gnoFirst-1;.    
d830: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
d840: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
d850: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
d860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d870: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d880: 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61 73  fset = 4;.    as
d890: 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e  sert_nc( pIter->
d8a0: 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20  pLeaf->nn>4 );. 
d8b0: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 66 74     assert_nc( ft
d8c0: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
d8d0: 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
d8e0: 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49 74 65 72  ==4 );.    pIter
d8f0: 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 49  ->iPgidxOff = pI
d900: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
d910: 61 66 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65  af+1;.    fts5Se
d920: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c  gIterLoadTerm(p,
d930: 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20   pIter, 0);.    
d940: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
d950: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
d960: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
d970: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
d980: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e  y ever called on
d990: 20 69 74 65 72 61 74 6f 72 73 20 63 72 65 61 74   iterators creat
d9a0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a  ed by calls to.*
d9b0: 2a 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  * Fts5IndexQuery
d9c0: 28 29 20 77 69 74 68 20 74 68 65 20 46 54 53 35  () with the FTS5
d9d0: 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
d9e0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
d9f0: 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   The iterator is
da00: 20 69 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73   in an unusual s
da10: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
da20: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
da30: 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65  d: the.** Fts5Se
da40: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
da50: 74 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  t variable is se
da60: 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
da70: 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  of the start of.
da80: 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  ** the position-
da90: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
daa0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
dab0: 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20  levant rowid on 
dac0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73  the page..** Fts
dad0: 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69  5SegIter.rowid i
dae0: 73 20 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20  s set, but nPos 
daf0: 61 6e 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74  and bDel are not
db00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
db10: 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74  ction advances t
db20: 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
db30: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
db40: 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65   the last .** re
db50: 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20  levant rowid on 
db60: 74 68 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66  the page and, if
db70: 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74   necessary, init
db80: 69 61 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20  ializes the .** 
db90: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
dba0: 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20  nd iRowidOffset 
dbb0: 76 61 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68  variables. At th
dbc0: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65  is point the ite
dbd0: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69  rator.** is in i
dbe0: 74 73 20 72 65 67 75 6c 61 72 20 73 74 61 74 65  ts regular state
dbf0: 20 2d 20 46 74 73 35 53 65 67 49 74 65 72 2e 69   - Fts5SegIter.i
dc00: 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74  LeafOffset point
dc10: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  s to the first.*
dc20: 2a 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f  * byte of the po
dc30: 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
dc40: 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
dc50: 69 74 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a  ith said rowid..
dc60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
dc70: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
dc80: 65 49 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e  eInitPage(Fts5In
dc90: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
dca0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
dcb0: 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e  nt eDetail = p->
dcc0: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
dcd0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65  ;.  int n = pIte
dce0: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
dcf0: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 74 65  ;.  int i = pIte
dd00: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
dd10: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
dd20: 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74  >pLeaf->p;.  int
dd30: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20   iRowidOffset = 
dd40: 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 70 49 74 65  0;..  if( n>pIte
dd50: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
dd60: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 49 74 65   ){.    n = pIte
dd70: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
dd80: 3b 0a 20 20 7d 0a 0a 20 20 41 53 53 45 52 54 5f  ;.  }..  ASSERT_
dd90: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
dda0: 3e 70 4c 65 61 66 29 3b 0a 20 20 77 68 69 6c 65  >pLeaf);.  while
ddb0: 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ( 1 ){.    i64 i
ddc0: 44 65 6c 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20  Delta = 0;..    
ddd0: 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53  if( eDetail==FTS
dde0: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
ddf0: 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a  .      /* todo *
de00: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20  /.      if( i<n 
de10: 26 26 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  && a[i]==0 ){.  
de20: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
de30: 20 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b     if( i<n && a[
de40: 69 5d 3d 3d 30 20 29 20 69 2b 2b 3b 0a 20 20 20  i]==0 ) i++;.   
de50: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
de60: 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
de70: 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
de80: 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73  ;.      i += fts
de90: 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
dea0: 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  &a[i], &nPos, &b
deb0: 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 20  Dummy);.      i 
dec0: 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20  += nPos;.    }. 
ded0: 20 20 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72     if( i>=n ) br
dee0: 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74  eak;.    i += ft
def0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
df00: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
df10: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
df20: 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
df30: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 63 65 73  .    /* If neces
df40: 73 61 72 79 2c 20 67 72 6f 77 20 74 68 65 20 70  sary, grow the p
df50: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
df60: 65 74 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20  et[] array. */. 
df70: 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
df80: 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77  set>=pIter->nRow
df90: 69 64 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  idOffset ){.    
dfa0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74    int nNew = pIt
dfb0: 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74  er->nRowidOffset
dfc0: 20 2b 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20   + 8;.      int 
dfd0: 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71  *aNew = (int*)sq
dfe0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
dff0: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
e000: 73 65 74 2c 6e 4e 65 77 2a 73 69 7a 65 6f 66 28  set,nNew*sizeof(
e010: 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28  int));.      if(
e020: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
e030: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
e040: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
e050: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e060: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61 52  .      pIter->aR
e070: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 61 4e 65  owidOffset = aNe
e080: 77 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  w;.      pIter->
e090: 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 6e  nRowidOffset = n
e0a0: 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  New;.    }..    
e0b0: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
e0c0: 73 65 74 5b 69 52 6f 77 69 64 4f 66 66 73 65 74  set[iRowidOffset
e0d0: 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  ++] = pIter->iLe
e0e0: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 49  afOffset;.    pI
e0f0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
e100: 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65   = i;.  }.  pIte
e110: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 20  r->iRowidOffset 
e120: 3d 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a  = iRowidOffset;.
e130: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
e140: 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
e150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61  .}../*.**.*/.sta
e160: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
e170: 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61  IterReverseNewPa
e180: 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ge(Fts5Index *p,
e190: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
e1a0: 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
e1b0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
e1c0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
e1d0: 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RSE );.  assert(
e1e0: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
e1f0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
e200: 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44  TERM );..  fts5D
e210: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
e220: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65  ->pLeaf);.  pIte
e230: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
e240: 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
e250: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72  LITE_OK && pIter
e260: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ->iLeafPgno>pIte
e270: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
e280: 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
e290: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 49 74 65   *pNew;.    pIte
e2a0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a  r->iLeafPgno--;.
e2b0: 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 44      pNew = fts5D
e2c0: 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
e2d0: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20  SEGMENT_ROWID(. 
e2e0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e2f0: 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 49  pSeg->iSegid, pI
e300: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20  ter->iLeafPgno. 
e310: 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70     ));.    if( p
e320: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
e330: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
e340: 6d 61 79 20 62 65 20 65 71 75 61 6c 20 74 6f 20  may be equal to 
e350: 73 7a 4c 65 61 66 20 69 66 20 74 68 65 20 74 65  szLeaf if the te
e360: 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74 0a 20  rm is the last. 
e370: 20 20 20 20 20 2a 2a 20 74 68 69 6e 67 20 6f 6e       ** thing on
e380: 20 74 68 65 20 70 61 67 65 20 2d 20 69 2e 65 2e   the page - i.e.
e390: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
e3a0: 20 69 73 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f   is on the follo
e3b0: 77 69 6e 67 20 70 61 67 65 2e 0a 20 20 20 20 20  wing page..     
e3c0: 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
e3d0: 20 6c 65 61 76 65 20 70 49 74 65 72 2d 3e 70 4c   leave pIter->pL
e3e0: 65 61 66 3d 3d 30 2c 20 74 68 69 73 20 69 74 65  eaf==0, this ite
e3f0: 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46 2e  rator is at EOF.
e400: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
e410: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d  ter->iLeafPgno==
e420: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
e430: 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
e440: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
e450: 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Leaf==0 );.     
e460: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
e470: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e  ermLeafOffset<pN
e480: 65 77 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  ew->szLeaf ){.  
e490: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
e4a0: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
e4b0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
e4c0: 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65  eafOffset = pIte
e4d0: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
e4e0: 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  et;.        }.  
e4f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e500: 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
e510: 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64  ;.        iRowid
e520: 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69  Off = fts5LeafFi
e530: 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77  rstRowidOff(pNew
e540: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
e550: 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20  RowidOff ){.    
e560: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
e570: 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  af = pNew;.     
e580: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e590: 66 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64  fOffset = iRowid
e5a0: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Off;.        }. 
e5b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
e5c0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
e5d0: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20  {.        u8 *a 
e5e0: 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  = &pIter->pLeaf-
e5f0: 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  >p[pIter->iLeafO
e600: 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  ffset];.        
e610: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e620: 65 74 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  et += fts5GetVar
e630: 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 70 49  int(a, (u64*)&pI
e640: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
e650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e670: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
e680: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  e(pNew);.      }
e690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
e6a0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
e6b0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  {.    pIter->iEn
e6c0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74  dofDoclist = pIt
e6d0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  er->pLeaf->nn+1;
e6e0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
e6f0: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
e700: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
e710: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e720: 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61  rue if the itera
e730: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
e740: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
e750: 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
e760: 6f 69 6e 74 73 20 74 6f 20 61 20 64 65 6c 65 74  oints to a delet
e770: 65 20 6d 61 72 6b 65 72 2e 20 41 20 64 65 6c 65  e marker. A dele
e780: 74 65 20 6d 61 72 6b 65 72 20 69 73 20 61 6e 20  te marker is an 
e790: 65 6e 74 72 79 20 77 69 74 68 20 61 20 30 20 62  entry with a 0 b
e7a0: 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d  yte.** position-
e7b0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
e7c0: 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
e7d0: 72 49 73 45 6d 70 74 79 28 46 74 73 35 49 6e 64  rIsEmpty(Fts5Ind
e7e0: 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20  ex *p, Fts5Iter 
e7f0: 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53  *pIter){.  Fts5S
e800: 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
e810: 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65  pIter->aSeg[pIte
e820: 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
e830: 72 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28  rst];.  return (
e840: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
e850: 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20   && pSeg->pLeaf 
e860: 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30  && pSeg->nPos==0
e870: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
e880: 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74  nce iterator pIt
e890: 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  er to the next e
e8a0: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
e8b0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 74 73 35   version of fts5
e8c0: 53 65 67 49 74 65 72 4e 65 78 74 28 29 20 69 73  SegIterNext() is
e8d0: 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 72 65   only used by re
e8e0: 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73 2e  verse iterators.
e8f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e900: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
e910: 52 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49  Reverse(.  Fts5I
e920: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
e930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
e940: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
e950: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
e960: 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
e970: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
e980: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
e990: 0a 20 20 69 6e 74 20 2a 70 62 55 6e 75 73 65 64  .  int *pbUnused
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a     /* Unused */.
e9c0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
e9d0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
e9e0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
e9f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
ea00: 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d  ter->pNextLeaf==
ea10: 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
ea20: 52 41 4d 28 70 62 55 6e 75 73 65 64 29 3b 0a 0a  RAM(pbUnused);..
ea30: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f    if( pIter->iRo
ea40: 77 69 64 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  widOffset>0 ){. 
ea50: 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72     u8 *a = pIter
ea60: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
ea70: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 36  int iOff;.    i6
ea80: 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70  4 iDelta;..    p
ea90: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
eaa0: 65 74 2d 2d 3b 0a 20 20 20 20 70 49 74 65 72 2d  et--;.    pIter-
eab0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  >iLeafOffset = p
eac0: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
ead0: 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  et[pIter->iRowid
eae0: 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 66 74 73  Offset];.    fts
eaf0: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
eb00: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
eb10: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
eb20: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 69  eafOffset;.    i
eb30: 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  f( p->pConfig->e
eb40: 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54  Detail!=FTS5_DET
eb50: 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
eb60: 20 20 69 4f 66 66 20 2b 3d 20 70 49 74 65 72 2d    iOff += pIter-
eb70: 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20  >nPos;.    }.   
eb80: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
eb90: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
eba0: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74  iDelta);.    pIt
ebb0: 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44  er->iRowid -= iD
ebc0: 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  elta;.  }else{. 
ebd0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
ebe0: 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20  verseNewPage(p, 
ebf0: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
ec00: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65  *.** Advance ite
ec10: 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74  rator pIter to t
ec20: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a  he next entry..*
ec30: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
ec40: 6e 20 6f 66 20 66 74 73 35 53 65 67 49 74 65 72  n of fts5SegIter
ec50: 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c 79 20 75  Next() is only u
ec60: 73 65 64 20 69 66 20 64 65 74 61 69 6c 3d 6e 6f  sed if detail=no
ec70: 6e 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 69 74  ne and the.** it
ec80: 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20 61 20  erator is not a 
ec90: 72 65 76 65 72 73 65 20 64 69 72 65 63 74 69 6f  reverse directio
eca0: 6e 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  n iterator..*/.s
ecb0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
ecc0: 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28  egIterNext_None(
ecd0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecf0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
ed00: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
ed10: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
ed20: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
ed30: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
ed40: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  vance */.  int *
ed50: 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
ed60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
ed70: 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74  T: Set for new t
ed80: 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  erm */.){.  int 
ed90: 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28  iOff;..  assert(
eda0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
edb0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  K );.  assert( (
edc0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
edd0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
ede0: 52 53 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  RSE)==0 );.  ass
edf0: 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ert( p->pConfig-
ee00: 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
ee10: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20  ETAIL_NONE );.. 
ee20: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
ee30: 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  K(pIter->pLeaf);
ee40: 0a 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  .  iOff = pIter-
ee50: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20  >iLeafOffset;.. 
ee60: 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69   /* Next entry i
ee70: 73 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 70 61  s on the next pa
ee80: 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65  ge */.  if( pIte
ee90: 72 2d 3e 70 53 65 67 20 26 26 20 69 4f 66 66 3e  r->pSeg && iOff>
eea0: 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73  =pIter->pLeaf->s
eeb0: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73  zLeaf ){.    fts
eec0: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
eed0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
eee0: 69 66 28 20 70 2d 3e 72 63 20 7c 7c 20 70 49 74  if( p->rc || pIt
eef0: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72  er->pLeaf==0 ) r
ef00: 65 74 75 72 6e 3b 0a 20 20 20 20 70 49 74 65 72  eturn;.    pIter
ef10: 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  ->iRowid = 0;.  
ef20: 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 7d 0a    iOff = 4;.  }.
ef30: 0a 20 20 69 66 28 20 69 4f 66 66 3c 70 49 74 65  .  if( iOff<pIte
ef40: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
ef50: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20   ){.    /* Next 
ef60: 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20  entry is on the 
ef70: 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a  current page */.
ef80: 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
ef90: 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69      iOff += sqli
efa0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
efb0: 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  (&pIter->pLeaf->
efc0: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
efd0: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74  iDelta);.    pIt
efe0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
eff0: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 70 49 74 65  = iOff;.    pIte
f000: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
f010: 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  lta;.  }else if(
f020: 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
f030: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
f040: 45 54 45 52 4d 29 3d 3d 30 20 29 7b 0a 20 20 20  ETERM)==0 ){.   
f050: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67   if( pIter->pSeg
f060: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b   ){.      int nK
f070: 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  eep = 0;.      i
f080: 66 28 20 69 4f 66 66 21 3d 66 74 73 35 4c 65 61  f( iOff!=fts5Lea
f090: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49  fFirstTermOff(pI
f0a0: 74 65 72 2d 3e 70 4c 65 61 66 29 20 29 7b 0a 20  ter->pLeaf) ){. 
f0b0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
f0c0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
f0d0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
f0e0: 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20  iOff], nKeep);. 
f0f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
f100: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
f110: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 66 74  = iOff;.      ft
f120: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
f130: 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65  m(p, pIter, nKee
f140: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
f150: 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
f160: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
f170: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
f180: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  m = 0;.      int
f190: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71   nList;.      sq
f1a0: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
f1b0: 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b  nNext(p->pHash);
f1c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
f1d0: 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
f1e0: 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d  p->pHash, &zTerm
f1f0: 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
f200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
f210: 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 65 78  st==0 ) goto nex
f220: 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20 20 20 20  t_none_eof;.    
f230: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
f240: 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
f250: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f260: 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a  af->nn = nList;.
f270: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f280: 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
f290: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
f2a0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
f2b0: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71   nList;.      sq
f2c0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
f2d0: 65 74 28 26 70 2d 3e 72 63 2c 26 70 49 74 65 72  et(&p->rc,&pIter
f2e0: 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74 72  ->term, (int)str
f2f0: 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a  len(zTerm), (u8*
f300: 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70  )zTerm);.      p
f310: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f320: 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  t = fts5GetVarin
f330: 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29 26  t(pList, (u64*)&
f340: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
f350: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
f360: 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65  bNewTerm ) *pbNe
f370: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  wTerm = 1;.  }el
f380: 73 65 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 65 78  se{.    goto nex
f390: 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20 20 7d 0a  t_none_eof;.  }.
f3a0: 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
f3b0: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
f3c0: 3b 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20 6e 65  ;..  return;. ne
f3d0: 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a 20 20 66  xt_none_eof:.  f
f3e0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
f3f0: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
f400: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
f410: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  ;.}.../*.** Adva
f420: 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74  nce iterator pIt
f430: 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  er to the next e
f440: 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ntry. .**.** If 
f450: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
f460: 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73   Fts5Index.rc is
f470: 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f   set to an appro
f480: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
f490: 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74  e. It .** is not
f4a0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
f4b0: 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72  rror if the iter
f4c0: 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
f4d0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
f4e0: 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
f4f0: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
f500: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
f510: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
f520: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
f530: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
f540: 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  xt(.  Fts5Index 
f550: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
f560: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
f570: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
f580: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
f590: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
f5a0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
f5b0: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
f5c0: 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f5e0: 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65   OUT: Set for ne
f5f0: 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 46  w term */.){.  F
f600: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
f610: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
f620: 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 69 6e 74   int iOff;.  int
f630: 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20   bNewTerm = 0;. 
f640: 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a   int nKeep = 0;.
f650: 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e    u8 *a;.  int n
f660: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 62 4e  ;..  assert( pbN
f670: 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62  ewTerm==0 || *pb
f680: 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20  NewTerm==0 );.  
f690: 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
f6a0: 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53  ig->eDetail!=FTS
f6b0: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
f6c0: 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
f6d0: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
f6e0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77   position list w
f6f0: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
f700: 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 61 20 3d  t page. */.  a =
f710: 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 6e 20 3d   pLeaf->p;.  n =
f720: 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a   pLeaf->szLeaf;.
f730: 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46  .  ASSERT_SZLEAF
f740: 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 69 4f  _OK(pLeaf);.  iO
f750: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
f760: 66 4f 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d  fOffset + pIter-
f770: 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66 28 20 69 4f  >nPos;..  if( iO
f780: 66 66 3c 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ff<n ){.    /* T
f790: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73  he next entry is
f7a0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
f7b0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
f7c0: 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 3d 70 49  ert_nc( iOff<=pI
f7d0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
f7e0: 73 74 20 29 3b 0a 20 20 20 20 69 66 28 20 69 4f  st );.    if( iO
f7f0: 66 66 3e 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f  ff>=pIter->iEndo
f800: 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  fDoclist ){.    
f810: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
f820: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d        if( iOff!=
f830: 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72  fts5LeafFirstTer
f840: 6d 4f 66 66 28 70 4c 65 61 66 29 20 29 7b 0a 20  mOff(pLeaf) ){. 
f850: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
f860: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
f870: 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b  a[iOff], nKeep);
f880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f890: 73 65 7b 0a 20 20 20 20 20 20 75 36 34 20 69 44  se{.      u64 iD
f8a0: 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66  elta;.      iOff
f8b0: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
f8c0: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
f8d0: 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  ], &iDelta);.   
f8e0: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
f8f0: 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
f900: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 44 65    assert_nc( iDe
f910: 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  lta>0 );.    }. 
f920: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
f930: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20  ffset = iOff;.. 
f940: 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 72   }else if( pIter
f950: 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pSeg==0 ){.   
f960: 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74   const u8 *pList
f970: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
f980: 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b  char *zTerm = 0;
f990: 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d  .    int nList =
f9a0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
f9b0: 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
f9c0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
f9d0: 54 45 52 4d 29 20 7c 7c 20 70 62 4e 65 77 54 65  TERM) || pbNewTe
f9e0: 72 6d 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  rm );.    if( 0=
f9f0: 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  =(pIter->flags &
fa00: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
fa10: 45 54 45 52 4d 29 20 29 7b 0a 20 20 20 20 20 20  ETERM) ){.      
fa20: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
fa30: 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68  canNext(p->pHash
fa40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fa50: 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72  Fts5HashScanEntr
fa60: 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65  y(p->pHash, &zTe
fa70: 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  rm, &pList, &nLi
fa80: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
fa90: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
faa0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
fab0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
fac0: 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  f);.      pIter-
fad0: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
fae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
faf0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28  er->pLeaf->p = (
fb00: 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20  u8*)pList;.     
fb10: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
fb20: 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  n = nList;.     
fb30: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
fb40: 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20  zLeaf = nList;. 
fb50: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
fb60: 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73  ofDoclist = nLis
fb70: 74 2b 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t+1;.      sqlit
fb80: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
fb90: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
fba0: 74 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65  term, (int)strle
fbb0: 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20 20 20 20  n(zTerm),.      
fbc0: 20 20 20 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b      (u8*)zTerm);
fbd0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
fbe0: 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
fbf0: 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74 2c  GetVarint(pList,
fc00: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
fc10: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 2a 70  Rowid);.      *p
fc20: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
fc30: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
fc40: 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 2f   iOff = 0;.    /
fc50: 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20  * Next entry is 
fc60: 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  not on the curre
fc70: 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 77  nt page */.    w
fc80: 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b  hile( iOff==0 ){
fc90: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
fca0: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
fcb0: 74 65 72 29 3b 0a 20 20 20 20 20 20 70 4c 65 61  ter);.      pLea
fcc0: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
fcd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 61  ;.      if( pLea
fce0: 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  f==0 ) break;.  
fcf0: 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41      ASSERT_SZLEA
fd00: 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20  F_OK(pLeaf);.   
fd10: 20 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66     if( (iOff = f
fd20: 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
fd30: 64 4f 66 66 28 70 4c 65 61 66 29 29 20 26 26 20  dOff(pLeaf)) && 
fd40: 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65  iOff<pLeaf->szLe
fd50: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  af ){.        iO
fd60: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
fd70: 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61  5GetVarint(&pLea
fd80: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
fd90: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
fda0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
fdb0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
fdc0: 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69  iOff;..        i
fdd0: 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65  f( pLeaf->nn>pLe
fde0: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
fdf0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
fe00: 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66  PgidxOff = pLeaf
fe10: 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47  ->szLeaf + fts5G
fe20: 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20  etVarint32(.    
fe30: 20 20 20 20 20 20 20 20 20 20 26 70 4c 65 61 66            &pLeaf
fe40: 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ->p[pLeaf->szLea
fe50: 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f  f], pIter->iEndo
fe60: 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 20  fDoclist.       
fe70: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
fe80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
fe90: 73 65 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e  se if( pLeaf->nn
fea0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
feb0: 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
fec0: 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65  >iPgidxOff = pLe
fed0: 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73  af->szLeaf + fts
fee0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20  5GetVarint32(.  
fef0: 20 20 20 20 20 20 20 20 20 20 26 70 4c 65 61 66            &pLeaf
ff00: 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ->p[pLeaf->szLea
ff10: 66 5d 2c 20 69 4f 66 66 0a 20 20 20 20 20 20 20  f], iOff.       
ff20: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   );.        pIte
ff30: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
ff40: 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 70   iOff;.        p
ff50: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
ff60: 69 73 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  ist = iOff;.    
ff70: 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31      bNewTerm = 1
ff80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ff90: 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c  assert_nc( iOff<
ffa0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 3b  pLeaf->szLeaf );
ffb0: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e  .      if( iOff>
ffc0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
ffd0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
ffe0: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
fff0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
10000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10010 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
10020 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
10030 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73  now at EOF. If s
10040 6f 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e  o, return early.
10050 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d   */.  if( pIter-
10060 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66  >pLeaf ){.    if
10070 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20  ( bNewTerm ){.  
10080 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66      if( pIter->f
10090 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
100a0 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20  TER_ONETERM ){. 
100b0 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
100c0 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
100d0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 49  eaf);.        pI
100e0 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
100f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10100 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
10110 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65  LoadTerm(p, pIte
10120 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  r, nKeep);.     
10130 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
10140 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
10150 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 62  ;.        if( pb
10160 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77  NewTerm ) *pbNew
10170 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
10180 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
10190 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
101a0 69 6e 67 20 63 6f 75 6c 64 20 62 65 20 64 6f 6e  ing could be don
101b0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 74 73  e by calling fts
101c0 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
101d0 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20 2a 2a  (). But.      **
101e0 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 70   this block is p
101f0 61 72 74 69 63 75 6c 61 72 6c 79 20 70 65 72 66  articularly perf
10200 6f 72 6d 61 6e 63 65 20 63 72 69 74 69 63 61 6c  ormance critical
10210 2c 20 73 6f 20 65 71 75 69 76 61 6c 65 6e 74 0a  , so equivalent.
10220 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73        ** code is
10230 20 69 6e 6c 69 6e 65 64 2e 20 0a 20 20 20 20 20   inlined. .     
10240 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4c 61 74   **.      ** Lat
10250 65 72 3a 20 53 77 69 74 63 68 65 64 20 62 61 63  er: Switched bac
10260 6b 20 74 6f 20 66 74 73 35 53 65 67 49 74 65 72  k to fts5SegIter
10270 4c 6f 61 64 4e 50 6f 73 28 29 20 62 65 63 61 75  LoadNPos() becau
10280 73 65 20 69 74 20 73 75 70 70 6f 72 74 73 0a 20  se it supports. 
10290 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c 3d 6e       ** detail=n
102a0 6f 6e 65 20 6d 6f 64 65 2e 20 4e 6f 74 20 69 64  one mode. Not id
102b0 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eal..      */.  
102c0 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20      int nSz;.   
102d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
102e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
102f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
10300 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3c  er->iLeafOffset<
10310 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e  =pIter->pLeaf->n
10320 6e 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 46  n );.      fts5F
10330 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
10340 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20  Iter->pLeaf->p, 
10350 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10360 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20  et, nSz);.      
10370 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e  pIter->bDel = (n
10380 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  Sz & 0x0001);.  
10390 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
103a0 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20  = nSz>>1;.      
103b0 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72  assert_nc( pIter
103c0 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20  ->nPos>=0 );.   
103d0 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e   }.  }.}..#defin
103e0 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61 2c 20  e SWAPVAL(T, a, 
103f0 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d 70 3d  b) { T tmp; tmp=
10400 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d  a; a=b; b=tmp; }
10410 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 49 6e  ..#define fts5In
10420 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28 61 2c  dexSkipVarint(a,
10430 20 69 4f 66 66 29 20 7b 20 20 20 20 20 20 20 20   iOff) {        
10440 20 20 20 20 5c 0a 20 20 69 6e 74 20 69 45 6e 64      \.  int iEnd
10450 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20 20 20 20   = 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 5c 0a 20 20 77 68 69 6c          \.  whil
10480 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d 20 26 20  e( (a[iOff++] & 
10490 30 78 38 30 29 20 26 26 20 69 4f 66 66 3c 69 45  0x80) && iOff<iE
104a0 6e 64 20 29 3b 20 20 20 20 20 20 20 5c 0a 7d 0a  nd );       \.}.
104b0 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
104c0 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
104d0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
104e0 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64  rst rowid in a d
104f0 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20  oclist. This.** 
10500 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
10510 65 20 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f  e iterator up so
10520 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 69   that iterates i
10530 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
10540 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64  through.** the d
10550 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  oclist..*/.stati
10560 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
10570 65 72 52 65 76 65 72 73 65 28 46 74 73 35 49 6e  erReverse(Fts5In
10580 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
10590 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
105a0 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
105b0 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
105c0 6c 69 64 78 3b 0a 20 20 46 74 73 35 44 61 74 61  lidx;.  Fts5Data
105d0 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69   *pLast = 0;.  i
105e0 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
105f0 0a 0a 20 20 69 66 28 20 70 44 6c 69 64 78 20 29  ..  if( pDlidx )
10600 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64  {.    int iSegid
10610 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e   = pIter->pSeg->
10620 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e 6f  iSegid;.    pgno
10630 4c 61 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78  Last = fts5Dlidx
10640 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
10650 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74  ;.    pLast = ft
10660 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
10670 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
10680 28 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61 73  (iSegid, pgnoLas
10690 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t));.  }else{.  
106a0 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
106b0 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
106c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
106d0 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a  rent leaf data *
106e0 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  /..    /* Curren
106f0 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65 72  tly, Fts5SegIter
10700 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69  .iLeafOffset poi
10710 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
10720 20 62 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20   byte of.    ** 
10730 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f  position-list co
10740 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75  ntent for the cu
10750 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63  rrent rowid. Bac
10760 6b 20 69 74 20 75 70 20 73 6f 20 74 68 61 74 20  k it up so that 
10770 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73  it.    ** points
10780 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
10790 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
107a0 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a  st size field. *
107b0 2f 0a 20 20 20 20 69 6e 74 20 69 50 6f 73 6c 69  /.    int iPosli
107c0 73 74 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  st;.    if( pIte
107d0 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
107e0 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ==pIter->iLeafPg
107f0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 69 50 6f 73  no ){.      iPos
10800 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 69 54  list = pIter->iT
10810 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ermLeafOffset;. 
10820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10830 69 50 6f 73 6c 69 73 74 20 3d 20 34 3b 0a 20 20  iPoslist = 4;.  
10840 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e 64 65    }.    fts5Inde
10850 78 53 6b 69 70 56 61 72 69 6e 74 28 70 4c 65 61  xSkipVarint(pLea
10860 66 2d 3e 70 2c 20 69 50 6f 73 6c 69 73 74 29 3b  f->p, iPoslist);
10870 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
10880 66 4f 66 66 73 65 74 20 3d 20 69 50 6f 73 6c 69  fOffset = iPosli
10890 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  st;..    /* If t
108a0 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
108b0 20 74 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c   true then the l
108c0 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72  argest rowid for
108d0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
108e0 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74   ** term may not
108f0 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68   be stored on th
10900 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
10910 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61 72  So search forwar
10920 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20  d to.    ** see 
10930 77 68 65 72 65 20 73 61 69 64 20 72 6f 77 69 64  where said rowid
10940 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a   really is.  */.
10950 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
10960 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3e 3d 70 4c  EndofDoclist>=pL
10970 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
10980 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20       int pgno;. 
10990 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
109a0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
109b0 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a  = pIter->pSeg;..
109c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73        /* The las
109d0 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64  t rowid in the d
109e0 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62  oclist may not b
109f0 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e on the current
10a00 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20   page. Search.  
10a10 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74      ** forward t
10a20 6f 20 66 69 6e 64 20 74 68 65 20 70 61 67 65 20  o find the page 
10a30 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
10a40 61 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20  ast rowid.  */. 
10a50 20 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49       for(pgno=pI
10a60 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31  ter->iLeafPgno+1
10a70 3b 20 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f  ; !p->rc && pgno
10a80 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  <=pSeg->pgnoLast
10a90 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20  ; pgno++){.     
10aa0 20 20 20 69 36 34 20 69 41 62 73 20 3d 20 46 54     i64 iAbs = FT
10ab0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
10ac0 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
10ad0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74  gno);.        Ft
10ae0 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66  s5Data *pNew = f
10af0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
10b00 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Abs);.        if
10b10 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
10b20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20      int iRowid, 
10b30 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20 20 20  bTermless;.     
10b40 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74       iRowid = ft
10b50 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
10b60 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  Off(pNew);.     
10b70 20 20 20 20 20 62 54 65 72 6d 6c 65 73 73 20 3d       bTermless =
10b80 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
10b90 65 73 73 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ess(pNew);.     
10ba0 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 20       if( iRowid 
10bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
10bc0 57 41 50 56 41 4c 28 46 74 73 35 44 61 74 61 2a  WAPVAL(Fts5Data*
10bd0 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a  , pNew, pLast);.
10be0 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f              pgno
10bf0 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Last = pgno;.   
10c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10c10 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
10c20 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  se(pNew);.      
10c30 20 20 20 20 69 66 28 20 62 54 65 72 6d 6c 65 73      if( bTermles
10c40 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s==0 ) break;.  
10c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10c60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10c70 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c  If pLast is NULL
10c80 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
10c90 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
10ca0 77 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63  wid for this doc
10cb0 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f  list.  ** lies o
10cc0 6e 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  n the page curre
10cd0 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
10ce0 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20  y the iterator. 
10cf0 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20 20  In this case .  
10d00 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  ** pIter->iLeafO
10d10 66 66 73 65 74 20 69 73 20 61 6c 72 65 61 64 79  ffset is already
10d20 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
10d30 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
10d40 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65  st size.  ** fie
10d50 6c 64 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ld associated wi
10d60 74 68 20 74 68 65 20 66 69 72 73 74 20 72 65 6c  th the first rel
10d70 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74  evant rowid on t
10d80 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  he page..  **.  
10d90 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73 74 20  ** Or, if pLast 
10da0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
10db0 6e 20 69 74 20 69 73 20 74 68 65 20 70 61 67 65  n it is the page
10dc0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
10dd0 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77  he last.  ** row
10de0 69 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  id. In this case
10df0 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69   configure the i
10e00 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
10e10 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
10e20 0a 20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69  .  ** first rowi
10e30 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 0a  d on this page..
10e40 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74    */.  if( pLast
10e50 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
10e60 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
10e70 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
10e80 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
10e90 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20  pLeaf = pLast;. 
10ea0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
10eb0 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a  gno = pgnoLast;.
10ec0 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c      iOff = fts5L
10ed0 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
10ee0 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 69 4f 66  (pLast);.    iOf
10ef0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
10f00 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66  nt(&pLast->p[iOf
10f10 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
10f20 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  ->iRowid);.    p
10f30 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10f40 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 69  t = iOff;..    i
10f50 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  f( fts5LeafIsTer
10f60 6d 6c 65 73 73 28 70 4c 61 73 74 29 20 29 7b 0a  mless(pLast) ){.
10f70 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
10f80 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 61  dofDoclist = pLa
10f90 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65  st->nn+1;.    }e
10fa0 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72  lse{.      pIter
10fb0 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
10fc0 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  = fts5LeafFirstT
10fd0 65 72 6d 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20  ermOff(pLast);. 
10fe0 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74 73     }..  }..  fts
10ff0 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
11000 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
11010 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  );.}../*.** Iter
11020 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
11030 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
11040 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
11050 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20  f a doclist..** 
11060 54 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  There is a docli
11070 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61  st-index associa
11080 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6e  ted with the fin
11090 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 63  al term on the c
110a0 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e  urrent .** page.
110b0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
110c0 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74  term is the last
110d0 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70 61 67   term on the pag
110e0 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20  e, load the .** 
110f0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72  doclist-index fr
11100 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e 69 74  om disk and init
11110 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74  ialize an iterat
11120 6f 72 20 61 74 20 28 70 49 74 65 72 2d 3e 70 44  or at (pIter->pD
11130 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lidx)..*/.static
11140 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
11150 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49  rLoadDlidx(Fts5I
11160 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
11170 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
11180 69 6e 74 20 69 53 65 67 20 3d 20 70 49 74 65 72  int iSeg = pIter
11190 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
111a0 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
111b0 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
111c0 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
111d0 45 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  E);.  Fts5Data *
111e0 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
111f0 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74  Leaf; /* Current
11200 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20   leaf data */.. 
11210 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
11220 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
11230 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
11240 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
11250 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20  >pDlidx==0 );.. 
11260 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
11270 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
11280 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61   ends on this pa
11290 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ge. If it does, 
112a0 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c  return.  ** earl
112b0 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e  y without loadin
112c0 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  g the doclist-in
112d0 64 65 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e  dex (as it belon
112e0 67 73 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  gs to a differen
112f0 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a  t.  ** term. */.
11300 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
11310 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  rmLeafPgno==pIte
11320 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 0a 20 20  r->iLeafPgno .  
11330 20 26 26 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f   && pIter->iEndo
11340 66 44 6f 63 6c 69 73 74 3c 70 4c 65 61 66 2d 3e  fDoclist<pLeaf->
11350 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a 20 20 20  szLeaf .  ){.   
11360 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
11370 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20  pIter->pDlidx = 
11380 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
11390 74 28 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c  t(p, bRev, iSeg,
113a0 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
113b0 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  fPgno);.}../*.**
113c0 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   The iterator ob
113d0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
113e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
113f0 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  nt currently con
11400 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69  tains.** no vali
11410 64 20 76 61 6c 75 65 73 20 65 78 63 65 70 74 20  d values except 
11420 66 6f 72 20 74 68 65 20 46 74 73 35 53 65 67 49  for the Fts5SegI
11430 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62 65 72  ter.pLeaf member
11440 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 0a   variable. This.
11450 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  ** function sear
11460 63 68 65 73 20 74 68 65 20 6c 65 61 66 20 70 61  ches the leaf pa
11470 67 65 20 66 6f 72 20 61 20 74 65 72 6d 20 6d 61  ge for a term ma
11480 74 63 68 69 6e 67 20 28 70 54 65 72 6d 2f 6e 54  tching (pTerm/nT
11490 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  erm)..**.** If t
114a0 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
114b0 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20 74 68  m is found on th
114c0 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
114d0 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
114e0 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t.** pointing to
114f0 20 69 74 2e 20 49 66 20 61 72 67 75 6d 65 6e 74   it. If argument
11500 20 62 47 65 20 69 73 20 7a 65 72 6f 20 61 6e 64   bGe is zero and
11510 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
11520 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65 20 69   found,.** the i
11530 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
11540 70 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f 46 2e  pointing at EOF.
11550 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20 69 73  .**.** If bGe is
11560 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
11570 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
11580 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
11590 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  hen the.** itera
115a0 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
115b0 74 69 6e 67 20 74 6f 20 74 68 65 20 73 6d 61 6c  ting to the smal
115c0 6c 65 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  lest term in the
115d0 20 73 65 67 6d 65 6e 74 20 74 68 61 74 0a 2a 2a   segment that.**
115e0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
115f0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
11600 72 6d 2c 20 65 76 65 6e 20 69 66 20 74 68 69 73  rm, even if this
11610 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f 6e 20   term is not on 
11620 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70  the.** current p
11630 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
11640 6f 69 64 20 66 74 73 35 4c 65 61 66 53 65 65 6b  oid fts5LeafSeek
11650 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
11660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11670 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79      /* Leave any
11680 20 65 72 72 6f 72 20 63 6f 64 65 20 68 65 72 65   error code here
11690 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c 20 20   */.  int bGe,  
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
116c0 72 20 61 20 3e 3d 20 73 65 61 72 63 68 20 2a 2f  r a >= search */
116d0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
116e0 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
116f0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
11700 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73  o seek */.  cons
11710 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
11720 20 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 54   nTerm      /* T
11730 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66 6f  erm to search fo
11740 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f  r */.){.  int iO
11750 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ff;.  const u8 *
11760 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
11770 2d 3e 70 3b 0a 20 20 69 6e 74 20 73 7a 4c 65 61  ->p;.  int szLea
11780 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
11790 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20  ->szLeaf;.  int 
117a0 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
117b0 2d 3e 6e 6e 3b 0a 0a 20 20 75 33 32 20 6e 4d 61  ->nn;..  u32 nMa
117c0 74 63 68 20 3d 20 30 3b 0a 20 20 75 33 32 20 6e  tch = 0;.  u32 n
117d0 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75 33 32 20  Keep = 0;.  u32 
117e0 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 75 33 32 20  nNew = 0;.  u32 
117f0 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 6e 74 20  iTermOff;.  int 
11800 69 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20  iPgidx;         
11810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11820 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e  urrent offset in
11830 20 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20   pgidx */.  int 
11840 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 30 3b 0a  bEndOfPage = 0;.
11850 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
11860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
11870 20 20 69 50 67 69 64 78 20 3d 20 73 7a 4c 65 61    iPgidx = szLea
11880 66 3b 0a 20 20 69 50 67 69 64 78 20 2b 3d 20 66  f;.  iPgidx += f
11890 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
118a0 61 5b 69 50 67 69 64 78 5d 2c 20 69 54 65 72 6d  a[iPgidx], iTerm
118b0 4f 66 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 69  Off);.  iOff = i
118c0 54 65 72 6d 4f 66 66 3b 0a 20 20 69 66 28 20 69  TermOff;.  if( i
118d0 4f 66 66 3e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e  Off>n ){.    p->
118e0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
118f0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
11900 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29   }..  while( 1 )
11910 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  {..    /* Figure
11920 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6e 65   out how many ne
11930 77 20 62 79 74 65 73 20 61 72 65 20 69 6e 20 74  w bytes are in t
11940 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
11950 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
11960 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4e 65  t32(a, iOff, nNe
11970 77 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65  w);.    if( nKee
11980 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  p<nMatch ){.    
11990 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61    goto search_fa
119a0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
119b0 20 61 73 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d   assert( nKeep>=
119c0 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20 20 69 66  nMatch );.    if
119d0 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20  ( nKeep==nMatch 
119e0 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 43 6d  ){.      u32 nCm
119f0 70 3b 0a 20 20 20 20 20 20 75 33 32 20 69 3b 0a  p;.      u32 i;.
11a00 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 28 75 33        nCmp = (u3
11a10 32 29 4d 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72  2)MIN(nNew, nTer
11a20 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20 20 20 20  m-nMatch);.     
11a30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70   for(i=0; i<nCmp
11a40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11a50 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70  if( a[iOff+i]!=p
11a60 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29  Term[nMatch+i] )
11a70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11a80 20 20 20 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20        nMatch += 
11a90 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 28 75  i;..      if( (u
11aa0 33 32 29 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68  32)nTerm==nMatch
11ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11ac0 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20  i==nNew ){.     
11ad0 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68       goto search
11ae0 5f 73 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20  _success;.      
11af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11b00 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66     goto search_f
11b10 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
11b20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11b30 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66   i<nNew && a[iOf
11b40 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63  f+i]>pTerm[nMatc
11b50 68 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  h] ){.        go
11b60 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  to search_failed
11b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11b80 0a 20 20 20 20 69 66 28 20 69 50 67 69 64 78 3e  .    if( iPgidx>
11b90 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62 45 6e 64  =n ){.      bEnd
11ba0 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20  OfPage = 1;.    
11bb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
11bc0 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74      iPgidx += ft
11bd0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
11be0 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29  [iPgidx], nKeep)
11bf0 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b  ;.    iTermOff +
11c00 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66  = nKeep;.    iOf
11c10 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20  f = iTermOff;.. 
11c20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29     if( iOff>=n )
11c30 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
11c40 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
11c50 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
11c60 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  }..    /* Read t
11c70 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20 6f  he nKeep field o
11c80 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2e  f the next term.
11c90 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74   */.    fts5Fast
11ca0 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
11cb0 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 7d  Off, nKeep);.  }
11cc0 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  .. search_failed
11cd0 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20 29  :.  if( bGe==0 )
11ce0 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  {.    fts5DataRe
11cf0 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
11d00 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
11d10 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 72  pLeaf = 0;.    r
11d20 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
11d30 66 28 20 62 45 6e 64 4f 66 50 61 67 65 20 29 7b  f( bEndOfPage ){
11d40 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
11d50 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
11d60 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
11d70 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
11d80 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72  pLeaf==0 ) retur
11d90 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20 70 49 74  n;.      a = pIt
11da0 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
11db0 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66      if( fts5Leaf
11dc0 49 73 54 65 72 6d 6c 65 73 73 28 70 49 74 65 72  IsTermless(pIter
11dd0 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a 20  ->pLeaf)==0 ){. 
11de0 20 20 20 20 20 20 20 69 50 67 69 64 78 20 3d 20         iPgidx = 
11df0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
11e00 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 69 50  Leaf;.        iP
11e10 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
11e20 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e  arint32(&pIter->
11e30 70 4c 65 61 66 2d 3e 70 5b 69 50 67 69 64 78 5d  pLeaf->p[iPgidx]
11e40 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20  , iOff);.       
11e50 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69   if( iOff<4 || i
11e60 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
11e70 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
11e80 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
11e90 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
11ea0 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
11eb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11ec0 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20 3d 20          nKeep = 
11ed0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54 65  0;.          iTe
11ee0 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20  rmOff = iOff;.  
11ef0 20 20 20 20 20 20 20 20 6e 20 3d 20 70 49 74 65          n = pIte
11f00 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20  r->pLeaf->nn;.  
11f10 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
11f20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11f30 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b  &a[iOff], nNew);
11f40 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11f50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11f60 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
11f70 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  1 );.  }.. searc
11f80 68 5f 73 75 63 63 65 73 73 3a 0a 20 20 70 49 74  h_success:.  pIt
11f90 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
11fa0 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a 20  = iOff + nNew;. 
11fb0 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
11fc0 66 4f 66 66 73 65 74 3e 6e 20 29 7b 0a 20 20 20  fOffset>n ){.   
11fd0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
11fe0 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72  RRUPT;.    retur
11ff0 6e 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  n;.  }.  pIter->
12000 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
12010 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
12020 66 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69  fset;.  pIter->i
12030 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70  TermLeafPgno = p
12040 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
12050 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65  ..  fts5BufferSe
12060 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
12070 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70  ->term, nKeep, p
12080 54 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66  Term);.  fts5Buf
12090 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
120a0 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
120b0 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66  rm, nNew, &a[iOf
120c0 66 5d 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 69  f]);..  if( iPgi
120d0 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74  dx>=n ){.    pIt
120e0 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
120f0 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  t = pIter->pLeaf
12100 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b  ->nn+1;.  }else{
12110 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  .    int nExtra;
12120 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66  .    iPgidx += f
12130 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
12140 61 5b 69 50 67 69 64 78 5d 2c 20 6e 45 78 74 72  a[iPgidx], nExtr
12150 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
12160 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69  EndofDoclist = i
12170 54 65 72 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61  TermOff + nExtra
12180 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69  ;.  }.  pIter->i
12190 50 67 69 64 78 4f 66 66 20 3d 20 69 50 67 69 64  PgidxOff = iPgid
121a0 78 3b 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65  x;..  fts5SegIte
121b0 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49  rLoadRowid(p, pI
121c0 74 65 72 29 3b 0a 20 20 66 74 73 35 53 65 67 49  ter);.  fts5SegI
121d0 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
121e0 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Iter);.}..static
121f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 66   sqlite3_stmt *f
12200 74 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74  ts5IdxSelectStmt
12210 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
12220 20 20 69 66 28 20 70 2d 3e 70 49 64 78 53 65 6c    if( p->pIdxSel
12230 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74  ect==0 ){.    Ft
12240 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
12250 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
12260 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65      fts5IndexPre
12270 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e  pareStmt(p, &p->
12280 70 49 64 78 53 65 6c 65 63 74 2c 20 73 71 6c 69  pIdxSelect, sqli
12290 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
122a0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 70         "SELECT p
122b0 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27 25  gno FROM '%q'.'%
122c0 71 5f 69 64 78 27 20 57 48 45 52 45 20 22 0a 20  q_idx' WHERE ". 
122d0 20 20 20 20 20 20 20 20 20 22 73 65 67 69 64 3d           "segid=
122e0 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52  ? AND term<=? OR
122f0 44 45 52 20 42 59 20 74 65 72 6d 20 44 45 53 43  DER BY term DESC
12300 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20   LIMIT 1",.     
12310 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
12320 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
12330 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20  e.    ));.  }.  
12340 72 65 74 75 72 6e 20 70 2d 3e 70 49 64 78 53 65  return p->pIdxSe
12350 6c 65 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  lect;.}../*.** I
12360 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62  nitialize the ob
12370 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f  ject pIter to po
12380 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72  int to term pTer
12390 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73  m/nTerm within s
123a0 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20  egment.** pSeg. 
123b0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
123c0 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
123d0 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72 61  index, the itera
123e0 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f  tor is set to EO
123f0 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  F..**.** If an e
12400 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
12410 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
12420 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
12430 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
12440 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
12450 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
12460 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
12470 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12480 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
12490 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
124a0 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
124b0 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
124c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
124d0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
124e0 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  ackend */.  cons
124f0 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
12500 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
12510 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a  erm to seek to *
12520 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
12550 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61  TS5INDEX_XXX fla
12560 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  gs */.  Fts5Stru
12570 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
12580 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  eg,     /* Descr
12590 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e  iption of segmen
125a0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
125b0 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
125c0 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
125d0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
125e0 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20 31  ){.  int iPg = 1
125f0 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28 66  ;.  int bGe = (f
12600 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
12610 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20  _QUERY_SCAN);.  
12620 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b 20  int bDlidx = 0; 
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
12650 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
12660 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dex */.  sqlite3
12670 5f 73 74 6d 74 20 2a 70 49 64 78 53 65 6c 65 63  _stmt *pIdxSelec
12680 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  t = 0;..  assert
12690 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61  ( bGe==0 || (fla
126a0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
126b0 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b  UERY_DESC)==0 );
126c0 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d  .  assert( pTerm
126d0 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d   && nTerm );.  m
126e0 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
126f0 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
12700 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d  .  pIter->pSeg =
12710 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54 68 69   pSeg;..  /* Thi
12720 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74 61  s block sets sta
12730 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67 20  ck variable iPg 
12740 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  to the leaf page
12750 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 79   number that may
12760 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65  .  ** contain te
12770 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  rm (pTerm/nTerm)
12780 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
12790 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  nt in the segmen
127a0 74 2e 20 2a 2f 0a 20 20 70 49 64 78 53 65 6c 65  t. */.  pIdxSele
127b0 63 74 20 3d 20 66 74 73 35 49 64 78 53 65 6c 65  ct = fts5IdxSele
127c0 63 74 53 74 6d 74 28 70 29 3b 0a 20 20 69 66 28  ctStmt(p);.  if(
127d0 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
127e0 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
127f0 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c 20  int(pIdxSelect, 
12800 31 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29  1, pSeg->iSegid)
12810 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
12820 5f 62 6c 6f 62 28 70 49 64 78 53 65 6c 65 63 74  _blob(pIdxSelect
12830 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  , 2, pTerm, nTer
12840 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  m, SQLITE_STATIC
12850 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
12860 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
12870 70 28 70 49 64 78 53 65 6c 65 63 74 29 20 29 7b  p(pIdxSelect) ){
12880 0a 20 20 20 20 69 36 34 20 76 61 6c 20 3d 20 73  .    i64 val = s
12890 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
128a0 74 28 70 49 64 78 53 65 6c 65 63 74 2c 20 30 29  t(pIdxSelect, 0)
128b0 3b 0a 20 20 20 20 69 50 67 20 3d 20 28 69 6e 74  ;.    iPg = (int
128c0 29 28 76 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62  )(val>>1);.    b
128d0 44 6c 69 64 78 20 3d 20 28 76 61 6c 20 26 20 30  Dlidx = (val & 0
128e0 78 30 30 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d  x0001);.  }.  p-
128f0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
12900 73 65 74 28 70 49 64 78 53 65 6c 65 63 74 29 3b  set(pIdxSelect);
12910 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
12920 6e 75 6c 6c 28 70 49 64 78 53 65 6c 65 63 74 2c  null(pIdxSelect,
12930 20 32 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c   2);..  if( iPg<
12940 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
12950 29 7b 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65  ){.    iPg = pSe
12960 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20  g->pgnoFirst;.  
12970 20 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20    bDlidx = 0;.  
12980 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  }..  pIter->iLea
12990 66 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b  fPgno = iPg - 1;
129a0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  .  fts5SegIterNe
129b0 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
129c0 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
129d0 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73  pLeaf ){.    fts
129e0 35 4c 65 61 66 53 65 65 6b 28 70 2c 20 62 47 65  5LeafSeek(p, bGe
129f0 2c 20 70 49 74 65 72 2c 20 70 54 65 72 6d 2c 20  , pIter, pTerm, 
12a00 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69  nTerm);.  }..  i
12a10 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12a20 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29 7b  _OK && bGe==0 ){
12a30 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
12a40 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
12a50 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
12a60 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
12a70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
12a80 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
12a90 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
12aa0 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
12ab0 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
12ac0 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
12ad0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44 6c   }.      if( bDl
12ae0 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66  idx ){.        f
12af0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c  ts5SegIterLoadDl
12b00 69 64 78 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  idx(p, pIter);. 
12b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12b20 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
12b30 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
12b40 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
12b50 49 74 65 72 52 65 76 65 72 73 65 28 70 2c 20 70  IterReverse(p, p
12b60 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
12b70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
12b80 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 70  SegIterSetNext(p
12b90 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  , pIter);..  /* 
12ba0 45 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a  Either:.  **.  *
12bb0 2a 20 20 20 31 29 20 61 6e 20 65 72 72 6f 72 20  *   1) an error 
12bc0 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 6f 72  has occurred, or
12bd0 0a 20 20 2a 2a 20 20 20 32 29 20 74 68 65 20 69  .  **   2) the i
12be0 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
12bf0 6f 20 45 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20  o EOF, or.  **  
12c00 20 33 29 20 74 68 65 20 69 74 65 72 61 74 6f 72   3) the iterator
12c10 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
12c20 74 72 79 20 77 69 74 68 20 74 65 72 6d 20 28 70  try with term (p
12c30 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a  Term/nTerm), or.
12c40 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20 46 54    **   4) the FT
12c50 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
12c60 41 4e 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  AN flag was set 
12c70 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f 72  and the iterator
12c80 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20   points.  **    
12c90 20 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69    to an entry wi
12ca0 74 68 20 61 20 74 65 72 6d 20 67 72 65 61 74 65  th a term greate
12cb0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
12cc0 74 6f 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  to (pTerm/nTerm)
12cd0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 5f  ..  */.  assert_
12ce0 6e 63 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  nc( p->rc!=SQLIT
12cf0 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 20  E_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 2f 2a 20 31 20             /* 1 
12d20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e  */.   || pIter->
12d30 70 4c 65 61 66 3d 3d 30 20 20 20 20 20 20 20 20  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 2f 2a 20 32 20 2a 2f 0a 20         /* 2 */. 
12d70 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43    || fts5BufferC
12d80 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65  ompareBlob(&pIte
12d90 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20  r->term, pTerm, 
12da0 6e 54 65 72 6d 29 3d 3d 30 20 20 20 20 20 20 20  nTerm)==0       
12db0 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c     /* 3 */.   ||
12dc0 20 28 62 47 65 20 26 26 20 66 74 73 35 42 75 66   (bGe && fts5Buf
12dd0 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
12de0 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
12df0 72 6d 2c 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f  rm, nTerm)>0)  /
12e00 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f  * 4 */.  );.}../
12e10 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
12e20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72  the object pIter
12e30 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72   to point to ter
12e40 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69  m pTerm/nTerm wi
12e50 74 68 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  thin the.** in-m
12e60 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
12e70 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
12e80 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68   such term in th
12e90 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 74 68  e hash-table, th
12ea0 65 20 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69  e .** iterator i
12eb0 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a  s set to EOF..**
12ec0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
12ed0 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
12ee0 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
12ef0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
12f00 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
12f10 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
12f20 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
12f30 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12f40 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
12f50 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
12f60 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
12f70 65 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a  egIterHashInit(.
12f80 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
12fb0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  d */.  const u8 
12fc0 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
12fd0 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
12fe0 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69  o seek to */.  i
12ff0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13010 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e  * Mask of FTS5IN
13020 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  DEX_XXX flags */
13030 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
13040 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
13050 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
13060 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
13070 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74   const u8 *pList
13080 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73   = 0;.  int nLis
13090 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  t = 0;.  const u
130a0 38 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20  8 *z = 0;.  int 
130b0 6e 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  n = 0;..  assert
130c0 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20  ( p->pHash );.  
130d0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
130e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
130f0 66 28 20 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28  f( pTerm==0 || (
13100 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
13110 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 20 29 7b  X_QUERY_SCAN) ){
13120 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
13130 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
13140 49 6e 69 74 28 70 2d 3e 70 48 61 73 68 2c 20 28  Init(p->pHash, (
13150 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72  const char*)pTer
13160 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73  m, nTerm);.    s
13170 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
13180 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68  anEntry(p->pHash
13190 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  , (const char**)
131a0 26 7a 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  &z, &pList, &nLi
131b0 73 74 29 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20  st);.    n = (z 
131c0 3f 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63  ? (int)strlen((c
131d0 6f 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20  onst char*)z) : 
131e0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
131f0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
13200 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
13210 45 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74  ETERM;.    sqlit
13220 65 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28  e3Fts5HashQuery(
13230 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
13240 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
13250 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
13260 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54  ist);.    z = pT
13270 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65  erm;.    n = nTe
13280 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rm;.  }..  if( p
13290 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35  List ){.    Fts5
132a0 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
132b0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
132c0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
132d0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a  Iter->term, n, z
132e0 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
132f0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
13300 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
13310 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
13320 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
13330 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38    pLeaf->p = (u8
13340 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65  *)pList;.    pLe
13350 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e  af->nn = pLeaf->
13360 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a  szLeaf = nList;.
13370 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
13380 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49   = pLeaf;.    pI
13390 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
133a0 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
133b0 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a  (pLeaf->p, (u64*
133c0 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
133d0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  ;.    pIter->iEn
133e0 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65  dofDoclist = pLe
133f0 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28  af->nn;..    if(
13400 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
13410 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
13420 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  .      pIter->fl
13430 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
13440 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  TER_REVERSE;.   
13450 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
13460 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
13470 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c   pIter);.    }el
13480 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  se{.      fts5Se
13490 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
134a0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
134b0 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
134c0 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65  rSetNext(p, pIte
134d0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72  r);.}../*.** Zer
134e0 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  o the iterator p
134f0 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
13500 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
13510 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
13520 65 67 49 74 65 72 43 6c 65 61 72 28 46 74 73 35  egIterClear(Fts5
13530 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
13540 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
13550 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b  e(&pIter->term);
13560 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
13570 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
13580 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
13590 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74  ase(pIter->pNext
135a0 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69  Leaf);.  fts5Dli
135b0 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72  dxIterFree(pIter
135c0 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c  ->pDlidx);.  sql
135d0 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
135e0 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a  >aRowidOffset);.
135f0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
13600 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
13610 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64  gIter));.}..#ifd
13620 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
13630 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13640 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
13650 70 61 72 74 20 6f 66 20 74 68 65 20 62 69 67 20  part of the big 
13660 61 73 73 65 72 74 28 29 20 70 72 6f 63 65 64 75  assert() procedu
13670 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  re implemented b
13680 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d  y.** fts5AssertM
13690 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 29 2e  ultiIterSetup().
136a0 20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61 74   It ensures that
136b0 20 74 68 65 20 72 65 73 75 6c 74 20 63 75 72 72   the result curr
136c0 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20  ently stored.** 
136d0 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65 20  in *pRes is the 
136e0 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f  correct result o
136f0 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  f comparing the 
13700 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
13710 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  s of the.** two 
13720 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
13730 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
13740 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
13750 73 75 6c 74 28 0a 20 20 46 74 73 35 49 74 65 72  sult(.  Fts5Iter
13760 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35   *pIter, .  Fts5
13770 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46  SegIter *p1,.  F
13780 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a  ts5SegIter *p2,.
13790 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
137a0 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20  Res.){.  int i1 
137b0 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53  = p1 - pIter->aS
137c0 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70  eg;.  int i2 = p
137d0 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  2 - pIter->aSeg;
137e0 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61  ..  if( p1->pLea
137f0 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29  f || p2->pLeaf )
13800 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c  {.    if( p1->pL
13810 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
13820 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
13830 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20  irst==i2 );.    
13840 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
13850 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
13860 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
13870 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20  irst==i1 );.    
13880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
13890 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e   nMin = MIN(p1->
138a0 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d  term.n, p2->term
138b0 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  .n);.      int r
138c0 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e  es = memcmp(p1->
138d0 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d  term.p, p2->term
138e0 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20  .p, nMin);.     
138f0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
13900 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d  s = p1->term.n -
13910 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20   p2->term.n;..  
13920 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
13930 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13940 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
13950 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
13960 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64  sert( p1->iRowid
13970 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a  !=p2->iRowid );.
13980 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 28          res = ((
13990 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d  p1->iRowid > p2-
139a0 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
139b0 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b  >bRev) ? -1 : 1;
139c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
139d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
139e0 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29  es->bTermEq==0 )
139f0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13a00 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
13a10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
13a20 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29  es->iFirst==i1 )
13a30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13a50 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20  Res->iFirst==i2 
13a60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13a70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
13a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
13a90 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51   no-op unless SQ
13aa0 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
13ab0 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20  fined when this 
13ac0 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d  module.** is com
13ad0 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63  piled. In that c
13ae0 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ase, this functi
13af0 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c  on is essentiall
13b00 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a  y an assert() .*
13b10 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  * statement used
13b20 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
13b30 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
13b40 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73  the pIter->aFirs
13b50 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  t[] array.** are
13b60 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61   correct..*/.sta
13b70 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73  tic void fts5Ass
13b80 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
13b90 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  p(Fts5Index *p, 
13ba0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
13bb0 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
13bc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13bd0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 46 69  Fts5SegIter *pFi
13be0 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  rst = &pIter->aS
13bf0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
13c00 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
13c10 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61     int i;..    a
13c20 73 73 65 72 74 28 20 28 70 46 69 72 73 74 2d 3e  ssert( (pFirst->
13c30 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
13c40 2d 3e 62 61 73 65 2e 62 45 6f 66 20 29 3b 0a 0a  ->base.bEof );..
13c50 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
13c60 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  t pIter->iSwitch
13c70 52 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f 72  Rowid is set cor
13c80 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66  rectly. */.    f
13c90 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
13ca0 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
13cb0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13cc0 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
13cd0 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  g[i];.      asse
13ce0 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20 0a  rt( p1==pFirst .
13cf0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31             || p1
13d00 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20  ->pLeaf==0 .    
13d10 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42 75         || fts5Bu
13d20 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46 69  fferCompare(&pFi
13d30 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e  rst->term, &p1->
13d40 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20 20  term) .         
13d50 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d    || p1->iRowid=
13d60 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  =pIter->iSwitchR
13d70 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20 20  owid.           
13d80 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70  || (p1->iRowid<p
13d90 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13da0 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
13db0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
13dc0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13dd0 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d  pIter->nSeg; i+=
13de0 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
13df0 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
13e00 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
13e10 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13e20 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p2 = &pIter->aSe
13e30 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74  g[i+1];.      Ft
13e40 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
13e50 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
13e60 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20  [(pIter->nSeg + 
13e70 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66  i) / 2];.      f
13e80 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
13e90 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
13ea0 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
13eb0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
13ec0 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53  =1; i<(pIter->nS
13ed0 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a  eg / 2); i+=2){.
13ee0 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
13ef0 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  r *p1 = &pIter->
13f00 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
13f10 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20  rst[i*2].iFirst 
13f20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
13f30 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
13f40 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
13f50 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46  aFirst[i*2+1].iF
13f60 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74  irst ];.      Ft
13f70 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
13f80 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
13f90 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41  [i];.      fts5A
13fa0 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
13fb0 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c  esult(pIter, p1,
13fc0 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20   p2, pRes);.    
13fd0 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
13fe0 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65 72  define fts5Asser
13ff0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
14000 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x,y).#endif../*.
14010 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  ** Do the compar
14020 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74  ison necessary t
14030 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72  o populate pIter
14040 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a  ->aFirst[iOut]..
14050 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74  **.** If the ret
14060 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e  urned value is n
14070 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
14080 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
14090 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20   an entry.** in 
140a0 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  the pIter->aSeg[
140b0 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20  ] array that is 
140c0 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20  (a) not at EOF, 
140d0 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67  and (b) pointing
140e0 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61  .** to a key tha
140f0 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  t is a duplicate
14100 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67   of another, hig
14110 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a  her priority, .*
14120 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74  * segment-iterat
14130 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e  or in the pSeg->
14140 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aSeg[] array..*/
14150 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
14160 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
14170 72 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  re(Fts5Iter *pIt
14180 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20  er, int iOut){. 
14190 20 69 6e 74 20 69 31 3b 20 20 20 20 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 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66   /* Index of lef
141c0 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
141d0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20  er */.  int i2; 
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14200 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46   of right-hand F
14210 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
14220 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35  int iRes;.  Fts5
14230 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20  SegIter *p1;    
14240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
14250 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  eft-hand Fts5Seg
14260 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65  Iter */.  Fts5Se
14270 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20  gIter *p2;      
14280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
14290 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ht-hand Fts5SegI
142a0 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65  ter */.  Fts5CRe
142b0 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
142c0 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
142d0 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f  ];..  assert( iO
142e0 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26  ut<pIter->nSeg &
142f0 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73  & iOut>0 );.  as
14300 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65  sert( pIter->bRe
14310 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62  v==0 || pIter->b
14320 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28  Rev==1 );..  if(
14330 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e   iOut>=(pIter->n
14340 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31  Seg/2) ){.    i1
14350 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72   = (iOut - pIter
14360 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20  ->nSeg/2) * 2;. 
14370 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a     i2 = i1 + 1;.
14380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20    }else{.    i1 
14390 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
143a0 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a  iOut*2].iFirst;.
143b0 20 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e      i2 = pIter->
143c0 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d  aFirst[iOut*2+1]
143d0 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70  .iFirst;.  }.  p
143e0 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
143f0 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49  [i1];.  p2 = &pI
14400 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a  ter->aSeg[i2];..
14410 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20    pRes->bTermEq 
14420 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70  = 0;.  if( p1->p
14430 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20  Leaf==0 ){      
14440 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73       /* If p1 is
14450 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69   at EOF */.    i
14460 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73  Res = i2;.  }els
14470 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d  e if( p2->pLeaf=
14480 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20  =0 ){     /* If 
14490 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  p2 is at EOF */.
144a0 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20      iRes = i1;. 
144b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
144c0 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72  res = fts5Buffer
144d0 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72  Compare(&p1->ter
144e0 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20  m, &p2->term);. 
144f0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
14500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
14510 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73  2>i1 );.      as
14520 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20  sert( i2!=0 );. 
14530 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d       pRes->bTerm
14540 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  Eq = 1;.      if
14550 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32  ( p1->iRowid==p2
14560 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
14570 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70      p1->bDel = p
14580 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20  2->bDel;.       
14590 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20   return i2;.    
145a0 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
145b0 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70  ((p1->iRowid > p
145c0 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  2->iRowid)==pIte
145d0 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20  r->bRev) ? -1 : 
145e0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  +1;.    }.    as
145f0 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a  sert( res!=0 );.
14600 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
14610 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 31  .      iRes = i1
14620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14630 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
14640 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d    }.  }..  pRes-
14650 3e 69 46 69 72 73 74 20 3d 20 28 75 31 36 29 69  >iFirst = (u16)i
14660 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  Res;.  return 0;
14670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
14680 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74  he seg-iter so t
14690 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
146a0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
146b0 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67   on page iLeafPg
146c0 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  no..** It is an 
146d0 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c  error if leaf iL
146e0 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74  eafPgno does not
146f0 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
14700 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f  ns no rowids..*/
14710 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
14720 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65  5SegIterGotoPage
14730 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
14740 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14750 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
14760 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
14770 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
14780 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
14790 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
147a0 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
147b0 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61  iLeafPgno.){.  a
147c0 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f  ssert( iLeafPgno
147d0 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
147e0 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61  o );..  if( iLea
147f0 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65  fPgno>pIter->pSe
14800 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
14810 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
14820 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65  CORRUPT;.  }else
14830 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  {.    fts5DataRe
14840 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65  lease(pIter->pNe
14850 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  xtLeaf);.    pIt
14860 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20  er->pNextLeaf = 
14870 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  0;.    pIter->iL
14880 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
14890 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53  gno-1;.    fts5S
148a0 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
148b0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73  , pIter);.    as
148c0 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
148d0 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d  ITE_OK || pIter-
148e0 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61  >iLeafPgno==iLea
148f0 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66  fPgno );..    if
14900 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14910 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
14920 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38 20 2a  iOff;.      u8 *
14930 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
14940 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ->p;.      int n
14950 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
14960 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20  >szLeaf;..      
14970 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
14980 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 49 74  irstRowidOff(pIt
14990 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
149a0 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
149b0 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  iOff>=n ){.     
149c0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
149d0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
149e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
149f0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
14a00 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
14a10 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
14a20 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  id);.        pIt
14a30 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
14a40 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
14a50 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
14a60 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
14a70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
14a90 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
14aa0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
14ab0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74  ond argument unt
14ac0 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a  il it is at or .
14ad0 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46  ** past rowid iF
14ae0 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20  rom. Regardless 
14af0 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
14b00 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61  iFrom, the itera
14b10 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73  tor is.** always
14b20 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61   advanced at lea
14b30 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  st once..*/.stat
14b40 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
14b50 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
14b60 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14b80 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
14b90 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
14ba0 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
14bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
14bc0 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
14bd0 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63  e */.  i64 iMatc
14be0 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
14bf0 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
14c00 65 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65  e iterator at le
14c10 61 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a  ast this far */.
14c20 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20  ){.  int bRev = 
14c30 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
14c40 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
14c50 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69  ERSE);.  Fts5Dli
14c60 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
14c70 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a   pIter->pDlidx;.
14c80 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20    int iLeafPgno 
14c90 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
14ca0 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20  no;.  int bMove 
14cb0 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
14cc0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
14cd0 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
14ce0 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ERM );.  assert(
14cf0 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29   pIter->pDlidx )
14d00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
14d10 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69  r->pLeaf );..  i
14d20 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20  f( bRev==0 ){.  
14d30 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c    while( !fts5Dl
14d40 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
14d50 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3e  lidx) && iMatch>
14d60 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
14d70 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20  id(pDlidx) ){.  
14d80 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
14d90 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
14da0 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  o(pDlidx);.     
14db0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
14dc0 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20  xt(p, pDlidx);. 
14dd0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 5f     }.    assert_
14de0 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70  nc( iLeafPgno>=p
14df0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
14e00 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20  || p->rc );.    
14e10 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  if( iLeafPgno>pI
14e20 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
14e30 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
14e40 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70  terGotoPage(p, p
14e50 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29  Iter, iLeafPgno)
14e60 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20  ;.      bMove = 
14e70 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
14e80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
14e90 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d  ter->pNextLeaf==
14ea0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
14eb0 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69   iMatch<pIter->i
14ec0 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69  Rowid );.    whi
14ed0 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74  le( !fts5DlidxIt
14ee0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
14ef0 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35 44   && iMatch<fts5D
14f00 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
14f10 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 66  lidx) ){.      f
14f20 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
14f30 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20  (p, pDlidx);.   
14f40 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f   }.    iLeafPgno
14f50 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
14f60 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
14f70 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44     assert( fts5D
14f80 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
14f90 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50  Dlidx) || iLeafP
14fa0 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno<=pIter->iLea
14fb0 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66  fPgno );..    if
14fc0 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65  ( iLeafPgno<pIte
14fd0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
14fe0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
14ff0 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
15000 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35  no+1;.      fts5
15010 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
15020 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
15030 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30  .      bMove = 0
15040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
15050 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76 65  o{.    if( bMove
15060 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
15070 45 5f 4f 4b 20 29 20 70 49 74 65 72 2d 3e 78 4e  E_OK ) pIter->xN
15080 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29  ext(p, pIter, 0)
15090 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
150a0 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61  >pLeaf==0 ) brea
150b0 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d  k;.    if( bRev=
150c0 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
150d0 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
150e0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65  eak;.    if( bRe
150f0 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69  v!=0 && pIter->i
15100 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20  Rowid<=iMatch ) 
15110 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65  break;.    bMove
15120 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20   = 1;.  }while( 
15130 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15140 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72   );.}.../*.** Fr
15150 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ee the iterator 
15160 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
15170 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
15180 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
15190 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
151a0 65 72 46 72 65 65 28 46 74 73 35 49 74 65 72 20  erFree(Fts5Iter 
151b0 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
151c0 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  Iter ){.    int 
151d0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
151e0 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
151f0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  ++){.      fts5S
15200 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49 74  egIterClear(&pIt
15210 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20  er->aSeg[i]);.  
15220 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
15230 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70  erFree(&pIter->p
15240 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  oslist);.    sql
15250 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
15260 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
15270 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
15280 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74  erAdvanced(.  Ft
15290 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
152b0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
152c0 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
152d0 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  */.  Fts5Iter *p
152e0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
152f0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
15300 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73   to update aFirs
15310 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f  t[] array for */
15320 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c  .  int iChanged,
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
15350 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74  ub-iterator just
15360 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69   advanced */.  i
15370 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20  nt iMinset      
15380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15390 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20  * Minimum entry 
153a0 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73  in aFirst[] to s
153b0 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  et */.){.  int i
153c0 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72  ;.  for(i=(pIter
153d0 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29  ->nSeg+iChanged)
153e0 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26  /2; i>=iMinset &
153f0 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
15400 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20  OK; i=i/2){.    
15410 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28  int iEq;.    if(
15420 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74   (iEq = fts5Mult
15430 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70  iIterDoCompare(p
15440 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20  Iter, i)) ){.   
15450 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
15460 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
15470 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20  Seg[iEq];.      
15480 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
15490 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
154a0 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c    pSeg->xNext(p,
154b0 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20   pSeg, 0);.     
154c0 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67   i = pIter->nSeg
154d0 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20   + iEq;.    }.  
154e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69  }.}../*.** Sub-i
154f0 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64  terator iChanged
15500 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49 74   of iterator pIt
15510 65 72 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  er has just been
15520 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74   advanced. It st
15530 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ill.** points to
15540 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74   the same term t
15550 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64  hough - just a d
15560 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20  ifferent rowid. 
15570 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
15580 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64   attempts to upd
15590 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ate the contents
155a0 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
155b0 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e  First[] accordin
155c0 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  gly..** If it do
155d0 65 73 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c  es so successful
155e0 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ly, 0 is returne
155f0 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a  d. Otherwise 1..
15600 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72  **.** If non-zer
15610 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  o is returned, t
15620 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
15630 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49   call fts5MultiI
15640 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a  terAdvanced().**
15650 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72   on the iterator
15660 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66   instead. That f
15670 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
15680 20 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e   same as this on
15690 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  e, except.** tha
156a0 74 20 69 74 20 64 65 61 6c 73 20 77 69 74 68 20  t it deals with 
156b0 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
156c0 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a   cases as well..
156d0 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */ .static int f
156e0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
156f0 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35  nceRowid(.  Fts5
15700 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
15710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15720 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74  terator to updat
15730 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  e aFirst[] array
15740 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
15750 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20  hanged,         
15760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15770 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74  ex of sub-iterat
15780 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64  or just advanced
15790 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
157a0 72 20 2a 2a 70 70 46 69 72 73 74 0a 29 7b 0a 20  r **ppFirst.){. 
157b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e   Fts5SegIter *pN
157c0 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  ew = &pIter->aSe
157d0 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20  g[iChanged];..  
157e0 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64  if( pNew->iRowid
157f0 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  ==pIter->iSwitch
15800 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65  Rowid.   || (pNe
15810 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d  w->iRowid<pIter-
15820 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
15830 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b  pIter->bRev.  ){
15840 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
15850 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74  Fts5SegIter *pOt
15860 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  her = &pIter->aS
15870 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78  eg[iChanged ^ 0x
15880 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72  0001];.    pIter
15890 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d  ->iSwitchRowid =
158a0 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53   pIter->bRev ? S
158b0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
158c0 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20  LARGEST_INT64;. 
158d0 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d     for(i=(pIter-
158e0 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f  >nSeg+iChanged)/
158f0 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  2; 1; i=i/2){.  
15900 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
15910 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
15920 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20  aFirst[i];..    
15930 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
15940 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61  pLeaf );.      a
15950 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65  ssert( pRes->bTe
15960 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65  rmEq==0 || pOthe
15970 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20  r->pLeaf );..   
15980 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65     if( pRes->bTe
15990 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20  rmEq ){.        
159a0 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64  if( pNew->iRowid
159b0 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  ==pOther->iRowid
159c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
159d0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
159e0 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65  }else if( (pOthe
159f0 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e  r->iRowid>pNew->
15a00 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
15a10 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
15a20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
15a30 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e  Rowid = pOther->
15a40 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
15a50 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b    pNew = pOther;
15a60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
15a70 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77  f( (pOther->iRow
15a80 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63  id>pIter->iSwitc
15a90 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  hRowid)==pIter->
15aa0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
15ab0 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
15ac0 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e  Rowid = pOther->
15ad0 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
15ae0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15af0 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28  pRes->iFirst = (
15b00 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49 74 65  u16)(pNew - pIte
15b10 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 20 20  r->aSeg);.      
15b20 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b  if( i==1 ) break
15b30 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20  ;..      pOther 
15b40 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
15b50 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20  pIter->aFirst[i 
15b60 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74  ^ 0x0001].iFirst
15b70 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   ];.    }.  }.. 
15b80 20 2a 70 70 46 69 72 73 74 20 3d 20 70 4e 65 77   *ppFirst = pNew
15b90 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
15ba0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
15bb0 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61  Iter->bEof varia
15bc0 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ble based on the
15bd0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73 75   state of the su
15be0 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a  b-iterators..*/.
15bf0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
15c00 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28  MultiIterSetEof(
15c10 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
15c20 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
15c30 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
15c40 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
15c50 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
15c60 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62  .  pIter->base.b
15c70 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61  Eof = pSeg->pLea
15c80 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69  f==0;.  pIter->i
15c90 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53  SwitchRowid = pS
15ca0 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  eg->iRowid;.}../
15cb0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
15cc0 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
15cd0 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
15ce0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
15cf0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
15d00 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
15d10 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69  s5Index.rc. It i
15d20 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  s not .** consid
15d30 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
15d40 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
15d50 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66  aches EOF, or if
15d60 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
15d70 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74  t .** EOF when t
15d80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15d90 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
15da0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
15db0 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35  IterNext(.  Fts5
15dc0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
15dd0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  5Iter *pIter,.  
15de0 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20  int bFrom,      
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d  /* True if argum
15e10 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c  ent iFrom is val
15e20 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f  id */.  i64 iFro
15e30 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
15e40 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e          /* Advan
15e50 63 65 20 61 74 20 6c 65 61 73 74 20 61 73 20 66  ce at least as f
15e60 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b  ar as this */.){
15e70 0a 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20  .  int bUseFrom 
15e80 3d 20 62 46 72 6f 6d 3b 0a 20 20 61 73 73 65 72  = bFrom;.  asser
15e90 74 28 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62  t( pIter->base.b
15ea0 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 77 68 69 6c  Eof==0 );.  whil
15eb0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
15ec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
15ed0 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61  First = pIter->a
15ee0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b  First[1].iFirst;
15ef0 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72  .    int bNewTer
15f00 6d 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 53  m = 0;.    Fts5S
15f10 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
15f20 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72  pIter->aSeg[iFir
15f30 73 74 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  st];.    assert(
15f40 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15f50 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 62 55 73  K );.    if( bUs
15f60 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70  eFrom && pSeg->p
15f70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 66  Dlidx ){.      f
15f80 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72  ts5SegIterNextFr
15f90 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f  om(p, pSeg, iFro
15fa0 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
15fb0 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74       pSeg->xNext
15fc0 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54  (p, pSeg, &bNewT
15fd0 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  erm);.    }..   
15fe0 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
15ff0 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20  ==0 || bNewTerm 
16000 0a 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c  .     || fts5Mul
16010 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77  tiIterAdvanceRow
16020 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73 74  id(pIter, iFirst
16030 2c 20 26 70 53 65 67 29 0a 20 20 20 20 29 7b 0a  , &pSeg).    ){.
16040 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
16050 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
16060 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29  Iter, iFirst, 1)
16070 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
16080 69 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65  iIterSetEof(pIte
16090 72 29 3b 0a 20 20 20 20 20 20 70 53 65 67 20 3d  r);.      pSeg =
160a0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49   &pIter->aSeg[pI
160b0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
160c0 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 66  First];.      if
160d0 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
160e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d   ) return;.    }
160f0 0a 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74  ..    fts5Assert
16100 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70  MultiIterSetup(p
16110 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73  , pIter);.    as
16120 73 65 72 74 28 20 70 53 65 67 3d 3d 26 70 49 74  sert( pSeg==&pIt
16130 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
16140 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
16150 5d 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66  ] && pSeg->pLeaf
16160 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65   );.    if( pIte
16170 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 3d 3d 30  r->bSkipEmpty==0
16180 20 7c 7c 20 70 53 65 67 2d 3e 6e 50 6f 73 20 29   || pSeg->nPos )
16190 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78  {.      pIter->x
161a0 53 65 74 4f 75 74 70 75 74 73 28 70 49 74 65 72  SetOutputs(pIter
161b0 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 72  , pSeg);.      r
161c0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
161d0 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20   bUseFrom = 0;. 
161e0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
161f0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
16200 65 78 74 32 28 0a 20 20 46 74 73 35 49 6e 64 65  ext2(.  Fts5Inde
16210 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65  x *p, .  Fts5Ite
16220 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
16230 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20  *pbNewTerm      
16240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16250 55 54 3a 20 54 72 75 65 20 69 66 20 2a 6d 69 67  UT: True if *mig
16260 68 74 2a 20 62 65 20 6e 65 77 20 74 65 72 6d 20  ht* be new term 
16270 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
16280 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74  pIter->bSkipEmpt
16290 79 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  y );.  if( p->rc
162a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
162b0 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
162c0 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  0;.    do{.     
162d0 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49   int iFirst = pI
162e0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
162f0 46 69 72 73 74 3b 0a 20 20 20 20 20 20 46 74 73  First;.      Fts
16300 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
16310 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46   &pIter->aSeg[iF
16320 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 6e 74  irst];.      int
16330 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 0a   bNewTerm = 0;..
16340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
16350 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
16360 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e  ;.      pSeg->xN
16370 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e  ext(p, pSeg, &bN
16380 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69  ewTerm);.      i
16390 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d  f( pSeg->pLeaf==
163a0 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20  0 || bNewTerm . 
163b0 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c        || fts5Mul
163c0 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77  tiIterAdvanceRow
163d0 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73 74  id(pIter, iFirst
163e0 2c 20 26 70 53 65 67 29 0a 20 20 20 20 20 20 29  , &pSeg).      )
163f0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
16400 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
16410 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
16420 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  , 1);.        ft
16430 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
16440 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  f(pIter);.      
16450 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31    *pbNewTerm = 1
16460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16470 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
16480 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65  terSetup(p, pIte
16490 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65 28  r);..    }while(
164a0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
164b0 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20  Empty(p, pIter) 
164c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
164d0 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
164e0 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28 46 74  tOutputs_Noop(Ft
164f0 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64 31  s5Iter *pUnused1
16500 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
16510 55 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  Unused2){.  UNUS
16520 45 44 5f 50 41 52 41 4d 32 28 70 55 6e 75 73 65  ED_PARAM2(pUnuse
16530 64 31 2c 20 70 55 6e 75 73 65 64 32 29 3b 0a 7d  d1, pUnused2);.}
16540 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49 74 65  ..static Fts5Ite
16550 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r *fts5MultiIter
16560 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e 64  Alloc(.  Fts5Ind
16570 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
16580 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
16590 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
165a0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
165b0 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46 74  int nSeg.){.  Ft
165c0 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20  s5Iter *pNew;.  
165d0 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20  /* Power of two 
16600 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f  >= nSeg */..  fo
16610 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74  r(nSlot=2; nSlot
16620 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c  <nSeg; nSlot=nSl
16630 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ot*2);.  pNew = 
16640 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
16650 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46   .      sizeof(F
16660 74 73 35 49 74 65 72 29 20 2b 20 20 20 20 20 20  ts5Iter) +      
16670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
16680 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  New */.      siz
16690 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29  eof(Fts5SegIter)
166a0 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20   * (nSlot-1) +  
166b0 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d   /* pNew->aSeg[]
166c0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
166d0 28 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20  (Fts5CResult) * 
166e0 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a  nSlot         /*
166f0 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20   pNew->aFirst[] 
16700 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  */.  );.  if( pN
16710 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew ){.    pNew->
16720 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20  nSeg = nSlot;.  
16730 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d    pNew->aFirst =
16740 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26   (Fts5CResult*)&
16750 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74  pNew->aSeg[nSlot
16760 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  ];.    pNew->pIn
16770 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 70 4e 65  dex = p;.    pNe
16780 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  w->xSetOutputs =
16790 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
167a0 75 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 20 20  uts_Noop;.  }.  
167b0 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
167c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
167d0 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28  PoslistCallback(
167e0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55  .  Fts5Index *pU
167f0 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a  nused, .  void *
16800 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e  pContext, .  con
16810 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
16820 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 55  nt nChunk.){.  U
16830 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75  NUSED_PARAM(pUnu
16840 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e  sed);.  assert_n
16850 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a  c( nChunk>=0 );.
16860 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29    if( nChunk>0 )
16870 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
16880 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 28  SafeAppendBlob((
16890 46 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e  Fts5Buffer*)pCon
168a0 74 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e 43  text, pChunk, nC
168b0 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79  hunk);.  }.}..ty
168c0 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73  pedef struct Pos
168d0 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
168e0 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
168f0 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69  tx;.struct Posli
16900 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a  stCallbackCtx {.
16910 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
16920 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
16930 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74    /* Append to t
16940 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  his buffer */.  
16950 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
16960 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
16970 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63  /* Restrict matc
16980 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75  hes to this colu
16990 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61  mn */.  int eSta
169a0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
169b0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61          /* See a
169c0 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65  bove */.};..type
169d0 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69  def struct Posli
169e0 73 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f 73  stOffsetsCtx Pos
169f0 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b 0a  listOffsetsCtx;.
16a00 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66  struct PoslistOf
16a10 66 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74 73  fsetsCtx {.  Fts
16a20 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20  5Buffer *pBuf;  
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a40 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62  Append to this b
16a50 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43  uffer */.  Fts5C
16a60 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
16a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16a80 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
16a90 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f  o this column */
16aa0 0a 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20  .  int iRead;.  
16ab0 69 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a  int iWrite;.};..
16ac0 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65  /*.** TODO: Make
16ad0 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69 63   this more effic
16ae0 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63 20  ient!.*/.static 
16af0 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  int fts5IndexCol
16b00 73 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c 73  setTest(Fts5Cols
16b10 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74  et *pColset, int
16b20 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b   iCol){.  int i;
16b30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
16b40 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  olset->nCol; i++
16b50 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  ){.    if( pCols
16b60 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43  et->aiCol[i]==iC
16b70 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ol ) return 1;. 
16b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
16b90 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16ba0 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73  s5PoslistOffsets
16bb0 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
16bc0 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20  Index *pUnused, 
16bd0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
16be0 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  t, .  const u8 *
16bf0 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75  pChunk, int nChu
16c00 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 4f  nk.){.  PoslistO
16c10 66 66 73 65 74 73 43 74 78 20 2a 70 43 74 78 20  ffsetsCtx *pCtx 
16c20 3d 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  = (PoslistOffset
16c30 73 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  sCtx*)pContext;.
16c40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
16c50 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72  Unused);.  asser
16c60 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20  t_nc( nChunk>=0 
16c70 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e  );.  if( nChunk>
16c80 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  0 ){.    int i =
16c90 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   0;.    while( i
16ca0 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20  <nChunk ){.     
16cb0 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20   int iVal;.     
16cc0 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
16cd0 69 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69 5d  int32(&pChunk[i]
16ce0 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  , iVal);.      i
16cf0 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52 65  Val += pCtx->iRe
16d00 61 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70 43  ad - 2;.      pC
16d10 74 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61 6c  tx->iRead = iVal
16d20 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  ;.      if( fts5
16d30 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
16d40 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69  pCtx->pColset, i
16d50 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
16d60 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
16d70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d  pendVarint(pCtx-
16d80 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32 20  >pBuf, iVal + 2 
16d90 2d 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29 3b  - pCtx->iWrite);
16da0 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69  .        pCtx->i
16db0 57 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20 20  Write = iVal;.  
16dc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16dd0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
16de0 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72  ts5PoslistFilter
16df0 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
16e00 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 0a  Index *pUnused,.
16e10 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
16e20 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
16e30 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
16e40 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43 61  k.){.  PoslistCa
16e50 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78 20  llbackCtx *pCtx 
16e60 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  = (PoslistCallba
16e70 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b  ckCtx*)pContext;
16e80 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
16e90 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65  pUnused);.  asse
16ea0 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30  rt_nc( nChunk>=0
16eb0 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b   );.  if( nChunk
16ec0 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61  >0 ){.    /* Sea
16ed0 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20 66  rch through to f
16ee0 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 76 61  ind the first va
16ef0 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65 20  rint with value 
16f00 31 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a 20  1. This is the. 
16f10 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
16f20 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73 20  he next columns 
16f30 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  hits. */.    int
16f40 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20   i = 0;.    int 
16f50 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20 20  iStart = 0;..   
16f60 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74   if( pCtx->eStat
16f70 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 6e  e==2 ){.      in
16f80 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66 74  t iCol;.      ft
16f90 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
16fa0 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f  2(pChunk, i, iCo
16fb0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  l);.      if( ft
16fc0 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
16fd0 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c  t(pCtx->pColset,
16fe0 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20   iCol) ){.      
16ff0 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
17000 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35   1;.        fts5
17010 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
17020 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75  Varint(pCtx->pBu
17030 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  f, 1);.      }el
17040 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78  se{.        pCtx
17050 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20  ->eState = 0;.  
17060 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
17070 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69 6c   do {.      whil
17080 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20 70  e( i<nChunk && p
17090 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20 29  Chunk[i]!=0x01 )
170a0 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
170b0 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78 38   pChunk[i] & 0x8
170c0 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  0 ) i++;.       
170d0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i++;.      }.  
170e0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53      if( pCtx->eS
170f0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tate ){.        
17100 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
17110 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70  pendBlob(pCtx->p
17120 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74  Buf, &pChunk[iSt
17130 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b  art], i-iStart);
17140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17150 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20  f( i<nChunk ){. 
17160 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b         int iCol;
17170 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
17180 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  = i;.        i++
17190 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  ;.        if( i>
171a0 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20  =nChunk ){.     
171b0 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74       pCtx->eStat
171c0 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  e = 2;.        }
171d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
171e0 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
171f0 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69  t32(pChunk, i, i
17200 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Col);.          
17210 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 66  pCtx->eState = f
17220 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
17230 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74  st(pCtx->pColset
17240 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , iCol);.       
17250 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
17260 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ate ){.         
17270 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
17280 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78  eAppendBlob(pCtx
17290 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b  ->pBuf, &pChunk[
172a0 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72  iStart], i-iStar
172b0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
172c0 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20  iStart = i;.    
172d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
172e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
172f0 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29  hile( i<nChunk )
17300 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
17310 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74  void fts5ChunkIt
17320 65 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64  erate(.  Fts5Ind
17330 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
17340 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17350 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
17360 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c  s5SegIter *pSeg,
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17380 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73   Poslist of this
17390 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76   iterator */.  v
173a0 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20  oid *pCtx,      
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
173c0 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65  * Context pointe
173d0 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c  r for xChunk cal
173e0 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20  lback */.  void 
173f0 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e  (*xChunk)(Fts5In
17400 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e  dex*, void*, con
17410 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a  st u8*, int).){.
17420 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65    int nRem = pSe
17430 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  g->nPos;        
17440 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
17450 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f  ytes still to co
17460 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  me */.  Fts5Data
17470 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75   *pData = 0;.  u
17480 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65  8 *pChunk = &pSe
17490 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67  g->pLeaf->p[pSeg
174a0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
174b0 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d    int nChunk = M
174c0 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70  IN(nRem, pSeg->p
174d0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70  Leaf->szLeaf - p
174e0 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
174f0 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  );.  int pgno = 
17500 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  pSeg->iLeafPgno;
17510 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20  .  int pgnoSave 
17520 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
17530 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
17540 74 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74 61  tmwork with deta
17550 69 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73 65  il=none database
17560 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
17570 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
17580 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail!=FTS5_DETAIL
17590 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20  _NONE );..  if( 
175a0 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46  (pSeg->flags & F
175b0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
175c0 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  RSE)==0 ){.    p
175d0 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31  gnoSave = pgno+1
175e0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
175f0 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28  1 ){.    xChunk(
17600 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c  p, pCtx, pChunk,
17610 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52   nChunk);.    nR
17620 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20  em -= nChunk;.  
17630 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
17640 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66  e(pData);.    if
17650 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20  ( nRem<=0 ){.   
17660 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
17670 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b  lse{.      pgno+
17680 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d  +;.      pData =
17690 20 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c   fts5LeafRead(p,
176a0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
176b0 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e  WID(pSeg->pSeg->
176c0 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b 0a  iSegid, pgno));.
176d0 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d        if( pData=
176e0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
176f0 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74    pChunk = &pDat
17700 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e  a->p[4];.      n
17710 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d  Chunk = MIN(nRem
17720 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  , pData->szLeaf 
17730 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  - 4);.      if( 
17740 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29  pgno==pgnoSave )
17750 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17760 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61  ( pSeg->pNextLea
17770 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  f==0 );.        
17780 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20  pSeg->pNextLeaf 
17790 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20  = pData;.       
177a0 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   pData = 0;.    
177b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
177c0 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
177d0 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
177e0 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
177f0 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46  d entry (not EOF
17800 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
17810 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20  ion appends the 
17820 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61  position list da
17830 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ta for the curre
17840 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62  nt entry to.** b
17850 75 66 66 65 72 20 70 42 75 66 2e 20 49 74 20 64  uffer pBuf. It d
17860 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63  oes not make a c
17870 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
17880 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a  ion-list size.**
17890 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   field..*/.stati
178a0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 69 74  c void fts5Segit
178b0 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
178c0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
178d0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a  5SegIter *pSeg,.
178e0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
178f0 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66  olset,.  Fts5Buf
17900 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69  fer *pBuf.){.  i
17910 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72  f( 0==fts5Buffer
17920 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75  Grow(&p->rc, pBu
17930 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29  f, pSeg->nPos) )
17940 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  {.    if( pColse
17950 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  t==0 ){.      ft
17960 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
17970 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70  , pSeg, (void*)p
17980 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74  Buf, fts5Poslist
17990 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d  Callback);.    }
179a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
179b0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
179c0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
179d0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  _FULL ){.       
179e0 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
179f0 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20  Ctx sCtx;.      
17a00 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42    sCtx.pBuf = pB
17a10 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78  uf;.        sCtx
17a20 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73  .pColset = pCols
17a30 65 74 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78  et;.        sCtx
17a40 2e 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e  .eState = fts5In
17a50 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43  dexColsetTest(pC
17a60 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  olset, 0);.     
17a70 20 20 20 61 73 73 65 72 74 28 20 73 43 74 78 2e     assert( sCtx.
17a80 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74  eState==0 || sCt
17a90 78 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20  x.eState==1 );. 
17aa0 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b         fts5Chunk
17ab0 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c  Iterate(p, pSeg,
17ac0 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66   (void*)&sCtx, f
17ad0 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72  ts5PoslistFilter
17ae0 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Callback);.     
17af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17b00 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74  PoslistOffsetsCt
17b10 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20  x sCtx;.        
17b20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c  memset(&sCtx, 0,
17b30 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a   sizeof(sCtx));.
17b40 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 42 75          sCtx.pBu
17b50 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20  f = pBuf;.      
17b60 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d    sCtx.pColset =
17b70 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20   pColset;.      
17b80 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61    fts5ChunkItera
17b90 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69  te(p, pSeg, (voi
17ba0 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f  d*)&sCtx, fts5Po
17bb0 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c  slistOffsetsCall
17bc0 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  back);.      }. 
17bd0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
17be0 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74  * IN/OUT paramet
17bf0 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73 20  er (*pa) points 
17c00 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69  to a position li
17c10 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73 69  st n bytes in si
17c20 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f  ze. If.** the po
17c30 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
17c40 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
17c50 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68   column iCol, th
17c60 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74 0a  en (*pa) is set.
17c70 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ** to point to t
17c80 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d  he sub-position-
17c90 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20 63 6f  list for that co
17ca0 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d  lumn and the num
17cb0 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20  ber of.** bytes 
17cc0 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e 20  in it returned. 
17cd0 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d  Or, if the argum
17ce0 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ent position lis
17cf0 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f  t does not.** co
17d00 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69 65  ntain any entrie
17d10 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f  s for column iCo
17d20 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  l, return 0..*/.
17d30 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
17d40 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 0a  ndexExtractCol(.
17d50 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c    const u8 **pa,
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d70 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69    /* IN/OUT: Poi
17d80 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74 20  nter to poslist 
17d90 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  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 2f 2a 20 49 4e 3a 20 53 69 7a 65       /* IN: Size
17dc0 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62   of poslist in b
17dd0 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ytes */.  int iC
17de0 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ol              
17df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
17e00 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 66  umn to extract f
17e10 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29  rom poslist */.)
17e20 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  {.  int iCurrent
17e30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
17e40 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20      /* Anything 
17e50 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
17e60 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20 2a   0x01 is col 0 *
17e70 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 20  /.  const u8 *p 
17e80 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75  = *pa;.  const u
17e90 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b  8 *pEnd = &p[n];
17ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
17eb0 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
17ec0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
17ed0 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f 6c  /..  while( iCol
17ee0 3e 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20  >iCurrent ){.   
17ef0 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e   /* Advance poin
17f00 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70  ter p until it p
17f10 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72  oints to pEnd or
17f20 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68   an 0x01 byte th
17f30 61 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  at is.    ** not
17f40 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e   part of a varin
17f50 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  t. Note that it 
17f60 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
17f70 66 6f 72 20 61 20 6e 65 67 61 74 69 76 65 0a 20  for a negative. 
17f80 20 20 20 2a 2a 20 6f 72 20 65 78 74 72 65 6d 65     ** or extreme
17f90 6c 79 20 6c 61 72 67 65 20 76 61 72 69 6e 74 20  ly large varint 
17fa0 74 6f 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20  to occur within 
17fb0 61 6e 20 75 6e 63 6f 72 72 75 70 74 65 64 20 70  an uncorrupted p
17fc0 6f 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  osition .    ** 
17fd0 6c 69 73 74 2e 20 53 6f 20 74 68 65 20 6c 61 73  list. So the las
17fe0 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 76  t byte of each v
17ff0 61 72 69 6e 74 20 6d 61 79 20 62 65 20 61 73 73  arint may be ass
18000 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 20 63  umed to have a c
18010 6c 65 61 72 0a 20 20 20 20 2a 2a 20 30 78 38 30  lear.    ** 0x80
18020 20 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68   bit.  */.    wh
18030 69 6c 65 28 20 2a 70 21 3d 30 78 30 31 20 29 7b  ile( *p!=0x01 ){
18040 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70  .      while( *p
18050 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 20  ++ & 0x80 );.   
18060 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29     if( p>=pEnd )
18070 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
18080 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a  .    *pa = p++;.
18090 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 2a      iCurrent = *
180a0 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 75  p++;.    if( iCu
180b0 72 72 65 6e 74 20 26 20 30 78 38 30 20 29 7b 0a  rrent & 0x80 ){.
180c0 20 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20 20 20        p--;.     
180d0 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   p += fts5GetVar
180e0 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e  int32(p, iCurren
180f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
18100 69 66 28 20 69 43 6f 6c 21 3d 69 43 75 72 72 65  if( iCol!=iCurre
18110 6e 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  nt ) return 0;..
18120 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69    /* Advance poi
18130 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20  nter p until it 
18140 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f  points to pEnd o
18150 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74  r an 0x01 byte t
18160 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  hat is.  ** not 
18170 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74  part of a varint
18180 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 3c 70   */.  while( p<p
18190 45 6e 64 20 26 26 20 2a 70 21 3d 30 78 30 31 20  End && *p!=0x01 
181a0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70  ){.    while( *p
181b0 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 7d  ++ & 0x80 );.  }
181c0 0a 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20 28  ..  return p - (
181d0 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  *pa);.}..static 
181e0 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 45 78  void fts5IndexEx
181f0 74 72 61 63 74 43 6f 6c 73 65 74 28 0a 20 20 69  tractColset(.  i
18200 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73 35 43  nt *pRc,.  Fts5C
18210 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
18220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
18230 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72 20 6f  lset to filter o
18240 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
18250 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f 73 2c  *pPos, int nPos,
18260 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
18270 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73  on list */.  Fts
18280 35 42 75 66 66 65 72 20 2a 70 42 75 66 20 20 20  5Buffer *pBuf   
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
182a0 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
182b0 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  .){.  if( *pRc==
182c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
182d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 74 73 35   int i;.    fts5
182e0 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29  BufferZero(pBuf)
182f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
18300 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20  <pColset->nCol; 
18310 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
18320 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70 50 6f  t u8 *pSub = pPo
18330 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 75  s;.      int nSu
18340 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74  b = fts5IndexExt
18350 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e  ractCol(&pSub, n
18360 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69  Pos, pColset->ai
18370 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  Col[i]);.      i
18380 66 28 20 6e 53 75 62 20 29 7b 0a 20 20 20 20 20  f( nSub ){.     
18390 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
183a0 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70 42 75  endBlob(pRc, pBu
183b0 66 2c 20 6e 53 75 62 2c 20 70 53 75 62 29 3b 0a  f, nSub, pSub);.
183c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
183d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f  }.}../*.** xSetO
183e0 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20  utputs callback 
183f0 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 6e  used by detail=n
18400 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  one tables..*/.s
18410 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
18420 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
18430 6e 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  ne(Fts5Iter *pIt
18440 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  er, Fts5SegIter 
18450 2a 70 53 65 67 29 7b 0a 20 20 61 73 73 65 72 74  *pSeg){.  assert
18460 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
18470 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
18480 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
18490 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ONE );.  pIter->
184a0 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53  base.iRowid = pS
184b0 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49  eg->iRowid;.  pI
184c0 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
184d0 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 7d 0a  = pSeg->nPos;.}.
184e0 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75  ./*.** xSetOutpu
184f0 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  ts callback used
18500 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20   by detail=full 
18510 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c 20 74  and detail=col t
18520 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a 2a 2a  ables when no.**
18530 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 73 20   column filters 
18540 61 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  are specified..*
18550 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18560 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18570 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35 49 74  _Nocolset(Fts5It
18580 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53  er *pIter, Fts5S
18590 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20  egIter *pSeg){. 
185a0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f   pIter->base.iRo
185b0 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
185c0 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  id;.  pIter->bas
185d0 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d 3e  e.nData = pSeg->
185e0 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72 74 28  nPos;..  assert(
185f0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
18600 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
18610 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  !=FTS5_DETAIL_NO
18620 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
18630 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d  pIter->pColset==
18640 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67  0 );..  if( pSeg
18650 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53  ->iLeafOffset+pS
18660 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e  eg->nPos<=pSeg->
18670 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
18680 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61  .    /* All data
18690 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68   is stored on th
186a0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
186b0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74  Populate the out
186c0 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69  put .    ** vari
186d0 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69  ables to point i
186e0 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
186f0 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e  the page object.
18700 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 62   */.    pIter->b
18710 61 73 65 2e 70 44 61 74 61 20 3d 20 26 70 53 65  ase.pData = &pSe
18720 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67  g->pLeaf->p[pSeg
18730 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
18740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18750 54 68 65 20 64 61 74 61 20 69 73 20 64 69 73 74  The data is dist
18760 72 69 62 75 74 65 64 20 6f 76 65 72 20 74 77 6f  ributed over two
18770 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e 20   or more pages. 
18780 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68 65  Copy it into the
18790 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65 72  .    ** Fts5Iter
187a0 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20  .poslist buffer 
187b0 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68 65  and then set the
187c0 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20   output pointer 
187d0 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20  to point.    ** 
187e0 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e 20  to this buffer. 
187f0 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66   */.    fts5Buff
18800 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
18810 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73  oslist);.    fts
18820 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
18830 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
18840 53 65 67 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e  Seg, 0, &pIter->
18850 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49  poslist);.    pI
18860 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20  ter->base.pData 
18870 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
18880 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  .p;.  }.}../*.**
18890 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c   xSetOutputs cal
188a0 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e 20  lback used when 
188b0 74 68 65 20 46 74 73 35 43 6f 6c 73 65 74 20 6f  the Fts5Colset o
188c0 62 6a 65 63 74 20 68 61 73 20 6e 43 6f 6c 3d 3d  bject has nCol==
188d0 30 20 28 6d 61 74 63 68 0a 2a 2a 20 61 67 61 69  0 (match.** agai
188e0 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 61  nst no columns a
188f0 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  t all)..*/.stati
18900 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
18910 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f 43 6f  etOutputs_ZeroCo
18920 6c 73 65 74 28 46 74 73 35 49 74 65 72 20 2a 70  lset(Fts5Iter *p
18930 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
18940 72 20 2a 70 53 65 67 29 7b 0a 20 20 55 4e 55 53  r *pSeg){.  UNUS
18950 45 44 5f 50 41 52 41 4d 28 70 53 65 67 29 3b 0a  ED_PARAM(pSeg);.
18960 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
18970 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ata = 0;.}../*.*
18980 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61  * xSetOutputs ca
18990 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 64  llback used by d
189a0 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65 6e 20 74  etail=col when t
189b0 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  here is a column
189c0 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e 64 20 74   filter.** and t
189d0 68 65 72 65 20 61 72 65 20 31 30 30 20 6f 72 20  here are 100 or 
189e0 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 41 6c  more columns. Al
189f0 73 6f 20 63 61 6c 6c 65 64 20 61 73 20 61 20 66  so called as a f
18a00 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a 2a 20  allback from.** 
18a10 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
18a20 74 73 5f 43 6f 6c 31 30 30 20 69 66 20 74 68 65  ts_Col100 if the
18a30 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73 70 61   column-list spa
18a40 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ns more than one
18a50 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
18a60 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
18a70 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 46 74 73  tOutputs_Col(Fts
18a80 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
18a90 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
18aa0 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  {.  fts5BufferZe
18ab0 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
18ac0 73 74 29 3b 0a 20 20 66 74 73 35 53 65 67 69 74  st);.  fts5Segit
18ad0 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d  erPoslist(pIter-
18ae0 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70  >pIndex, pSeg, p
18af0 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2c 20 26  Iter->pColset, &
18b00 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
18b10 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69  .  pIter->base.i
18b20 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
18b30 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62  owid;.  pIter->b
18b40 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
18b50 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18b60 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
18b70 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
18b80 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  st.n;.}../*.** x
18b90 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
18ba0 61 63 6b 20 75 73 65 64 20 77 68 65 6e 3a 20 0a  ack used when: .
18bb0 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74 61 69 6c  **.**   * detail
18bc0 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  =col,.**   * the
18bd0 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66  re is a column f
18be0 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a 20 20 20  ilter, and.**   
18bf0 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * the table cont
18c00 61 69 6e 73 20 31 30 30 20 6f 72 20 66 65 77 65  ains 100 or fewe
18c10 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a 0a 2a  r columns. .**.*
18c20 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69 6e 74  * The last point
18c30 20 69 73 20 74 6f 20 65 6e 73 75 72 65 20 61 6c   is to ensure al
18c40 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  l column numbers
18c50 20 61 72 65 20 73 74 6f 72 65 64 20 61 73 20 0a   are stored as .
18c60 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 76  ** single-byte v
18c70 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  arints..*/.stati
18c80 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
18c90 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30  etOutputs_Col100
18ca0 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
18cb0 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
18cc0 53 65 67 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  Seg){..  assert(
18cd0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
18ce0 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
18cf0 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f  ==FTS5_DETAIL_CO
18d00 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73 73 65 72  LUMNS );.  asser
18d10 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65  t( pIter->pColse
18d20 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67  t );..  if( pSeg
18d30 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53  ->iLeafOffset+pS
18d40 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d 3e 70  eg->nPos>pSeg->p
18d50 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
18d60 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f      fts5IterSetO
18d70 75 74 70 75 74 73 5f 43 6f 6c 28 70 49 74 65 72  utputs_Col(pIter
18d80 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65 6c 73 65  , pSeg);.  }else
18d90 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 28 75  {.    u8 *a = (u
18da0 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d  8*)&pSeg->pLeaf-
18db0 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
18dc0 66 73 65 74 5d 3b 0a 20 20 20 20 75 38 20 2a 70  fset];.    u8 *p
18dd0 45 6e 64 20 3d 20 28 75 38 2a 29 26 61 5b 70 53  End = (u8*)&a[pS
18de0 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20 20 20  eg->nPos]; .    
18df0 69 6e 74 20 69 50 72 65 76 20 3d 20 30 3b 0a 20  int iPrev = 0;. 
18e00 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20     int *aiCol = 
18e10 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e  pIter->pColset->
18e20 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 2a  aiCol;.    int *
18e30 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61 69 43 6f  aiColEnd = &aiCo
18e40 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  l[pIter->pColset
18e50 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20 75 38  ->nCol];..    u8
18e60 20 2a 61 4f 75 74 20 3d 20 70 49 74 65 72 2d 3e   *aOut = pIter->
18e70 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 69  poslist.p;.    i
18e80 6e 74 20 69 50 72 65 76 4f 75 74 20 3d 20 30 3b  nt iPrevOut = 0;
18e90 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ..    pIter->bas
18ea0 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  e.iRowid = pSeg-
18eb0 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 77 68  >iRowid;..    wh
18ec0 69 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b 0a 20  ile( a<pEnd ){. 
18ed0 20 20 20 20 20 69 50 72 65 76 20 2b 3d 20 28 69       iPrev += (i
18ee0 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b 0a 20  nt)a++[0] - 2;. 
18ef0 20 20 20 20 20 77 68 69 6c 65 28 20 2a 61 69 43       while( *aiC
18f00 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20 20 20 20  ol<iPrev ){.    
18f10 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20 20 20      aiCol++;.   
18f20 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c 3d 3d       if( aiCol==
18f30 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f 74 6f 20  aiColEnd ) goto 
18f40 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f  setoutputs_col_o
18f50 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
18f60 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d 3d 69 50    if( *aiCol==iP
18f70 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  rev ){.        *
18f80 61 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28 28 69  aOut++ = (u8)((i
18f90 50 72 65 76 20 2d 20 69 50 72 65 76 4f 75 74 29  Prev - iPrevOut)
18fa0 20 2b 20 32 29 3b 0a 20 20 20 20 20 20 20 20 69   + 2);.        i
18fb0 50 72 65 76 4f 75 74 20 3d 20 69 50 72 65 76 3b  PrevOut = iPrev;
18fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
18fd0 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f  setoutputs_col_o
18fe0 75 74 3a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  ut:.    pIter->b
18ff0 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
19000 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
19010 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
19020 61 74 61 20 3d 20 61 4f 75 74 20 2d 20 70 49 74  ata = aOut - pIt
19030 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
19040 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74   }.}../*.** xSet
19050 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b  Outputs callback
19060 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d   used by detail=
19070 66 75 6c 6c 20 77 68 65 6e 20 74 68 65 72 65 20  full when there 
19080 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74  is a column filt
19090 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
190a0 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
190b0 74 70 75 74 73 5f 46 75 6c 6c 28 46 74 73 35 49  tputs_Full(Fts5I
190c0 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
190d0 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
190e0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
190f0 6f 6c 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 70  olset = pIter->p
19100 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65 72 2d  Colset;.  pIter-
19110 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
19120 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20  Seg->iRowid;..  
19130 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
19140 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Index->pConfig->
19150 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
19160 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20 20 61  TAIL_FULL );.  a
19170 73 73 65 72 74 28 20 70 43 6f 6c 73 65 74 20 29  ssert( pColset )
19180 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69  ;..  if( pSeg->i
19190 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d  LeafOffset+pSeg-
191a0 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65  >nPos<=pSeg->pLe
191b0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
191c0 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20 69 73    /* All data is
191d0 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63   stored on the c
191e0 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50 6f 70  urrent page. Pop
191f0 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75 74  ulate the output
19200 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c   .    ** variabl
19210 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f  es to point into
19220 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
19230 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f   page object. */
19240 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  .    const u8 *a
19250 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
19260 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
19270 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28 20 70  fset];.    if( p
19280 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20  Colset->nCol==1 
19290 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
192a0 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 66 74 73  base.nData = fts
192b0 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
192c0 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c  (&a, pSeg->nPos,
192d0 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30  pColset->aiCol[0
192e0 5d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  ]);.      pIter-
192f0 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 61 3b  >base.pData = a;
19300 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19310 20 20 69 6e 74 20 2a 70 52 63 20 3d 20 26 70 49    int *pRc = &pI
19320 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3b  ter->pIndex->rc;
19330 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
19340 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
19350 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74  slist);.      ft
19360 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
19370 6c 73 65 74 28 70 52 63 2c 20 70 43 6f 6c 73 65  lset(pRc, pColse
19380 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  t, a, pSeg->nPos
19390 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
193a0 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  t);.      pIter-
193b0 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
193c0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
193d0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73        pIter->bas
193e0 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.nData = pIter-
193f0 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20  >poslist.n;.    
19400 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
19410 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69  * The data is di
19420 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74  stributed over t
19430 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  wo or more pages
19440 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74  . Copy it into t
19450 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74  he.    ** Fts5It
19460 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65  er.poslist buffe
19470 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74  r and then set t
19480 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65  he output pointe
19490 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a  r to point.    *
194a0 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  * to this buffer
194b0 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  .  */.    fts5Bu
194c0 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
194d0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
194e0 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
194f0 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
19500 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20   pSeg, pColset, 
19510 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
19520 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ;.    pIter->bas
19530 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.pData = pIter-
19540 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20  >poslist.p;.    
19550 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
19560 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
19570 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  st.n;.  }.}..sta
19580 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
19590 72 53 65 74 4f 75 74 70 75 74 43 62 28 69 6e 74  rSetOutputCb(int
195a0 20 2a 70 52 63 2c 20 46 74 73 35 49 74 65 72 20   *pRc, Fts5Iter 
195b0 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 2a  *pIter){.  if( *
195c0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
195d0 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
195e0 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 49 74 65   *pConfig = pIte
195f0 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66  r->pIndex->pConf
19600 69 67 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ig;.    if( pCon
19610 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
19620 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
19630 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78  {.      pIter->x
19640 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
19650 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
19660 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  None;.    }..   
19670 20 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d   else if( pIter-
19680 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20  >pColset==0 ){. 
19690 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
196a0 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
196b0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 63  erSetOutputs_Noc
196c0 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  olset;.    }..  
196d0 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65 72    else if( pIter
196e0 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d  ->pColset->nCol=
196f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  =0 ){.      pIte
19700 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
19710 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
19720 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74 3b 0a  uts_ZeroColset;.
19730 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20      }..    else 
19740 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65  if( pConfig->eDe
19750 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
19760 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  L_FULL ){.      
19770 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75  pIter->xSetOutpu
19780 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74  ts = fts5IterSet
19790 4f 75 74 70 75 74 73 5f 46 75 6c 6c 3b 0a 20 20  Outputs_Full;.  
197a0 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 7b 0a 20    }..    else{. 
197b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
197c0 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
197d0 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d  TS5_DETAIL_COLUM
197e0 4e 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NS );.      if( 
197f0 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31  pConfig->nCol<=1
19800 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  00 ){.        pI
19810 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
19820 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
19830 74 70 75 74 73 5f 43 6f 6c 31 30 30 3b 0a 20 20  tputs_Col100;.  
19840 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
19850 35 42 75 66 66 65 72 53 69 7a 65 28 70 52 63 2c  5BufferSize(pRc,
19860 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
19870 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29  , pConfig->nCol)
19880 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19890 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53         pIter->xS
198a0 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
198b0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43  IterSetOutputs_C
198c0 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
198d0 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
198e0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46  Allocate a new F
198f0 74 73 35 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a  ts5Iter object..
19900 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62  **.** The new ob
19910 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65  ject will be use
19920 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
19930 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73 74 72  ough data in str
19940 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a  ucture pStruct..
19950 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20  ** If iLevel is 
19960 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61  -ve, then all da
19970 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e  ta in all segmen
19980 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72  ts is merged. Or
19990 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69  , if iLevel.** i
199a0 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65  s zero or greate
199b0 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  r, data from the
199c0 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20   first nSegment 
199d0 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
199e0 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d  l iLevel.** is m
199f0 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erged..**.** The
19a00 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61   iterator initia
19a10 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  lly points to th
19a20 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77  e first term/row
19a30 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  id entry in the 
19a40 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61 74  .** iterated dat
19a50 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
19a60 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
19a70 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ew(.  Fts5Index 
19a80 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19a90 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
19aa0 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
19ab0 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
19ac0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
19ad0 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  uct,         /* 
19ae0 53 74 72 75 63 74 75 72 65 20 6f 66 20 73 70 65  Structure of spe
19af0 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  cific index */. 
19b00 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f 51 55   /* FTS5INDEX_QU
19b30 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  ERY_XXX flags */
19b40 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
19b50 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
19b60 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20     /* Colset to 
19b70 66 69 6c 74 65 72 20 6f 6e 20 28 6f 72 20 4e 55  filter on (or NU
19b80 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  LL) */.  const u
19b90 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
19ba0 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
19bb0 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20   to seek to (or 
19bc0 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74  NULL/0) */.  int
19bd0 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19bf0 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65  Level to iterate
19c00 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f   (-1 for all) */
19c10 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c  .  int nSegment,
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19c40 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67  segments to merg
19c50 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f  e (iLevel>=0) */
19c60 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70  .  Fts5Iter **pp
19c70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
19c80 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
19c90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65   */.){.  int nSe
19ca0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
19cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19cc0 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74  er of segment-it
19cd0 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  ers in use */.  
19ce0 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20  int iIter = 0;  
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d00 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  /* */.  int iSeg
19d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19d20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
19d30 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
19d40 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
19d50 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
19d60 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73  vel *pLvl;.  Fts
19d70 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20  5Iter *pNew;..  
19d80 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d  assert( (pTerm==
19d90 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c  0 && nTerm==0) |
19da0 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20  | iLevel<0 );.. 
19db0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
19dc0 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d  ce for the new m
19dd0 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f  ulti-seg-iterato
19de0 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  r. */.  if( p->r
19df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19e00 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
19e10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19e20 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
19e30 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
19e40 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
19e50 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
19e60 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74    nSeg = pStruct
19e70 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  ->nSegment;.    
19e80 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48    nSeg += (p->pH
19e90 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ash ? 1 : 0);.  
19ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
19eb0 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63  Seg = MIN(pStruc
19ec0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
19ed0 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74  ].nSeg, nSegment
19ee0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
19ef0 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66  ppOut = pNew = f
19f00 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f  ts5MultiIterAllo
19f10 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66  c(p, nSeg);.  if
19f20 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
19f30 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76  rn;.  pNew->bRev
19f40 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20   = (0!=(flags & 
19f50 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
19f60 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  DESC));.  pNew->
19f70 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 28 30 21  bSkipEmpty = (0!
19f80 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  =(flags & FTS5IN
19f90 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d  DEX_QUERY_SKIPEM
19fa0 50 54 59 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  PTY));.  pNew->p
19fb0 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74  Colset = pColset
19fc0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
19fd0 65 52 65 66 28 70 53 74 72 75 63 74 29 3b 0a 20  eRef(pStruct);. 
19fe0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 46 54   if( (flags & FT
19ff0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
1a000 4f 55 54 50 55 54 29 3d 3d 30 20 29 7b 0a 20 20  OUTPUT)==0 ){.  
1a010 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
1a020 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 4e  putCb(&p->rc, pN
1a030 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ew);.  }..  /* I
1a040 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f  nitialize each o
1a050 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  f the component 
1a060 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
1a070 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  s. */.  if( p->r
1a080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a090 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
1a0a0 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74   ){.      Fts5St
1a0b0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45  ructureLevel *pE
1a0c0 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  nd = &pStruct->a
1a0d0 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
1a0e0 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 69 66  Level];.      if
1a0f0 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
1a100 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73        /* Add a s
1a110 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20  egment iterator 
1a120 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1a130 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1a140 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  hash table. */. 
1a150 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
1a160 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
1a170 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
1a180 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
1a190 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c  gIterHashInit(p,
1a1a0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
1a1b0 6c 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20  lags, pIter);.  
1a1c0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
1a1d0 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61  pLvl=&pStruct->a
1a1e0 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70  Level[0]; pLvl<p
1a1f0 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20  End; pLvl++){.  
1a200 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70        for(iSeg=p
1a210 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65  Lvl->nSeg-1; iSe
1a220 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
1a230 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
1a240 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1a250 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
1a260 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
1a270 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1a280 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
1a290 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
1a2a0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1a2b0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
1a2c0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
1a2d0 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70 49 74  nit(p, pSeg, pIt
1a2e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
1a2f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a300 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65    fts5SegIterSee
1a310 6b 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20  kInit(p, pTerm, 
1a320 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53  nTerm, flags, pS
1a330 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
1a340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a350 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
1a360 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 20  lse{.      pLvl 
1a370 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1a380 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  el[iLevel];.    
1a390 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d    for(iSeg=nSeg-
1a3a0 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67  1; iSeg>=0; iSeg
1a3b0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  --){.        fts
1a3c0 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
1a3d0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
1a3e0 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  ], &pNew->aSeg[i
1a3f0 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 20 20  Iter++]);.      
1a400 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1a410 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20  rt( iIter==nSeg 
1a420 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1a430 74 68 65 20 61 62 6f 76 65 20 77 61 73 20 73 75  the above was su
1a440 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63  ccessful, each c
1a450 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f  omponent iterato
1a460 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20  rs now points . 
1a470 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74   ** to the first
1a480 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65   entry in its se
1a490 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63  gment. In this c
1a4a0 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  ase initialize t
1a4b0 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b  he .  ** aFirst[
1a4c0 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20  ] array. Or, if 
1a4d0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1a4e0 75 72 72 65 64 2c 20 66 72 65 65 20 74 68 65 20  urred, free the 
1a4f0 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62  iterator.  ** ob
1a500 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74 68 65  ject and set the
1a510 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
1a520 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20   to NULL.  */.  
1a530 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a540 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28  E_OK ){.    for(
1a550 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67  iIter=pNew->nSeg
1a560 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74  -1; iIter>0; iIt
1a570 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74  er--){.      int
1a580 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20   iEq;.      if( 
1a590 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
1a5a0 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e  IterDoCompare(pN
1a5b0 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20  ew, iIter)) ){. 
1a5c0 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
1a5d0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77  er *pSeg = &pNew
1a5e0 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20  ->aSeg[iEq];.   
1a5f0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1a600 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 53 65 67  SQLITE_OK ) pSeg
1a610 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
1a620 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   0);.        fts
1a630 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
1a640 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c  ed(p, pNew, iEq,
1a650 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   iIter);.      }
1a660 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
1a670 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
1a680 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 41 73  New);.    fts5As
1a690 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
1a6a0 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  up(p, pNew);..  
1a6b0 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
1a6c0 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
1a6d0 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
1a6e0 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20  , pNew) ){.     
1a6f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
1a700 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
1a710 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1a720 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66   pNew->base.bEof
1a730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73  ==0 ){.      Fts
1a740 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
1a750 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 70 4e 65   &pNew->aSeg[pNe
1a760 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
1a770 72 73 74 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  rst];.      pNew
1a780 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 4e  ->xSetOutputs(pN
1a790 65 77 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 7d  ew, pSeg);.    }
1a7a0 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ..  }else{.    f
1a7b0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
1a7c0 28 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f  (pNew);.    *ppO
1a7d0 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ut = 0;.  }.}../
1a7e0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 46  *.** Create an F
1a7f0 74 73 35 49 74 65 72 20 74 68 61 74 20 69 74 65  ts5Iter that ite
1a800 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68  rates through th
1a810 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76 69 64  e doclist provid
1a820 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
1a830 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1a840 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a850 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 0a  5MultiIterNew2(.
1a860 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1a890 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
1a8a0 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  hin */.  Fts5Dat
1a8b0 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  a *pData,       
1a8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
1a8d0 69 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ist to iterate t
1a8e0 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20  hrough */.  int 
1a8f0 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20  bDesc,          
1a900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a910 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e 64 69  rue for descendi
1a920 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 20 2a  ng rowid order *
1a930 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70  /.  Fts5Iter **p
1a940 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  pOut            
1a950 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
1a960 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 74  t */.){.  Fts5It
1a970 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  er *pNew;.  pNew
1a980 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1a990 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69  Alloc(p, 2);.  i
1a9a0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46  f( pNew ){.    F
1a9b0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
1a9c0 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
1a9d0 31 5d 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e  1];..    pIter->
1a9e0 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 53 45 47  flags = FTS5_SEG
1a9f0 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20  ITER_ONETERM;.  
1aa00 20 20 69 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c    if( pData->szL
1aa10 65 61 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  eaf>0 ){.      p
1aa20 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44  Iter->pLeaf = pD
1aa30 61 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ata;.      pIter
1aa40 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
1aa50 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 44  fts5GetVarint(pD
1aa60 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  ata->p, (u64*)&p
1aa70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
1aa80 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
1aa90 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 44 61 74  ofDoclist = pDat
1aaa0 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65  a->nn;.      pNe
1aab0 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
1aac0 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  rst = 1;.      i
1aad0 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20  f( bDesc ){.    
1aae0 20 20 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d      pNew->bRev =
1aaf0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   1;.        pIte
1ab00 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
1ab10 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
1ab20 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
1ab30 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
1ab40 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
1ab50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ab60 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
1ab70 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
1ab80 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1ab90 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
1aba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
1abb0 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20  ew->base.bEof = 
1abc0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  1;.    }.    fts
1abd0 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
1abe0 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20  p, pIter);..    
1abf0 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20  *ppOut = pNew;. 
1ac00 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
1ac10 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a  lease(pData);.}.
1ac20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1ac30 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
1ac40 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20  or is at EOF or 
1ac50 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
1ac60 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61  occurred. .** Fa
1ac70 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
1ac80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1ac90 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74  5MultiIterEof(Ft
1aca0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1acb0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1acc0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 0a 20  assert( p->rc . 
1acd0 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e       || (pIter->
1ace0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
1acf0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
1ad00 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
1ad10 2d 3e 62 61 73 65 2e 62 45 6f 66 20 0a 20 20 29  ->base.bEof .  )
1ad20 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
1ad30 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62 61 73 65  c || pIter->base
1ad40 2e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .bEof);.}../*.**
1ad50 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69   Return the rowi
1ad60 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
1ad70 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
1ad80 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1ad90 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20  s.** to. If the 
1ada0 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
1adb0 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  to EOF when this
1adc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1add0 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  led the.** resul
1ade0 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
1adf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1ae00 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1ae10 69 64 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  id(Fts5Iter *pIt
1ae20 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
1ae30 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1ae40 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1ae50 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20  rst ].pLeaf );. 
1ae60 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
1ae70 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1ae80 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69  st[1].iFirst ].i
1ae90 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1aea0 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
1aeb0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1aec0 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77  try at or follow
1aed0 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73  ing iMatch..*/.s
1aee0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1aef0 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
1af00 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1af10 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  , .  Fts5Iter *p
1af20 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69 4d 61  Iter, .  i64 iMa
1af30 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20  tch.){.  while( 
1af40 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  1 ){.    i64 iRo
1af50 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  wid;.    fts5Mul
1af60 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
1af70 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b  ter, 1, iMatch);
1af80 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d 75 6c  .    if( fts5Mul
1af90 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
1afa0 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  er) ) break;.   
1afb0 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
1afc0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
1afd0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
1afe0 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20 69  er->bRev==0 && i
1aff0 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
1b000 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
1b010 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20 26 26  Iter->bRev!=0 &&
1b020 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20   iRowid<=iMatch 
1b030 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a  ) break;.  }.}..
1b040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1b050 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
1b060 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
1b070 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61 74 65  e term associate
1b080 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 65  d with the .** e
1b090 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
1b0a0 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
1b0b0 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
1b0c0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 2a  tatic const u8 *
1b0d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
1b0e0 6d 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  m(Fts5Iter *pIte
1b0f0 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46  r, int *pn){.  F
1b100 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20  ts5SegIter *p = 
1b110 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
1b120 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1b130 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d  First ];.  *pn =
1b140 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65   p->term.n;.  re
1b150 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a  turn p->term.p;.
1b160 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1b170 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
1b180 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  id for the struc
1b190 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
1b1a0 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a  e new segment.**
1b1b0 20 69 64 20 6d 75 73 74 20 62 65 20 62 65 74 77   id must be betw
1b1c0 65 65 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20  een 1 and 65335 
1b1d0 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d  inclusive, and m
1b1e0 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20  ust not be used 
1b1f0 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65  by .** any curre
1b200 6e 74 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65  ntly existing se
1b210 67 6d 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65  gment. If a free
1b220 20 73 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e   segment id cann
1b230 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  ot be found,.** 
1b240 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72  SQLITE_FULL is r
1b250 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1b260 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
1b270 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1b280 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b290 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20  s a no-op. 0 is 
1b2a0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
1b2b0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
1b2c0 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c  atic int fts5All
1b2d0 6f 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49  ocateSegid(Fts5I
1b2e0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72  ndex *p, Fts5Str
1b2f0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
1b300 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d  {.  int iSegid =
1b310 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
1b320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b330 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
1b340 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d  nSegment>=FTS5_M
1b350 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
1b360 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1b370 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TE_FULL;.    }el
1b380 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 54 53  se{.      /* FTS
1b390 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 69 73  5_MAX_SEGMENT is
1b3a0 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
1b3b0 65 64 20 61 73 20 32 30 30 30 2e 20 53 6f 20 74  ed as 2000. So t
1b3c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
1b3d0 20 20 20 2a 2a 20 61 72 72 61 79 20 69 73 20 36     ** array is 6
1b3e0 33 20 65 6c 65 6d 65 6e 74 73 2c 20 6f 72 20 32  3 elements, or 2
1b3f0 35 32 20 62 79 74 65 73 2c 20 69 6e 20 73 69 7a  52 bytes, in siz
1b400 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  e.  */.      u32
1b410 20 61 55 73 65 64 5b 28 46 54 53 35 5f 4d 41 58   aUsed[(FTS5_MAX
1b420 5f 53 45 47 4d 45 4e 54 2b 33 31 29 20 2f 20 33  _SEGMENT+31) / 3
1b430 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c  2];.      int iL
1b440 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
1b450 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 33 32  int i;.      u32
1b460 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 6d 65 6d   mask;.      mem
1b470 73 65 74 28 61 55 73 65 64 2c 20 30 2c 20 73 69  set(aUsed, 0, si
1b480 7a 65 6f 66 28 61 55 73 65 64 29 29 3b 0a 20 20  zeof(aUsed));.  
1b490 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
1b4a0 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1b4b0 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
1b4c0 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
1b4d0 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
1b4e0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
1b4f0 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
1b500 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d         int iId =
1b510 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
1b520 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
1b530 5d 2e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ].iSegid;.      
1b540 20 20 20 20 69 66 28 20 69 49 64 3c 3d 46 54 53      if( iId<=FTS
1b550 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b  5_MAX_SEGMENT ){
1b560 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 55 73  .            aUs
1b570 65 64 5b 28 69 49 64 2d 31 29 20 2f 20 33 32 5d  ed[(iId-1) / 32]
1b580 20 7c 3d 20 28 75 33 32 29 31 20 3c 3c 20 28 28   |= (u32)1 << ((
1b590 69 49 64 2d 31 29 20 25 20 33 32 29 3b 0a 20 20  iId-1) % 32);.  
1b5a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b5b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b5c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 55 73 65     for(i=0; aUse
1b5d0 64 5b 69 5d 3d 3d 30 78 46 46 46 46 46 46 46 46  d[i]==0xFFFFFFFF
1b5e0 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 6d 61  ; i++);.      ma
1b5f0 73 6b 20 3d 20 61 55 73 65 64 5b 69 5d 3b 0a 20  sk = aUsed[i];. 
1b600 20 20 20 20 20 66 6f 72 28 69 53 65 67 69 64 3d       for(iSegid=
1b610 30 3b 20 6d 61 73 6b 20 26 20 28 28 75 33 32 29  0; mask & ((u32)
1b620 31 20 3c 3c 20 69 53 65 67 69 64 29 3b 20 69 53  1 << iSegid); iS
1b630 65 67 69 64 2b 2b 29 3b 0a 20 20 20 20 20 20 69  egid++);.      i
1b640 53 65 67 69 64 20 2b 3d 20 31 20 2b 20 69 2a 33  Segid += 1 + i*3
1b650 32 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  2;..#ifdef SQLIT
1b660 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 6f  E_DEBUG.      fo
1b670 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1b680 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1b690 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1b6a0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
1b6b0 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
1b6c0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
1b6d0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
1b6e0 20 61 73 73 65 72 74 5f 6e 63 28 20 69 53 65 67   assert_nc( iSeg
1b6f0 69 64 21 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65  id!=pStruct->aLe
1b700 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
1b710 53 65 67 5d 2e 69 53 65 67 69 64 20 29 3b 0a 20  Seg].iSegid );. 
1b720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b730 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
1b740 28 20 69 53 65 67 69 64 3e 30 20 26 26 20 69 53  ( iSegid>0 && iS
1b750 65 67 69 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53  egid<=FTS5_MAX_S
1b760 45 47 4d 45 4e 54 20 29 3b 0a 0a 20 20 20 20 20  EGMENT );..     
1b770 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1b780 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 53 65 6c  e3_stmt *pIdxSel
1b790 65 63 74 20 3d 20 66 74 73 35 49 64 78 53 65 6c  ect = fts5IdxSel
1b7a0 65 63 74 53 74 6d 74 28 70 29 3b 0a 20 20 20 20  ectStmt(p);.    
1b7b0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1b7c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b7d0 20 20 20 20 20 20 75 38 20 61 42 6c 6f 62 5b 32        u8 aBlob[2
1b7e0 5d 20 3d 20 7b 30 78 66 66 2c 20 30 78 66 66 7d  ] = {0xff, 0xff}
1b7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1b800 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64  te3_bind_int(pId
1b810 78 53 65 6c 65 63 74 2c 20 31 2c 20 69 53 65 67  xSelect, 1, iSeg
1b820 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  id);.          s
1b830 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
1b840 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20  (pIdxSelect, 2, 
1b850 61 42 6c 6f 62 2c 20 32 2c 20 53 51 4c 49 54 45  aBlob, 2, SQLITE
1b860 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
1b870 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 73      assert_nc( s
1b880 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 64 78  qlite3_step(pIdx
1b890 53 65 6c 65 63 74 29 21 3d 53 51 4c 49 54 45 5f  Select)!=SQLITE_
1b8a0 52 4f 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ROW );.         
1b8b0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1b8c0 5f 72 65 73 65 74 28 70 49 64 78 53 65 6c 65 63  _reset(pIdxSelec
1b8d0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
1b8e0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
1b8f0 70 49 64 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a  pIdxSelect, 2);.
1b900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b910 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1b920 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 53 65   }..  return iSe
1b930 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  gid;.}../*.** Di
1b940 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63  scard all data c
1b950 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
1b960 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c  in the hash-tabl
1b970 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1b980 69 64 20 66 74 73 35 49 6e 64 65 78 44 69 73 63  id fts5IndexDisc
1b990 61 72 64 44 61 74 61 28 46 74 73 35 49 6e 64 65  ardData(Fts5Inde
1b9a0 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  x *p){.  assert(
1b9b0 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e   p->pHash || p->
1b9c0 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
1b9d0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73  );.  if( p->pHas
1b9e0 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
1b9f0 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d  Fts5HashClear(p-
1ba00 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e  >pHash);.    p->
1ba10 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30  nPendingData = 0
1ba20 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1ba30 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1ba40 66 20 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e  f the prefix, in
1ba50 20 62 79 74 65 73 2c 20 74 68 61 74 20 62 75 66   bytes, that buf
1ba60 66 65 72 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c  fer .** (pNew/<l
1ba70 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20  ength-unknown>) 
1ba80 73 68 61 72 65 73 20 77 69 74 68 20 62 75 66 66  shares with buff
1ba90 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a  er (pOld/nOld)..
1baa0 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 4e  **.** Buffer (pN
1bab0 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f  ew/<length-unkno
1bac0 77 6e 3e 29 20 69 73 20 67 75 61 72 61 6e 74 65  wn>) is guarante
1bad0 65 64 20 74 6f 20 62 65 20 67 72 65 61 74 65 72  ed to be greater
1bae0 20 0a 2a 2a 20 74 68 61 6e 20 62 75 66 66 65 72   .** than buffer
1baf0 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f   (pOld/nOld)..*/
1bb00 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1bb10 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 69  PrefixCompress(i
1bb20 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75  nt nOld, const u
1bb30 38 20 2a 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75  8 *pOld, const u
1bb40 38 20 2a 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20  8 *pNew){.  int 
1bb50 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1bb60 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
1bb70 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65  if( pOld[i]!=pNe
1bb80 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  w[i] ) break;.  
1bb90 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
1bba0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1bbb0 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
1bbc0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1bbd0 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
1bbe0 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
1bbf0 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20 20 20  nt bFlush       
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc10 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69 74 65  * If true, write
1bc20 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b 20 2a   dlidx to disk *
1bc30 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1bc40 61 73 73 65 72 74 28 20 62 46 6c 75 73 68 3d 3d  assert( bFlush==
1bc50 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e  0 || (pWriter->n
1bc60 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74  Dlidx>0 && pWrit
1bc70 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
1bc80 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28  f.n>0) );.  for(
1bc90 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
1bca0 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20  nDlidx; i++){.  
1bcb0 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
1bcc0 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72  r *pDlidx = &pWr
1bcd0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
1bce0 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
1bcf0 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61  >buf.n==0 ) brea
1bd00 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c 75 73  k;.    if( bFlus
1bd10 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
1bd20 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21  t( pDlidx->pgno!
1bd30 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  =0 );.      fts5
1bd40 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20  DataWrite(p, .  
1bd50 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
1bd60 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  DX_ROWID(pWriter
1bd70 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c  ->iSegid, i, pDl
1bd80 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20  idx->pgno),.    
1bd90 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75        pDlidx->bu
1bda0 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66  f.p, pDlidx->buf
1bdb0 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .n.      );.    
1bdc0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
1bdd0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c  5BufferZero(&pDl
1bde0 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70  idx->buf);.    p
1bdf0 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1be00 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 0;.  }.}../*
1be10 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70 57 72  .** Grow the pWr
1be20 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61  iter->aDlidx[] a
1be30 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61 73 74  rray to at least
1be40 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69   nLvl elements i
1be50 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e  n size..** Any n
1be60 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74  ew array element
1be70 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62 65 66  s are zeroed bef
1be80 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1be90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1bea0 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
1beb0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1bec0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1bed0 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74   *pWriter,.  int
1bee0 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70   nLvl.){.  if( p
1bef0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1bf00 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72  && nLvl>=pWriter
1bf10 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ->nDlidx ){.    
1bf20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
1bf30 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73 35 44  *aDlidx = (Fts5D
1bf40 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71 6c 69  lidxWriter*)sqli
1bf50 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 0a 20  te3_realloc64(. 
1bf60 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
1bf70 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46  aDlidx, sizeof(F
1bf80 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20  ts5DlidxWriter) 
1bf90 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20  * nLvl.    );.  
1bfa0 20 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20    if( aDlidx==0 
1bfb0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1bfc0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1bfd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bfe0 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
1bff0 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74  of(Fts5DlidxWrit
1c000 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57  er) * (nLvl - pW
1c010 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a  riter->nDlidx);.
1c020 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 44        memset(&aD
1c030 6c 69 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44  lidx[pWriter->nD
1c040 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29  lidx], 0, nByte)
1c050 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
1c060 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c 69 64 78  >aDlidx = aDlidx
1c070 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
1c080 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a  >nDlidx = nLvl;.
1c090 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c0a0 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  rn p->rc;.}../*.
1c0b0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
1c0c0 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  t doclist-index 
1c0d0 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e 20  accumulating in 
1c0e0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1c0f0 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  ] is large.** en
1c100 6f 75 67 68 2c 20 66 6c 75 73 68 20 69 74 20 74  ough, flush it t
1c110 6f 20 64 69 73 6b 20 61 6e 64 20 72 65 74 75 72  o disk and retur
1c120 6e 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 64  n 1. Otherwise d
1c130 69 73 63 61 72 64 20 69 74 20 61 6e 64 20 72 65  iscard it and re
1c140 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f  turn.** zero..*/
1c150 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1c160 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28  WriteFlushDlidx(
1c170 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1c180 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1c190 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c  iter){.  int bFl
1c1a0 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ag = 0;..  /* If
1c1b0 20 74 68 65 72 65 20 77 65 72 65 20 46 54 53 35   there were FTS5
1c1c0 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
1c1d0 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65  or more empty le
1c1e0 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
1c1f0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  .  ** to the dat
1c200 61 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69 74  abase, also writ
1c210 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  e the doclist-in
1c220 64 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f  dex to disk.  */
1c230 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
1c240 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e  aDlidx[0].buf.n>
1c250 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45  0 && pWriter->nE
1c260 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44  mpty>=FTS5_MIN_D
1c270 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20  LIDX_SIZE ){.   
1c280 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a   bFlag = 1;.  }.
1c290 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1c2a0 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65 72  Clear(p, pWriter
1c2b0 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70 57 72 69  , bFlag);.  pWri
1c2c0 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b  ter->nEmpty = 0;
1c2d0 0a 20 20 72 65 74 75 72 6e 20 62 46 6c 61 67 3b  .  return bFlag;
1c2e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1c2f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1c300 64 20 77 68 65 6e 65 76 65 72 20 70 72 6f 63 65  d whenever proce
1c310 73 73 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63  ssing of the doc
1c320 6c 69 73 74 20 66 6f 72 20 74 68 65 20 0a 2a 2a  list for the .**
1c330 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65   last term on le
1c340 61 66 20 70 61 67 65 20 28 70 57 72 69 74 65 72  af page (pWriter
1c350 2d 3e 69 42 74 50 61 67 65 29 20 69 73 20 63 6f  ->iBtPage) is co
1c360 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  mpleted. .**.** 
1c370 54 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  The doclist-inde
1c380 78 20 66 6f 72 20 74 68 61 74 20 74 65 72 6d 20  x for that term 
1c390 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
1c3a0 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77 69  red in-memory wi
1c3b0 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35  thin the.** Fts5
1c3c0 53 65 67 57 72 69 74 65 72 2e 61 44 6c 69 64 78  SegWriter.aDlidx
1c3d0 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 69 74 20  [] array. If it 
1c3e0 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c  is large enough,
1c3f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1c400 2a 20 77 72 69 74 65 73 20 69 74 20 6f 75 74 20  * writes it out 
1c410 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66 20  to disk. Or, if 
1c420 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  it is too small 
1c430 74 6f 20 62 6f 74 68 65 72 20 77 69 74 68 2c 20  to bother with, 
1c440 64 69 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e 0a  discards.** it..
1c450 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69  **.** Fts5SegWri
1c460 74 65 72 2e 62 74 74 65 72 6d 20 63 75 72 72 65  ter.btterm curre
1c470 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntly contains th
1c480 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
1c490 70 61 67 65 20 69 42 74 50 61 67 65 2e 0a 2a 2f  page iBtPage..*/
1c4a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1c4b0 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65  5WriteFlushBtree
1c4c0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
1c4d0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1c4e0 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46  riter){.  int bF
1c4f0 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  lag;..  assert( 
1c500 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1c510 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d   || pWriter->nEm
1c520 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  pty==0 );.  if( 
1c530 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1c540 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1c550 62 46 6c 61 67 20 3d 20 66 74 73 35 57 72 69 74  bFlag = fts5Writ
1c560 65 46 6c 75 73 68 44 6c 69 64 78 28 70 2c 20 70  eFlushDlidx(p, p
1c570 57 72 69 74 65 72 29 3b 0a 0a 20 20 69 66 28 20  Writer);..  if( 
1c580 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c590 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1c5a0 61 72 20 2a 7a 20 3d 20 28 70 57 72 69 74 65 72  ar *z = (pWriter
1c5b0 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f  ->btterm.n>0?(co
1c5c0 6e 73 74 20 63 68 61 72 2a 29 70 57 72 69 74 65  nst char*)pWrite
1c5d0 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29 3b  r->btterm.p:"");
1c5e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
1c5f0 6f 77 69 6e 67 20 77 61 73 20 61 6c 72 65 61 64  owing was alread
1c600 79 20 64 6f 6e 65 20 69 6e 20 66 74 73 35 57 72  y done in fts5Wr
1c610 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20 20  iteInit(): */.  
1c620 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e    /* sqlite3_bin
1c630 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69  d_int(p->pIdxWri
1c640 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d  ter, 1, pWriter-
1c650 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20 20  >iSegid); */.   
1c660 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
1c670 6f 62 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ob(p->pIdxWriter
1c680 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74 65 72 2d  , 2, z, pWriter-
1c690 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54  >btterm.n, SQLIT
1c6a0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
1c6b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
1c6c0 34 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c  4(p->pIdxWriter,
1c6d0 20 33 2c 20 62 46 6c 61 67 20 2b 20 28 28 69 36   3, bFlag + ((i6
1c6e0 34 29 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61  4)pWriter->iBtPa
1c6f0 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71 6c  ge<<1));.    sql
1c700 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64  ite3_step(p->pId
1c710 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d  xWriter);.    p-
1c720 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
1c730 73 65 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65  set(p->pIdxWrite
1c740 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
1c750 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d 3e 70 49 64  bind_null(p->pId
1c760 78 57 72 69 74 65 72 2c 20 32 29 3b 0a 20 20 7d  xWriter, 2);.  }
1c770 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  .  pWriter->iBtP
1c780 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  age = 0;.}../*.*
1c790 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
1c7a0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c   once for each l
1c7b0 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20  eaf page except 
1c7c0 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20 63  the first that c
1c7d0 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65  ontains.** at le
1c7e0 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72  ast one term. Ar
1c7f0 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54  gument (nTerm/pT
1c800 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c 69  erm) is the spli
1c810 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20 74  t-key - a term t
1c820 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72  hat.** is larger
1c830 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20   than all terms 
1c840 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c 69  written to earli
1c850 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 65  er leaves, and e
1c860 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d  qual to or.** sm
1c870 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 66  aller than the f
1c880 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  irst term on the
1c890 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a   new leaf..**.**
1c8a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1c8b0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1c8c0 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
1c8d0 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61  s5Index.rc. If a
1c8e0 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61  n error.** has a
1c8f0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
1c900 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1c910 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
1c920 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1c930 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1c940 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 0a  WriteBtreeTerm(.
1c950 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1c980 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1c990 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1c9a0 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  iter,         /*
1c9b0 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
1c9c0 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63  /.  int nTerm, c
1c9d0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 20  onst u8 *pTerm  
1c9e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72      /* First ter
1c9f0 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f  m on new page */
1ca00 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74 65 46  .){.  fts5WriteF
1ca10 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72  lushBtree(p, pWr
1ca20 69 74 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iter);.  if( p->
1ca30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ca40 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
1ca50 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  et(&p->rc, &pWri
1ca60 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e 54 65  ter->btterm, nTe
1ca70 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
1ca80 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1ca90 20 3d 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74   = pWriter->writ
1caa0 65 72 2e 70 67 6e 6f 3b 0a 20 20 7d 0a 7d 0a 0a  er.pgno;.  }.}..
1cab0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1cac0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
1cad0 65 6e 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65  en flushing a le
1cae0 61 66 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  af page that con
1caf0 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d  tains no.** term
1cb00 73 20 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b  s at all to disk
1cb10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1cb20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
1cb30 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  oTerm(.  Fts5Ind
1cb40 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1cb50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1cb60 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1cb70 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
1cb80 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20  er *pWriter     
1cb90 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
1cba0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  bject */.){.  /*
1cbb0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
1cbc0 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20  o rowids on the 
1cbd0 6c 65 61 66 20 70 61 67 65 20 65 69 74 68 65 72  leaf page either
1cbe0 20 61 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74   and the doclist
1cbf0 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20  -index.  ** has 
1cc00 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 61  already been sta
1cc10 72 74 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20  rted, append an 
1cc20 30 78 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e  0x00 byte to it.
1cc30 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74    */.  if( pWrit
1cc40 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1cc50 6e 50 61 67 65 20 26 26 20 70 57 72 69 74 65 72  nPage && pWriter
1cc60 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1cc70 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44  n>0 ){.    Fts5D
1cc80 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
1cc90 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
1cca0 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73  Dlidx[0];.    as
1ccb0 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50  sert( pDlidx->bP
1ccc0 72 65 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  revValid );.    
1ccd0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1cce0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1ccf0 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
1cd00 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  uf, 0);.  }..  /
1cd10 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1cd20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65  "number of seque
1cd30 6e 74 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74  ntial leaves wit
1cd40 68 6f 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75  hout a term" cou
1cd50 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74  nter. */.  pWrit
1cd60 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a  er->nEmpty++;.}.
1cd70 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
1cd80 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73  DlidxExtractFirs
1cd90 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65  tRowid(Fts5Buffe
1cda0 72 20 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20  r *pBuf){.  i64 
1cdb0 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f  iRowid;.  int iO
1cdc0 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20  ff;..  iOff = 1 
1cdd0 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  + fts5GetVarint(
1cde0 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36  &pBuf->p[1], (u6
1cdf0 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66  4*)&iRowid);.  f
1ce00 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
1ce10 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  uf->p[iOff], (u6
1ce20 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72  4*)&iRowid);.  r
1ce30 65 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a  eturn iRowid;.}.
1ce40 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f  ./*.** Rowid iRo
1ce50 77 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65  wid has just bee
1ce60 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
1ce70 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
1ce80 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a  age. It is the.*
1ce90 2a 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70  * first on the p
1cea0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
1ceb0 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70  on appends an ap
1cec0 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20  propriate entry 
1ced0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  to the current.*
1cee0 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  * doclist-index.
1cef0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cf00 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
1cf10 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65  pend(.  Fts5Inde
1cf20 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1cf30 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1cf40 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29   .  i64 iRowid.)
1cf50 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1cf60 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66   bDone = 0;..  f
1cf70 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
1cf80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e  QLITE_OK && bDon
1cf90 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e==0; i++){.    
1cfa0 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74  i64 iVal;.    Ft
1cfb0 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
1cfc0 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1cfd0 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20  ->aDlidx[i];..  
1cfe0 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
1cff0 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  f.n>=p->pConfig-
1d000 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f  >pgsz ){.      /
1d010 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f  * The current do
1d020 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65  clist-index page
1d030 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20   is full. Write 
1d040 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70  it to disk and p
1d050 75 73 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  ush.      ** a c
1d060 6f 70 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77  opy of iRowid (w
1d070 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65  hich will become
1d080 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
1d090 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20   on the next.   
1d0a0 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e     ** doclist-in
1d0b0 64 65 78 20 6c 65 61 66 20 70 61 67 65 29 20 75  dex leaf page) u
1d0c0 70 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20  p into the next 
1d0d0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74  level of the b-t
1d0e0 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69  ree .      ** hi
1d0f0 65 72 61 72 63 68 79 2e 20 49 66 20 74 68 65 20  erarchy. If the 
1d100 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68  node being flush
1d110 65 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ed is currently 
1d120 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20  the root node,. 
1d130 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73       ** also pus
1d140 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69  h its first rowi
1d150 64 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20  d upwards. */.  
1d160 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e      pDlidx->buf.
1d170 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20  p[0] = 0x01;    
1d180 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20  /* Not the root 
1d190 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74  node */.      ft
1d1a0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a  s5DataWrite(p, .
1d1b0 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
1d1c0 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74  LIDX_ROWID(pWrit
1d1d0 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
1d1e0 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20  Dlidx->pgno),.  
1d1f0 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e          pDlidx->
1d200 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62  buf.p, pDlidx->b
1d210 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20  uf.n.      );.  
1d220 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
1d230 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  dxGrow(p, pWrite
1d240 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70  r, i+2);.      p
1d250 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1d260 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20  ->aDlidx[i];.   
1d270 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1d280 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64  LITE_OK && pDlid
1d290 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b  x[1].buf.n==0 ){
1d2a0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 46 69  .        i64 iFi
1d2b0 72 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45  rst = fts5DlidxE
1d2c0 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64  xtractFirstRowid
1d2d0 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a  (&pDlidx->buf);.
1d2e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1d2f0 20 77 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f   was the root no
1d300 64 65 2e 20 50 75 73 68 20 69 74 73 20 66 69 72  de. Push its fir
1d310 73 74 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74  st rowid up to t
1d320 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a  he new root. */.
1d330 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
1d340 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d  ].pgno = pDlidx-
1d350 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73  >pgno;.        s
1d360 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d370 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d380 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e  >rc, &pDlidx[1].
1d390 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
1d3a0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d3b0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d3c0 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
1d3d0 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70  ].buf, pDlidx->p
1d3e0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  gno);.        sq
1d3f0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1d400 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1d410 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
1d420 75 66 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20  uf, iFirst);.   
1d430 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62       pDlidx[1].b
1d440 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
1d450 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
1d460 2e 69 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b  .iPrev = iFirst;
1d470 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1d480 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d490 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62  rZero(&pDlidx->b
1d4a0 75 66 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64  uf);.      pDlid
1d4b0 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  x->bPrevValid = 
1d4c0 30 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  0;.      pDlidx-
1d4d0 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >pgno++;.    }el
1d4e0 73 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20  se{.      bDone 
1d4f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1d500 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65  if( pDlidx->bPre
1d510 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  vValid ){.      
1d520 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20  iVal = iRowid - 
1d530 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20  pDlidx->iPrev;. 
1d540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d550 69 36 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d  i64 iPgno = (i==
1d560 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69  0 ? pWriter->wri
1d570 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64  ter.pgno : pDlid
1d580 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20  x[-1].pgno);.   
1d590 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
1d5a0 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20  x->buf.n==0 );. 
1d5b0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d5c0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1d5d0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1d5e0 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29  dx->buf, !bDone)
1d5f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
1d600 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d610 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d620 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e  Dlidx->buf, iPgn
1d630 6f 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d  o);.      iVal =
1d640 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a   iRowid;.    }..
1d650 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1d660 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1d670 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1d680 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20  x->buf, iVal);. 
1d690 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76     pDlidx->bPrev
1d6a0 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70  Valid = 1;.    p
1d6b0 44 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69  Dlidx->iPrev = i
1d6c0 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Rowid;.  }.}..st
1d6d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1d6e0 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73  iteFlushLeaf(Fts
1d6f0 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
1d700 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1d710 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  r){.  static con
1d720 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b  st u8 zero[] = {
1d730 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1d740 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73  0, 0x00 };.  Fts
1d750 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
1d760 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1d770 72 69 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f  riter;.  i64 iRo
1d780 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  wid;..  assert( 
1d790 28 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d  (pPage->pgidx.n=
1d7a0 3d 30 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62  =0)==(pWriter->b
1d7b0 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29  FirstTermInPage)
1d7c0 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
1d7d0 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20  e szLeaf header 
1d7e0 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65  field. */.  asse
1d7f0 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31  rt( 0==fts5GetU1
1d800 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
1d810 32 5d 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74  2]) );.  fts5Put
1d820 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
1d830 70 5b 32 5d 2c 20 28 75 31 36 29 70 50 61 67 65  p[2], (u16)pPage
1d840 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28  ->buf.n);..  if(
1d850 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1d860 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20  TermInPage ){.  
1d870 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73    /* No term was
1d880 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
1d890 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
1d8a0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 69  sert( pPage->pgi
1d8b0 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66  dx.n==0 );.    f
1d8c0 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
1d8d0 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
1d8e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1d8f0 20 41 70 70 65 6e 64 20 74 68 65 20 70 67 69 64   Append the pgid
1d900 78 20 74 6f 20 74 68 65 20 70 61 67 65 20 62 75  x to the page bu
1d910 66 66 65 72 2e 20 53 65 74 20 74 68 65 20 73 7a  ffer. Set the sz
1d920 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c  Leaf header fiel
1d930 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  d. */.    fts5Bu
1d940 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1d950 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1d960 75 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78  uf, pPage->pgidx
1d970 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78  .n, pPage->pgidx
1d980 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  .p);.  }..  /* W
1d990 72 69 74 65 20 74 68 65 20 70 61 67 65 20 6f 75  rite the page ou
1d9a0 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69  t to disk */.  i
1d9b0 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
1d9c0 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74  MENT_ROWID(pWrit
1d9d0 65 72 2d 3e 69 53 65 67 69 64 2c 20 70 50 61 67  er->iSegid, pPag
1d9e0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35  e->pgno);.  fts5
1d9f0 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f  DataWrite(p, iRo
1da00 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  wid, pPage->buf.
1da10 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  p, pPage->buf.n)
1da20 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
1da30 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ze the next page
1da40 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1da50 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75  rZero(&pPage->bu
1da60 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  f);.  fts5Buffer
1da70 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70 67 69  Zero(&pPage->pgi
1da80 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  dx);.  fts5Buffe
1da90 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1daa0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1dab0 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61   4, zero);.  pPa
1dac0 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d  ge->iPrevPgidx =
1dad0 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e   0;.  pPage->pgn
1dae0 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  o++;..  /* Incre
1daf0 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20 77  ase the leaves w
1db00 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a  ritten counter *
1db10 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  /.  pWriter->nLe
1db20 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20  afWritten++;..  
1db30 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20  /* The new leaf 
1db40 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f  holds no terms o
1db50 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57  r rowids */.  pW
1db60 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1db70 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70  mInPage = 1;.  p
1db80 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1db90 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d  widInPage = 1;.}
1dba0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
1dbb0 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
1dbc0 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
1dbd0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20  eing written by 
1dbe0 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65  the writer passe
1dbf0 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f  d.** as the seco
1dc00 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
1dc10 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1dc20 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
1dc30 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
1dc40 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
1dc50 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
1dc60 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1dc70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1dc80 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1dc90 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1dca0 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74  AppendTerm(.  Ft
1dcb0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1dcc0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1dcd0 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65  riter,.  int nTe
1dce0 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  rm, const u8 *pT
1dcf0 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  erm .){.  int nP
1dd00 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
1dd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1dd20 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
1dd30 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72  pression for ter
1dd40 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  m */.  Fts5PageW
1dd50 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
1dd60 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1dd70 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1dd80 50 67 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Pgidx = &pWriter
1dd90 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a  ->writer.pgidx;.
1dda0 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e    int nMin = MIN
1ddb0 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20  (pPage->term.n, 
1ddc0 6e 54 65 72 6d 29 3b 0a 0a 20 20 61 73 73 65 72  nTerm);..  asser
1ddd0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
1dde0 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
1ddf0 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 34   pPage->buf.n>=4
1de00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1de10 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c 20  age->buf.n>4 || 
1de20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1de30 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a 20 20  ermInPage );..  
1de40 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1de50 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 66  t leaf page is f
1de60 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20 74 6f  ull, flush it to
1de70 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20   disk. */.  if( 
1de80 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20  (pPage->buf.n + 
1de90 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54 65 72  pPgidx->n + nTer
1dea0 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e 66  m + 2)>=p->pConf
1deb0 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
1dec0 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
1ded0 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  >4 ){.      fts5
1dee0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1def0 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
1df00 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
1df10 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
1df20 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
1df30 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
1df40 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1df50 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50  Term+FTS5_DATA_P
1df60 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a  ADDING);.  }.  .
1df70 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61    /* TODO1: Upda
1df80 74 69 6e 67 20 70 67 69 64 78 20 68 65 72 65 2e  ting pgidx here.
1df90 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20   */.  pPgidx->n 
1dfa0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
1dfb0 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20 26  tVarint(.      &
1dfc0 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78  pPgidx->p[pPgidx
1dfd0 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  ->n], pPage->buf
1dfe0 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50 72 65  .n - pPage->iPre
1dff0 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20 70 50  vPgidx.  );.  pP
1e000 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20  age->iPrevPgidx 
1e010 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a  = pPage->buf.n;.
1e020 23 69 66 20 30 0a 20 20 66 74 73 35 50 75 74 55  #if 0.  fts5PutU
1e030 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b 70 50  16(&pPgidx->p[pP
1e040 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d  gidx->n], pPage-
1e050 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64  >buf.n);.  pPgid
1e060 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69  x->n += 2;.#endi
1e070 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  f..  if( pWriter
1e080 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1e090 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65 66 69  ge ){.    nPrefi
1e0a0 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
1e0b0 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  Page->pgno!=1 ){
1e0c0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
1e0d0 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1e0e0 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20   on a leaf that 
1e0f0 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d  is not the leftm
1e100 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20  ost leaf in.    
1e110 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74    ** the segment
1e120 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73   b-tree. In this
1e130 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65   case it is nece
1e140 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74  ssary to add a t
1e150 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  erm to.      ** 
1e160 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
1e170 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29  rchy that is (a)
1e180 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1e190 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20   largest term . 
1e1a0 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
1e1b0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
1e1c0 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73  egment and (b) s
1e1d0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65  maller than or e
1e1e0 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  qual to.      **
1e1f0 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f   this term. In o
1e200 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72  ther words, a pr
1e210 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e  efix of (pTerm/n
1e220 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e  Term) that is on
1e230 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
1e240 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
1e250 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28  longest prefix (
1e260 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61  pTerm/nTerm) sha
1e270 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  res with the.   
1e280 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74     ** previous t
1e290 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  erm. .      **. 
1e2a0 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c       ** Usually,
1e2b0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
1e2c0 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  rm is available 
1e2d0 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20  in pPage->term. 
1e2e0 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  The exception.  
1e2f0 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69      ** is if thi
1e300 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1e310 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61  erm written in a
1e320 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
1e330 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20  rge step..      
1e340 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
1e350 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
1e360 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  m is not availab
1e370 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74  le, so just writ
1e380 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
1e390 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  y of (pTerm/nTer
1e3a0 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  m) into the pare
1e3b0 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  nt node. This is
1e3c0 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
1e3d0 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20  ** inefficient, 
1e3e0 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63  but still correc
1e3f0 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  t.  */.      int
1e400 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
1e410 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
1e420 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  m.n ){.        n
1e430 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69   = 1 + fts5Prefi
1e440 78 43 6f 6d 70 72 65 73 73 28 6e 4d 69 6e 2c 20  xCompress(nMin, 
1e450 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70  pPage->term.p, p
1e460 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Term);.      }. 
1e470 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
1e480 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74  reeTerm(p, pWrit
1e490 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20  er, n, pTerm);. 
1e4a0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
1e4b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1e4c0 72 6e 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  rn;.      pPage 
1e4d0 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1e4e0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  er;.    }.  }els
1e4f0 65 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  e{.    nPrefix =
1e500 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
1e510 65 73 73 28 6e 4d 69 6e 2c 20 70 50 61 67 65 2d  ess(nMin, pPage-
1e520 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b  >term.p, pTerm);
1e530 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1e540 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1e550 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e560 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a   nPrefix);.  }..
1e570 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1e580 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1e590 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65  of new data, the
1e5a0 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20  n the term data 
1e5b0 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74  itself.  ** to t
1e5c0 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  he page. */.  ft
1e5d0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1e5e0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1e5f0 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
1e600 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74  - nPrefix);.  ft
1e610 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1e620 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1e630 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
1e640 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b  nPrefix, &pTerm[
1e650 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a  nPrefix]);..  /*
1e660 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
1e670 50 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20  PageWriter.term 
1e680 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35  field. */.  fts5
1e690 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1e6a0 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
1e6b0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1e6c0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1e6d0 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a  TermInPage = 0;.
1e6e0 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1e6f0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
1e700 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  0;.  pWriter->bF
1e710 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
1e720 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72  st = 1;..  asser
1e730 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72  t( p->rc || (pWr
1e740 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26  iter->nDlidx>0 &
1e750 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
1e760 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29  x[0].buf.n==0) )
1e770 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c  ;.  pWriter->aDl
1e780 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50  idx[0].pgno = pP
1e790 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  age->pgno;.}../*
1e7a0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77  .** Append a row
1e7b0 69 64 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d  id and position-
1e7c0 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
1e7d0 74 6f 20 74 68 65 20 77 72 69 74 65 72 73 20 6f  to the writers o
1e7e0 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  utput. .*/.stati
1e7f0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1e800 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46  AppendRowid(.  F
1e810 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1e820 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1e830 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52  Writer,.  i64 iR
1e840 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d  owid.){.  if( p-
1e850 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1e860 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
1e870 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
1e880 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
1e890 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 2d  .    if( (pPage-
1e8a0 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e  >buf.n + pPage->
1e8b0 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f  pgidx.n)>=p->pCo
1e8c0 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
1e8d0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1e8e0 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
1e8f0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
1e900 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 6f 20  * If this is to 
1e910 62 65 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  be the first row
1e920 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  id written to th
1e930 65 20 70 61 67 65 2c 20 73 65 74 20 74 68 65 20  e page, set the 
1e940 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f  .    ** rowid-po
1e950 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
1e960 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61  e-header. Also a
1e970 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f  ppend a value to
1e980 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a   the dlidx.    *
1e990 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73  * buffer, in cas
1e9a0 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  e a doclist-inde
1e9b0 78 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  x is required.  
1e9c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74  */.    if( pWrit
1e9d0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1e9e0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66  nPage ){.      f
1e9f0 74 73 35 50 75 74 55 31 36 28 70 50 61 67 65 2d  ts5PutU16(pPage-
1ea00 3e 62 75 66 2e 70 2c 20 28 75 31 36 29 70 50 61  >buf.p, (u16)pPa
1ea10 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20  ge->buf.n);.    
1ea20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1ea30 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65  Append(p, pWrite
1ea40 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r, iRowid);.    
1ea50 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  }..    /* Write 
1ea60 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20  the rowid. */.  
1ea70 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
1ea80 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
1ea90 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  ist || pWriter->
1eaa0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1eab0 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42  e ){.      fts5B
1eac0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1ead0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
1eae0 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a  ->buf, iRowid);.
1eaf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eb00 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 72   assert_nc( p->r
1eb10 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72 69  c || iRowid>pWri
1eb20 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20  ter->iPrevRowid 
1eb30 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
1eb40 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1eb50 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1eb60 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 70 57  buf, iRowid - pW
1eb70 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1eb80 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
1eb90 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1eba0 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  d = iRowid;.    
1ebb0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1ebc0 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
1ebd0 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  0;.    pWriter->
1ebe0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1ebf0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  e = 0;.  }.}..st
1ec00 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1ec10 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
1ec20 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65  Data(.  Fts5Inde
1ec30 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1ec40 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1ec50 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44   .  const u8 *aD
1ec60 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74  ata, .  int nDat
1ec70 61 0a 29 7b 0a 20 20 46 74 73 35 50 61 67 65 57  a.){.  Fts5PageW
1ec80 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
1ec90 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1eca0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d  .  const u8 *a =
1ecb0 20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20   aData;.  int n 
1ecc0 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20 61 73  = nData;.  .  as
1ecd0 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67  sert( p->pConfig
1ece0 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68  ->pgsz>0 );.  wh
1ecf0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1ed00 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 28  TE_OK .     && (
1ed10 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70  pPage->buf.n + p
1ed20 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 20 2b 20  Page->pgidx.n + 
1ed30 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  n)>=p->pConfig->
1ed40 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20 20 20 69  pgsz .  ){.    i
1ed50 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f  nt nReq = p->pCo
1ed60 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61  nfig->pgsz - pPa
1ed70 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67  ge->buf.n - pPag
1ed80 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20 20 20 20  e->pgidx.n;.    
1ed90 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20  int nCopy = 0;. 
1eda0 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c     while( nCopy<
1edb0 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20 69 36  nReq ){.      i6
1edc0 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e  4 dummy;.      n
1edd0 43 6f 70 79 20 2b 3d 20 66 74 73 35 47 65 74 56  Copy += fts5GetV
1ede0 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c  arint(&a[nCopy],
1edf0 20 28 75 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a   (u64*)&dummy);.
1ee00 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
1ee10 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1ee20 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1ee30 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20  uf, nCopy, a);. 
1ee40 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20     a += nCopy;. 
1ee50 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20     n -= nCopy;. 
1ee60 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1ee70 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
1ee80 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  );.  }.  if( n>0
1ee90 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
1eea0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1eeb0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1eec0 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  , n, a);.  }.}..
1eed0 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
1eee0 64 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74  data cached by t
1eef0 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74  he writer object
1ef00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1ef10 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c  . Free any.** al
1ef20 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
1ef30 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72  ated with the wr
1ef40 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iter..*/.static 
1ef50 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69  void fts5WriteFi
1ef60 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  nish(.  Fts5Inde
1ef70 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1ef80 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1ef90 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1efa0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1efb0 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20  nt *pnLeaf      
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1efd0 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
1efe0 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e 20 62   leaf pages in b
1eff0 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  -tree */.){.  in
1f000 74 20 69 3b 0a 20 20 46 74 73 35 50 61 67 65 57  t i;.  Fts5PageW
1f010 72 69 74 65 72 20 2a 70 4c 65 61 66 20 3d 20 26  riter *pLeaf = &
1f020 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1f030 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1f040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1f050 73 73 65 72 74 28 20 70 4c 65 61 66 2d 3e 70 67  ssert( pLeaf->pg
1f060 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  no>=1 );.    if(
1f070 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e 34 20   pLeaf->buf.n>4 
1f080 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
1f090 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
1f0a0 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Writer);.    }. 
1f0b0 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65     *pnLeaf = pLe
1f0c0 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20  af->pgno-1;.    
1f0d0 69 66 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e  if( pLeaf->pgno>
1f0e0 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  1 ){.      fts5W
1f0f0 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 70  riteFlushBtree(p
1f100 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
1f110 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  }.  }.  fts5Buff
1f120 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 74  erFree(&pLeaf->t
1f130 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66  erm);.  fts5Buff
1f140 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 62  erFree(&pLeaf->b
1f150 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  uf);.  fts5Buffe
1f160 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 70 67  rFree(&pLeaf->pg
1f170 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66  idx);.  fts5Buff
1f180 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d  erFree(&pWriter-
1f190 3e 62 74 74 65 72 6d 29 3b 0a 0a 20 20 66 6f 72  >btterm);..  for
1f1a0 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d  (i=0; i<pWriter-
1f1b0 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20  >nDlidx; i++){. 
1f1c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1f1d0 66 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65  fferFree(&pWrite
1f1e0 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66  r->aDlidx[i].buf
1f1f0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1f200 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61  _free(pWriter->a
1f210 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69  Dlidx);.}..stati
1f220 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1f230 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
1f240 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1f250 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1f260 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64 0a 29   .  int iSegid.)
1f270 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42  {.  const int nB
1f280 75 66 66 65 72 20 3d 20 70 2d 3e 70 43 6f 6e 66  uffer = p->pConf
1f290 69 67 2d 3e 70 67 73 7a 20 2b 20 46 54 53 35 5f  ig->pgsz + FTS5_
1f2a0 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 0a 20  DATA_PADDING;.. 
1f2b0 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c   memset(pWriter,
1f2c0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
1f2d0 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57  egWriter));.  pW
1f2e0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  riter->iSegid = 
1f2f0 69 53 65 67 69 64 3b 0a 0a 20 20 66 74 73 35 57  iSegid;..  fts5W
1f300 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c  riteDlidxGrow(p,
1f310 20 70 57 72 69 74 65 72 2c 20 31 29 3b 0a 20 20   pWriter, 1);.  
1f320 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1f330 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69  pgno = 1;.  pWri
1f340 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1f350 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72  nPage = 1;.  pWr
1f360 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20  iter->iBtPage = 
1f370 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  1;..  assert( pW
1f380 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75  riter->writer.bu
1f390 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  f.n==0 );.  asse
1f3a0 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69  rt( pWriter->wri
1f3b0 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 20 29  ter.pgidx.n==0 )
1f3c0 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  ;..  /* Grow the
1f3d0 20 74 77 6f 20 62 75 66 66 65 72 73 20 74 6f 20   two buffers to 
1f3e0 70 67 73 7a 20 2b 20 70 61 64 64 69 6e 67 20 62  pgsz + padding b
1f3f0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f  ytes in size. */
1f400 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  .  sqlite3Fts5Bu
1f410 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
1f420 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1f430 72 2e 70 67 69 64 78 2c 20 6e 42 75 66 66 65 72  r.pgidx, nBuffer
1f440 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  );.  sqlite3Fts5
1f450 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
1f460 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69  c, &pWriter->wri
1f470 74 65 72 2e 62 75 66 2c 20 6e 42 75 66 66 65 72  ter.buf, nBuffer
1f480 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  );..  if( p->pId
1f490 78 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20  xWriter==0 ){.  
1f4a0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
1f4b0 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
1f4c0 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65  ig;.    fts5Inde
1f4d0 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
1f4e0 26 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  &p->pIdxWriter, 
1f4f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1f500 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
1f510 52 54 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71  RT INTO '%q'.'%q
1f520 5f 69 64 78 27 28 73 65 67 69 64 2c 74 65 72 6d  _idx'(segid,term
1f530 2c 70 67 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c  ,pgno) VALUES(?,
1f540 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20  ?,?)", .        
1f550 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
1f560 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
1f570 20 20 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66     ));.  }..  if
1f580 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1f590 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  OK ){.    /* Ini
1f5a0 74 69 61 6c 69 7a 65 20 74 68 65 20 34 2d 62 79  tialize the 4-by
1f5b0 74 65 20 6c 65 61 66 2d 70 61 67 65 20 68 65 61  te leaf-page hea
1f5c0 64 65 72 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a  der to 0x00. */.
1f5d0 20 20 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74      memset(pWrit
1f5e0 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 70  er->writer.buf.p
1f5f0 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70 57 72  , 0, 4);.    pWr
1f600 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1f610 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20  .n = 4;..    /* 
1f620 42 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Bind the current
1f630 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
1f640 69 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2d  id to the index-
1f650 77 72 69 74 65 72 2e 20 54 68 69 73 20 69 73 20  writer. This is 
1f660 61 6e 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69  an.    ** optimi
1f670 7a 61 74 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64  zation over bind
1f680 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c  ing the same val
1f690 75 65 20 6f 76 65 72 20 61 6e 64 20 6f 76 65 72  ue over and over
1f6a0 20 61 73 20 72 6f 77 73 20 61 72 65 0a 20 20 20   as rows are.   
1f6b0 20 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74   ** inserted int
1f6c0 6f 20 25 5f 69 64 78 20 62 79 20 74 68 65 20 63  o %_idx by the c
1f6d0 75 72 72 65 6e 74 20 77 72 69 74 65 72 2e 20 20  urrent writer.  
1f6e0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  */.    sqlite3_b
1f6f0 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57  ind_int(p->pIdxW
1f700 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65  riter, 1, pWrite
1f710 72 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a  r->iSegid);.  }.
1f720 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
1f730 72 20 70 49 74 65 72 20 77 61 73 20 75 73 65 64  r pIter was used
1f740 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1f750 75 67 68 20 74 68 65 20 69 6e 70 75 74 20 73 65  ugh the input se
1f760 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a  gments of on an.
1f770 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  ** incremental m
1f780 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  erge operation. 
1f790 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f7a0 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69   called if the i
1f7b0 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65  ncremental.** me
1f7c0 72 67 65 20 73 74 65 70 20 68 61 73 20 66 69 6e  rge step has fin
1f7d0 69 73 68 65 64 20 62 75 74 20 74 68 65 20 69 6e  ished but the in
1f7e0 70 75 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  put has not been
1f7f0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61   completely exha
1f800 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  usted..*/.static
1f810 20 76 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65   void fts5TrimSe
1f820 67 6d 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78  gments(Fts5Index
1f830 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70   *p, Fts5Iter *p
1f840 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Iter){.  int i;.
1f850 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
1f860 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c  ;.  memset(&buf,
1f870 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
1f880 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69  uffer));.  for(i
1f890 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
1f8a0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  g; i++){.    Fts
1f8b0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
1f8c0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d   &pIter->aSeg[i]
1f8d0 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ;.    if( pSeg->
1f8e0 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSeg==0 ){.     
1f8f0 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
1f900 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d   }else if( pSeg-
1f910 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20  >pLeaf==0 ){.   
1f920 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66     /* All keys f
1f930 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73  rom this input s
1f940 65 67 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e  egment have been
1f950 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f 20 74   transfered to t
1f960 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  he output..     
1f970 20 2a 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65   ** Set both the
1f980 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20   first and last 
1f990 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20  page-numbers to 
1f9a0 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  0 to indicate th
1f9b0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
1f9c0 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65  segment is now e
1f9d0 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70  mpty. */.      p
1f9e0 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c  Seg->pSeg->pgnoL
1f9f0 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ast = 0;.      p
1fa00 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46  Seg->pSeg->pgnoF
1fa10 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  irst = 0;.    }e
1fa20 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1fa30 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72  Off = pSeg->iTer
1fa40 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20  mLeafOffset;    
1fa50 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65   /* Offset on ne
1fa60 77 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67  w first leaf pag
1fa70 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
1fa80 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20  LeafRowid;.     
1fa90 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
1faa0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 20  ;.      int iId 
1fab0 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53  = pSeg->pSeg->iS
1fac0 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61  egid;.      u8 a
1fad0 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20  Hdr[4] = {0x00, 
1fae0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
1faf0 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52  };..      iLeafR
1fb00 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
1fb10 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 70  ENT_ROWID(iId, p
1fb20 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
1fb30 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61  no);.      pData
1fb40 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
1fb50 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  p, iLeafRowid);.
1fb60 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 20        if( pData 
1fb70 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
1fb80 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b  ufferZero(&buf);
1fb90 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1fba0 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
1fbb0 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29  &buf, pData->nn)
1fbc0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1fbd0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1fbe0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a  p->rc, &buf, siz
1fbf0 65 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72 29  eof(aHdr), aHdr)
1fc00 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1fc10 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1fc20 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1fc30 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20  Seg->term.n);.  
1fc40 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fc50 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1fc60 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74  c, &buf, pSeg->t
1fc70 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72  erm.n, pSeg->ter
1fc80 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74  m.p);.        ft
1fc90 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1fca0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1fcb0 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69   pData->szLeaf-i
1fcc0 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69  Off, &pData->p[i
1fcd0 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  Off]);.        i
1fce0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1fcf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1fd00 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65   /* Set the szLe
1fd10 61 66 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20  af field */.    
1fd20 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36        fts5PutU16
1fd30 28 26 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36  (&buf.p[2], (u16
1fd40 29 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20  )buf.n);.       
1fd50 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   }..        /* S
1fd60 65 74 20 75 70 20 74 68 65 20 6e 65 77 20 70 61  et up the new pa
1fd70 67 65 2d 69 6e 64 65 78 20 61 72 72 61 79 20 2a  ge-index array *
1fd80 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
1fd90 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1fda0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34  (&p->rc, &buf, 4
1fdb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1fdc0 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d  Seg->iLeafPgno==
1fdd0 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50  pSeg->iTermLeafP
1fde0 67 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 26 26  gno .         &&
1fdf0 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63   pSeg->iEndofDoc
1fe00 6c 69 73 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65  list<pData->szLe
1fe10 61 66 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  af .        ){. 
1fe20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 69           int nDi
1fe30 66 66 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65  ff = pData->szLe
1fe40 61 66 20 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f  af - pSeg->iEndo
1fe50 66 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  fDoclist;.      
1fe60 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1fe70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1fe80 63 2c 20 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d  c, &buf, buf.n -
1fe90 20 31 20 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b   1 - nDiff - 4);
1fea0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
1feb0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1fec0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20  &p->rc, &buf, . 
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 61               pDa
1fee0 74 61 2d 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69  ta->nn - pSeg->i
1fef0 50 67 69 64 78 4f 66 66 2c 20 26 70 44 61 74 61  PgidxOff, &pData
1ff00 2d 3e 70 5b 70 53 65 67 2d 3e 69 50 67 69 64 78  ->p[pSeg->iPgidx
1ff10 4f 66 66 5d 0a 20 20 20 20 20 20 20 20 20 20 29  Off].          )
1ff20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1ff30 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
1ff40 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
1ff50 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
1ff60 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 70 53 65  >pgnoFirst = pSe
1ff70 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
1ff80 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
1ff90 74 61 44 65 6c 65 74 65 28 70 2c 20 46 54 53 35  taDelete(p, FTS5
1ffa0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
1ffb0 49 64 2c 20 31 29 2c 20 69 4c 65 61 66 52 6f 77  Id, 1), iLeafRow
1ffc0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
1ffd0 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c  5DataWrite(p, iL
1ffe0 65 61 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c  eafRowid, buf.p,
1fff0 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d   buf.n);.      }
20000 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73  .    }.  }.  fts
20010 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
20020 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
20030 64 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b  d fts5MergeChunk
20040 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
20050 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69  Index *p, .  voi
20060 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73  d *pCtx, .  cons
20070 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
20080 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74  t nChunk.){.  Ft
20090 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
200a0 69 74 65 72 20 3d 20 28 46 74 73 35 53 65 67 57  iter = (Fts5SegW
200b0 72 69 74 65 72 2a 29 70 43 74 78 3b 0a 20 20 66  riter*)pCtx;.  f
200c0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
200d0 73 6c 69 73 74 44 61 74 61 28 70 2c 20 70 57 72  slistData(p, pWr
200e0 69 74 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43  iter, pChunk, nC
200f0 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  hunk);.}../*.**.
20100 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
20110 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
20120 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  el(.  Fts5Index 
20130 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
20140 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
20150 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
20160 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
20170 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
20180 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75    /* IN/OUT: Stu
20190 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
201a0 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20  /.  int iLvl,   
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
201d0 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  read input from 
201e0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20  */.  int *pnRem 
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20200 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70       /* Write up
20210 20 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75   to this many ou
20220 74 70 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29  tput leaves */.)
20230 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
20240 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
20250 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74  Struct;.  Fts5St
20260 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
20270 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
20280 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46  Level[iLvl];.  F
20290 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
202a0 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74  l *pLvlOut;.  Ft
202b0 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  s5Iter *pIter = 
202c0 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72  0;       /* Iter
202d0 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70  ator to read inp
202e0 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ut data */.  int
202f0 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20   nRem = pnRem ? 
20300 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20  *pnRem : 0;  /* 
20310 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61 67 65  Output leaf page
20320 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20  s left to write 
20330 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b  */.  int nInput;
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20360 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  f input segments
20370 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
20380 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20  ter writer;     
20390 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
203a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
203b0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
203c0 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f   *pSeg;     /* O
203d0 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f  utput segment */
203e0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
203f0 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73  rm;.  int bOldes
20400 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
20410 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20420 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
20430 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73  ent is the oldes
20440 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 74 61  t */.  int eDeta
20450 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  il = p->pConfig-
20460 3e 65 44 65 74 61 69 6c 3b 0a 20 20 63 6f 6e 73  >eDetail;.  cons
20470 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54  t int flags = FT
20480 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
20490 4f 55 54 50 55 54 3b 0a 20 20 69 6e 74 20 62 54  OUTPUT;.  int bT
204a0 65 72 6d 57 72 69 74 74 65 6e 20 3d 20 30 3b 20  ermWritten = 0; 
204b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
204c0 65 20 69 66 20 63 75 72 72 65 6e 74 20 74 65 72  e if current ter
204d0 6d 20 61 6c 72 65 61 64 79 20 6f 75 74 70 75 74  m already output
204e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
204f0 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
20500 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  vel );.  assert(
20510 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70   pLvl->nMerge<=p
20520 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20  Lvl->nSeg );..  
20530 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20  memset(&writer, 
20540 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
20550 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d  gWriter));.  mem
20560 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
20570 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
20580 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e  );.  if( pLvl->n
20590 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76  Merge ){.    pLv
205a0 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d  lOut = &pStruct-
205b0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b  >aLevel[iLvl+1];
205c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76  .    assert( pLv
205d0 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a  lOut->nSeg>0 );.
205e0 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
205f0 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70  l->nMerge;.    p
20600 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e  Seg = &pLvlOut->
20610 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53  aSeg[pLvlOut->nS
20620 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35  eg-1];..    fts5
20630 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72  WriteInit(p, &wr
20640 69 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67  iter, pSeg->iSeg
20650 69 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e  id);.    writer.
20660 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53  writer.pgno = pS
20670 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a  eg->pgnoLast+1;.
20680 20 20 20 20 77 72 69 74 65 72 2e 69 42 74 50 61      writer.iBtPa
20690 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ge = 0;.  }else{
206a0 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20  .    int iSegid 
206b0 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  = fts5AllocateSe
206c0 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b  gid(p, pStruct);
206d0 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20  ..    /* Extend 
206e0 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  the Fts5Structur
206f0 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75  e object as requ
20700 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  ired to ensure t
20710 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a  he output.    **
20720 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e   segment exists.
20730 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c   */.    if( iLvl
20740 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ==pStruct->nLeve
20750 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73  l-1 ){.      fts
20760 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
20770 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72  el(&p->rc, ppStr
20780 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72  uct);.      pStr
20790 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
207a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
207b0 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
207c0 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
207d0 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20  uct, iLvl+1, 1, 
207e0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  0);.    if( p->r
207f0 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  c ) return;.    
20800 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
20810 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
20820 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53     pLvlOut = &pS
20830 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
20840 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35  vl+1];..    fts5
20850 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72  WriteInit(p, &wr
20860 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a  iter, iSegid);..
20870 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
20880 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68  ew segment to th
20890 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a  e output level *
208a0 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c  /.    pSeg = &pL
208b0 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
208c0 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20  Out->nSeg];.    
208d0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b  pLvlOut->nSeg++;
208e0 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46  .    pSeg->pgnoF
208f0 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53  irst = 1;.    pS
20900 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  eg->iSegid = iSe
20910 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74  gid;.    pStruct
20920 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20  ->nSegment++;.. 
20930 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74     /* Read input
20940 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e   from all segmen
20950 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ts in the input 
20960 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e  level */.    nIn
20970 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  put = pLvl->nSeg
20980 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20  ;.  }.  bOldest 
20990 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  = (pLvlOut->nSeg
209a0 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e  ==1 && pStruct->
209b0 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b  nLevel==iLvl+2);
209c0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c  ..  assert( iLvl
209d0 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73  >=0 );.  for(fts
209e0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
209f0 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c   pStruct, flags,
20a00 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20   0, 0, 0, iLvl, 
20a10 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b  nInput, &pIter);
20a20 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
20a30 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
20a40 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
20a50 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
20a60 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20   pIter, 0, 0).  
20a70 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
20a80 65 72 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26  er *pSegIter = &
20a90 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
20aa0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
20ab0 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20  irst ];.    int 
20ac0 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20  nPos;           
20ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73            /* pos
20ae0 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
20af0 66 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20  field value */. 
20b00 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20     int nTerm;.  
20b10 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
20b20 6d 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m;..    pTerm = 
20b30 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
20b40 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72 6d 29  m(pIter, &nTerm)
20b50 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72 6d 21  ;.    if( nTerm!
20b60 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d  =term.n || memcm
20b70 70 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c  p(pTerm, term.p,
20b80 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20   nTerm) ){.     
20b90 20 69 66 28 20 70 6e 52 65 6d 20 26 26 20 77 72   if( pnRem && wr
20ba0 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65  iter.nLeafWritte
20bb0 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20  n>nRem ){.      
20bc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20bd0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
20be0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65  rSet(&p->rc, &te
20bf0 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
20c00 29 3b 0a 20 20 20 20 20 20 62 54 65 72 6d 57 72  );.      bTermWr
20c10 69 74 74 65 6e 20 3d 30 3b 0a 20 20 20 20 7d 0a  itten =0;.    }.
20c20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
20c30 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69  r key annihilati
20c40 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  on. */.    if( p
20c50 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30  SegIter->nPos==0
20c60 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20   && (bOldest || 
20c70 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d  pSegIter->bDel==
20c80 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  0) ) continue;..
20c90 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
20ca0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 54 65 72  QLITE_OK && bTer
20cb0 6d 57 72 69 74 74 65 6e 3d 3d 30 20 29 7b 0a 20  mWritten==0 ){. 
20cc0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
20cd0 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65  a new term. Appe
20ce0 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  nd a term to the
20cf0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
20d00 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72   */.      fts5Wr
20d10 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
20d20 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c   &writer, nTerm,
20d30 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62   pTerm);.      b
20d40 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 20 31 3b  TermWritten = 1;
20d50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
20d60 70 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20  ppend the rowid 
20d70 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f  to the output */
20d80 0a 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53  .    /* WRITEPOS
20d90 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20  LISTSIZE */.    
20da0 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
20db0 6f 77 69 64 28 70 2c 20 26 77 72 69 74 65 72 2c  owid(p, &writer,
20dc0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
20dd0 77 69 64 28 70 49 74 65 72 29 29 3b 0a 0a 20 20  wid(pIter));..  
20de0 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
20df0 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
20e00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  ){.      if( pSe
20e10 67 49 74 65 72 2d 3e 62 44 65 6c 20 29 7b 0a 20  gIter->bDel ){. 
20e20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
20e30 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
20e40 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72  ->rc, &writer.wr
20e50 69 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20  iter.buf, 0);.  
20e60 20 20 20 20 20 20 69 66 28 20 70 53 65 67 49 74        if( pSegIt
20e70 65 72 2d 3e 6e 50 6f 73 3e 30 20 29 7b 0a 20 20  er->nPos>0 ){.  
20e80 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20e90 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
20ea0 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77  p->rc, &writer.w
20eb0 72 69 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20  riter.buf, 0);. 
20ec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20ed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20ee0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
20ef0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61  position-list da
20f00 74 61 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ta to the output
20f10 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d   */.      nPos =
20f20 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a   pSegIter->nPos*
20f30 32 20 2b 20 70 53 65 67 49 74 65 72 2d 3e 62 44  2 + pSegIter->bD
20f40 65 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  el;.      fts5Bu
20f50 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
20f60 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72  (&p->rc, &writer
20f70 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 50 6f  .writer.buf, nPo
20f80 73 29 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68  s);.      fts5Ch
20f90 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53  unkIterate(p, pS
20fa0 65 67 49 74 65 72 2c 20 28 76 6f 69 64 2a 29 26  egIter, (void*)&
20fb0 77 72 69 74 65 72 2c 20 66 74 73 35 4d 65 72 67  writer, fts5Merg
20fc0 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b  eChunkCallback);
20fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20fe0 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74 20   Flush the last 
20ff0 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64 69 73  leaf page to dis
21000 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  k. Set the outpu
21010 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  t segment b-tree
21020 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64   height.  ** and
21030 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
21040 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20 73 61  number at the sa
21050 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66  me time.  */.  f
21060 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70  ts5WriteFinish(p
21070 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53 65 67  , &writer, &pSeg
21080 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20  ->pgnoLast);..  
21090 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
210a0 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
210b0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  {.    int i;..  
210c0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
210d0 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e  redundant segmen
210e0 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  ts from the %_da
210f0 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ta table */.    
21100 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75  for(i=0; i<nInpu
21110 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  t; i++){.      f
21120 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67  ts5DataRemoveSeg
21130 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53  ment(p, pLvl->aS
21140 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20  eg[i].iSegid);. 
21150 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d     }..    /* Rem
21160 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e  ove the redundan
21170 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  t segments from 
21180 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20  the input level 
21190 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  */.    if( pLvl-
211a0 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b  >nSeg!=nInput ){
211b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65  .      int nMove
211c0 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d   = (pLvl->nSeg -
211d0 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f   nInput) * sizeo
211e0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
211f0 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d  egment);.      m
21200 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65  emmove(pLvl->aSe
21210 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e  g, &pLvl->aSeg[n
21220 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a  Input], nMove);.
21230 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 75 63      }.    pStruc
21240 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e  t->nSegment -= n
21250 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
21260 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b  >nSeg -= nInput;
21270 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  .    pLvl->nMerg
21280 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
21290 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30  Seg->pgnoLast==0
212a0 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75   ){.      pLvlOu
212b0 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20  t->nSeg--;.     
212c0 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
212d0 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  nt--;.    }.  }e
212e0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
212f0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e   pSeg->pgnoLast>
21300 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69  0 );.    fts5Tri
21310 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74  mSegments(p, pIt
21320 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e  er);.    pLvl->n
21330 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a  Merge = nInput;.
21340 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69    }..  fts5Multi
21350 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b  IterFree(pIter);
21360 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
21370 65 28 26 74 65 72 6d 29 3b 0a 20 20 69 66 28 20  e(&term);.  if( 
21380 70 6e 52 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d  pnRem ) *pnRem -
21390 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72  = writer.nLeafWr
213a0 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  itten;.}../*.** 
213b0 44 6f 20 75 70 20 74 6f 20 6e 50 67 20 70 61 67  Do up to nPg pag
213c0 65 73 20 6f 66 20 61 75 74 6f 6d 65 72 67 65 20  es of automerge 
213d0 77 6f 72 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65  work on the inde
213e0 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  x..**.** Return 
213f0 74 72 75 65 20 69 66 20 61 6e 79 20 63 68 61 6e  true if any chan
21400 67 65 73 20 77 65 72 65 20 61 63 74 75 61 6c 6c  ges were actuall
21410 79 20 6d 61 64 65 2c 20 6f 72 20 66 61 6c 73 65  y made, or false
21420 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
21430 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
21440 64 65 78 4d 65 72 67 65 28 0a 20 20 46 74 73 35  dexMerge(.  Fts5
21450 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
21460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21470 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
21480 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
21490 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
214a0 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
214b0 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
214c0 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
214d0 0a 20 20 69 6e 74 20 6e 50 67 2c 20 20 20 20 20  .  int nPg,     
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 2f 2a 20 50 61 67 65 73 20 6f 66 20 77     /* Pages of w
21500 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 69  ork to do */.  i
21510 6e 74 20 6e 4d 69 6e 20 20 20 20 20 20 20 20 20  nt nMin         
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21530 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  * Minimum number
21540 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
21550 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  merge */.){.  in
21560 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20 20  t nRem = nPg;.  
21570 69 6e 74 20 62 52 65 74 20 3d 20 30 3b 0a 20 20  int bRet = 0;.  
21580 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
21590 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
215a0 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52 65  ct;.  while( nRe
215b0 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  m>0 && p->rc==SQ
215c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
215d0 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
215e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
215f0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
21600 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69   levels */.    i
21610 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b  nt iBestLvl = 0;
21620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
21630 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68 65  vel offering the
21640 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67 6d   most input segm
21650 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
21660 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  nBest = 0;      
21670 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21680 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
21690 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76 65  nts on best leve
216a0 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  l */..    /* Set
216b0 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68 65   iBestLvl to the
216c0 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69   level to read i
216d0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66 72  nput segments fr
216e0 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  om. */.    asser
216f0 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  t( pStruct->nLev
21700 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  el>0 );.    for(
21710 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
21720 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
21730 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  vl++){.      Fts
21740 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
21750 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
21760 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
21770 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
21780 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20  nMerge ){.      
21790 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
217a0 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  ge>nBest ){.    
217b0 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d        iBestLvl =
217c0 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20   iLvl;.         
217d0 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e   nBest = pLvl->n
217e0 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  Merge;.        }
217f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
21800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21810 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65  ( pLvl->nSeg>nBe
21820 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42  st ){.        nB
21830 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  est = pLvl->nSeg
21840 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74 4c  ;.        iBestL
21850 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  vl = iLvl;.     
21860 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
21870 20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74 69   If nBest is sti
21880 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20 69  ll 0, then the i
21890 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d 70  ndex must be emp
218a0 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ty. */.#ifdef SQ
218b0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66  LITE_DEBUG.    f
218c0 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74  or(iLvl=0; nBest
218d0 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72  ==0 && iLvl<pStr
218e0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
218f0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  l++){.      asse
21900 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  rt( pStruct->aLe
21910 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d  vel[iLvl].nSeg==
21920 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  0 );.    }.#endi
21930 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73 74  f..    if( nBest
21940 3c 6e 4d 69 6e 20 26 26 20 70 53 74 72 75 63 74  <nMin && pStruct
21950 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76  ->aLevel[iBestLv
21960 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  l].nMerge==0 ){.
21970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21980 20 7d 0a 20 20 20 20 62 52 65 74 20 3d 20 31 3b   }.    bRet = 1;
21990 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65  .    fts5IndexMe
219a0 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74  rgeLevel(p, &pSt
219b0 72 75 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20  ruct, iBestLvl, 
219c0 26 6e 52 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  &nRem);.    if( 
219d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
219e0 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
219f0 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d  vel[iBestLvl].nM
21a00 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erge==0 ){.     
21a10 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
21a20 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76  omote(p, iBestLv
21a30 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  l+1, pStruct);. 
21a40 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74     }.  }.  *ppSt
21a50 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
21a60 20 20 72 65 74 75 72 6e 20 62 52 65 74 3b 0a 7d    return bRet;.}
21a70 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ../*.** A total 
21a80 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61  of nLeaf leaf pa
21a90 67 65 73 20 6f 66 20 64 61 74 61 20 68 61 73 20  ges of data has 
21aa0 6a 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65  just been flushe
21ab0 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a  d to a level-0.*
21ac0 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20  * segment. This 
21ad0 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
21ae0 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74   the write-count
21af0 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  er accordingly a
21b00 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73  nd, if.** necess
21b10 61 72 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e  ary, performs in
21b20 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
21b30 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  work..**.** If a
21b40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
21b50 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
21b60 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
21b70 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
21b80 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
21b90 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
21ba0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
21bb0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21bc0 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72  fts5IndexAutomer
21bd0 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
21be0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21bf0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
21c00 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
21c10 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
21c20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
21c30 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
21c40 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
21c50 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
21c60 20 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   nLeaf          
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c80 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
21c90 20 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69   leaves just wri
21ca0 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tten */.){.  if(
21cb0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
21cc0 4b 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  K && p->pConfig-
21cd0 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b  >nAutomerge>0 ){
21ce0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
21cf0 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
21d00 70 53 74 72 75 63 74 3b 0a 20 20 20 20 75 36 34  pStruct;.    u64
21d10 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
21d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
21d30 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77  itial value of w
21d40 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  rite-counter */.
21d50 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20      int nWork;  
21d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
21d80 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65  ork-quanta to pe
21d90 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  rform */.    int
21da0 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
21db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21dc0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
21dd0 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
21de0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   */..    /* Upda
21df0 74 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75  te the write-cou
21e00 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e  nter. While doin
21e10 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e  g so, set nWork.
21e20 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d   */.    nWrite =
21e30 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
21e40 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f  Counter;.    nWo
21e50 72 6b 20 3d 20 28 69 6e 74 29 28 28 28 6e 57 72  rk = (int)(((nWr
21e60 69 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70  ite + nLeaf) / p
21e70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28  ->nWorkUnit) - (
21e80 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72  nWrite / p->nWor
21e90 6b 55 6e 69 74 29 29 3b 0a 20 20 20 20 70 53 74  kUnit));.    pSt
21ea0 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
21eb0 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20  ter += nLeaf;.  
21ec0 20 20 6e 52 65 6d 20 3d 20 28 69 6e 74 29 28 70    nRem = (int)(p
21ed0 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57  ->nWorkUnit * nW
21ee0 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e  ork * pStruct->n
21ef0 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73  Level);..    fts
21f00 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 70  5IndexMerge(p, p
21f10 70 53 74 72 75 63 74 2c 20 6e 52 65 6d 2c 20 70  pStruct, nRem, p
21f20 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f  ->pConfig->nAuto
21f30 6d 65 72 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  merge);.  }.}..s
21f40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
21f50 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28  ndexCrisismerge(
21f60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f80 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
21f90 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
21fa0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
21fb0 70 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f  pStruct        /
21fc0 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
21fd0 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
21fe0 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ndex */.){.  con
21ff0 73 74 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d  st int nCrisis =
22000 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72   p->pConfig->nCr
22010 69 73 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73  isisMerge;.  Fts
22020 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
22030 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
22040 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b  .  int iLvl = 0;
22050 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
22060 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
22070 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e  pStruct->nLevel>
22080 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
22090 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
220a0 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
220b0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43  l[iLvl].nSeg>=nC
220c0 72 69 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73  risis ){.    fts
220d0 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
220e0 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c  (p, &pStruct, iL
220f0 76 6c 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  vl, 0);.    asse
22100 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
22110 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d  E_OK || pStruct-
22120 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29  >nLevel>(iLvl+1)
22130 20 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75   );.    fts5Stru
22140 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20  cturePromote(p, 
22150 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29  iLvl+1, pStruct)
22160 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20  ;.    iLvl++;.  
22170 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20  }.  *ppStruct = 
22180 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74  pStruct;.}..stat
22190 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
221a0 52 65 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78  Return(Fts5Index
221b0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
221c0 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20   p->rc;.  p->rc 
221d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72  = SQLITE_OK;.  r
221e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70  eturn rc;.}..typ
221f0 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
22200 46 6c 75 73 68 43 74 78 20 46 74 73 35 46 6c 75  FlushCtx Fts5Flu
22210 73 68 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74  shCtx;.struct Ft
22220 73 35 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46  s5FlushCtx {.  F
22230 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  ts5Index *pIdx;.
22240 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
22250 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a  writer; .};../*.
22260 2a 2a 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d  ** Buffer aBuf[]
22270 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74   contains a list
22280 20 6f 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c   of varints, all
22290 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f   small enough to
222a0 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d   fit.** in a 32-
222b0 62 69 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74  bit integer. Ret
222c0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
222d0 74 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 66  the largest pref
222e0 69 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c  ix of this .** l
222f0 69 73 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f  ist nMax bytes o
22300 72 20 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a  r less in size..
22310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
22320 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28  s5PoslistPrefix(
22330 63 6f 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20  const u8 *aBuf, 
22340 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  int nMax){.  int
22350 20 72 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d   ret;.  u32 dumm
22360 79 3b 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47  y;.  ret = fts5G
22370 65 74 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c  etVarint32(aBuf,
22380 20 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72   dummy);.  if( r
22390 65 74 3c 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77  et<nMax ){.    w
223a0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
223b0 20 69 6e 74 20 69 20 3d 20 66 74 73 35 47 65 74   int i = fts5Get
223c0 56 61 72 69 6e 74 33 32 28 26 61 42 75 66 5b 72  Varint32(&aBuf[r
223d0 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  et], dummy);.   
223e0 20 20 20 69 66 28 20 28 72 65 74 20 2b 20 69 29     if( (ret + i)
223f0 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b   > nMax ) break;
22400 0a 20 20 20 20 20 20 72 65 74 20 2b 3d 20 69 3b  .      ret += i;
22410 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22420 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
22430 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74  * Flush the cont
22440 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  ents of in-memor
22450 79 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61  y hash table iHa
22460 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65  sh to a new leve
22470 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20  l-0 .** segment 
22480 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70  on disk. Also up
22490 64 61 74 65 20 74 68 65 20 63 6f 72 72 65 73 70  date the corresp
224a0 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72 65  onding structure
224b0 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49   record..**.** I
224c0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
224d0 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  s, set the Fts5I
224e0 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
224f0 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  de. If an error 
22500 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
22510 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
22520 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
22530 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
22540 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48  id fts5FlushOneH
22550 61 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ash(Fts5Index *p
22560 29 7b 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70  ){.  Fts5Hash *p
22570 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b  Hash = p->pHash;
22580 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
22590 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74   *pStruct;.  int
225a0 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70   iSegid;.  int p
225b0 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20  gnoLast = 0;    
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
225d0 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
225e0 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
225f0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
22600 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
22610 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
22620 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ure and allocate
22630 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69   a new segment-i
22640 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  d.  ** for the n
22650 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65  ew level-0 segme
22660 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63  nt.  */.  pStruc
22670 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
22680 65 52 65 61 64 28 70 29 3b 0a 20 20 69 53 65 67  eRead(p);.  iSeg
22690 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74  id = fts5Allocat
226a0 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63  eSegid(p, pStruc
226b0 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
226c0 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
226d0 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 20  ;..  if( iSegid 
226e0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
226f0 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66   pgsz = p->pConf
22700 69 67 2d 3e 70 67 73 7a 3b 0a 20 20 20 20 69 6e  ig->pgsz;.    in
22710 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70  t eDetail = p->p
22720 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
22730 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
22740 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
22750 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e     /* New segmen
22760 74 20 77 69 74 68 69 6e 20 70 53 74 72 75 63 74  t within pStruct
22770 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
22780 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20  er *pBuf;       
22790 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
227a0 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65  in which to asse
227b0 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a  mble leaf page *
227c0 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
227d0 20 2a 70 50 67 69 64 78 3b 20 20 20 20 20 20 20   *pPgidx;       
227e0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
227f0 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
22800 6c 65 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20  le pgidx */..   
22810 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
22820 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73 35 57  riter;.    fts5W
22830 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
22840 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  ter, iSegid);.. 
22850 20 20 20 70 42 75 66 20 3d 20 26 77 72 69 74 65     pBuf = &write
22860 72 2e 77 72 69 74 65 72 2e 62 75 66 3b 0a 20 20  r.writer.buf;.  
22870 20 20 70 50 67 69 64 78 20 3d 20 26 77 72 69 74    pPgidx = &writ
22880 65 72 2e 77 72 69 74 65 72 2e 70 67 69 64 78 3b  er.writer.pgidx;
22890 0a 0a 20 20 20 20 2f 2a 20 66 74 73 35 57 72 69  ..    /* fts5Wri
228a0 74 65 49 6e 69 74 28 29 20 73 68 6f 75 6c 64 20  teInit() should 
228b0 68 61 76 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  have initialized
228c0 20 74 68 65 20 62 75 66 66 65 72 73 20 74 6f 20   the buffers to 
228d0 28 6d 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20  (most likely).  
228e0 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
228f0 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 2e   space required.
22900 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
22910 70 2d 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e  p->rc || pBuf->n
22920 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46  Space>=(pgsz + F
22930 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
22940 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
22950 20 70 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64 78   p->rc || pPgidx
22960 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20  ->nSpace>=(pgsz 
22970 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
22980 49 4e 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ING) );..    /* 
22990 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74  Begin scanning t
229a0 68 72 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c  hrough hash tabl
229b0 65 20 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20  e entries. This 
229c0 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66  loop runs once f
229d0 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74  or each.    ** t
229e0 65 72 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72  erm/doclist curr
229f0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74  ently stored wit
22a00 68 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62  hin the hash tab
22a10 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
22a20 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22a30 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
22a40 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
22a50 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20  ScanInit(pHash, 
22a60 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
22a70 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
22a80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73  QLITE_OK && 0==s
22a90 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
22aa0 61 6e 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a  anEof(pHash) ){.
22ab0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
22ac0 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *zTerm;        
22ad0 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
22ae0 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20  aining term */. 
22af0 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
22b00 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
22b10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
22b20 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20  oclist for this 
22b30 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  term */.      in
22b40 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  t nDoclist;     
22b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
22b60 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20  e of doclist in 
22b70 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20  bytes */..      
22b80 2f 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 72  /* Write the ter
22b90 6d 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79  m for this entry
22ba0 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20   to disk. */.   
22bb0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
22bc0 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73  shScanEntry(pHas
22bd0 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63  h, &zTerm, &pDoc
22be0 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29  list, &nDoclist)
22bf0 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
22c00 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26  eAppendTerm(p, &
22c10 77 72 69 74 65 72 2c 20 28 69 6e 74 29 73 74 72  writer, (int)str
22c20 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e  len(zTerm), (con
22c30 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20  st u8*)zTerm);. 
22c40 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
22c50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
22c60 6b 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  k;..      assert
22c70 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52  ( writer.bFirstR
22c80 6f 77 69 64 49 6e 50 61 67 65 3d 3d 30 20 29 3b  owidInPage==0 );
22c90 0a 20 20 20 20 20 20 69 66 28 20 70 67 73 7a 3e  .      if( pgsz>
22ca0 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69  =(pBuf->n + pPgi
22cb0 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74  dx->n + nDoclist
22cc0 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20   + 1) ){.       
22cd0 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64   /* The entire d
22ce0 6f 63 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oclist will fit 
22cf0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
22d00 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eaf. */.        
22d10 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
22d20 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
22d30 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73  Doclist, nDoclis
22d40 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
22d50 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f  .        i64 iRo
22d60 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wid = 0;.       
22d70 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
22d80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
22d90 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  f = 0;..        
22da0 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f  /* The entire do
22db0 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66  clist will not f
22dc0 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e  it on this leaf.
22dd0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a   The following .
22de0 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20          ** loop 
22df0 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
22e00 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74 68   the poslists th
22e10 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
22e20 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20  urrent .        
22e30 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a  ** doclist.  */.
22e40 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
22e50 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22e60 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  && iOff<nDoclist
22e70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   ){.          iO
22e80 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
22e90 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  int(&pDoclist[iO
22ea0 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
22eb0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ta);.          i
22ec0 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
22ed0 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
22ee0 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72        if( writer
22ef0 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  .bFirstRowidInPa
22f00 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
22f10 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42    fts5PutU16(&pB
22f20 75 66 2d 3e 70 5b 30 5d 2c 20 28 75 31 36 29 70  uf->p[0], (u16)p
22f30 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69  Buf->n);   /* fi
22f40 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67  rst rowid on pag
22f50 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
22f60 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
22f70 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
22f80 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
22f90 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  n], iRowid);.   
22fa0 20 20 20 20 20 20 20 20 20 77 72 69 74 65 72 2e           writer.
22fb0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
22fc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
22fd0 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64     fts5WriteDlid
22fe0 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74  xAppend(p, &writ
22ff0 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  er, iRowid);.   
23000 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23010 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
23020 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
23030 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
23040 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65  >p[pBuf->n], iDe
23050 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
23060 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
23070 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
23080 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20  f->nSpace );..  
23090 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65 74          if( eDet
230a0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
230b0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _NONE ){.       
230c0 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44       if( iOff<nD
230d0 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69  oclist && pDocli
230e0 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20  st[iOff]==0 ){. 
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75               pBu
23100 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20  f->p[pBuf->n++] 
23110 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
23120 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20     iOff++;.     
23130 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66           if( iOf
23140 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44  f<nDoclist && pD
23150 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20  oclist[iOff]==0 
23160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23170 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d     pBuf->p[pBuf-
23180 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  >n++] = 0;.     
23190 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b             iOff+
231a0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
231b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
231c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
231d0 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69   (pBuf->n + pPgi
231e0 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a  dx->n)>=pgsz ){.
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
23200 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
23210 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20  (p, &writer);.  
23220 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23240 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75           int bDu
23250 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mmy;.           
23260 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
23270 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79         int nCopy
23280 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73   = fts5GetPoslis
23290 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b  tSize(&pDoclist[
232a0 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
232b0 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  Dummy);.        
232c0 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f      nCopy += nPo
232d0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  s;.            i
232e0 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  f( (pBuf->n + pP
232f0 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29  gidx->n + nCopy)
23300 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20   <= pgsz ){.    
23310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23320 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20   entire poslist 
23330 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
23340 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f  current leaf. So
23350 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20   copy.          
23360 20 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65      ** it in one
23370 20 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   go. */.        
23380 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
23390 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
233a0 42 75 66 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69  Buf, &pDoclist[i
233b0 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  Off], nCopy);.  
233c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
233d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
233e0 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73  * The entire pos
233f0 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69  list will not fi
23400 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20  t on this leaf. 
23410 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20  So it needs.    
23420 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
23430 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73  be broken into s
23440 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ections. The onl
23450 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20  y qualification 
23460 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  being.          
23470 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68      ** that each
23480 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20   varint must be 
23490 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75  stored contiguou
234a0 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  sly.  */.       
234b0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20         const u8 
234c0 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f  *pPoslist = &pDo
234d0 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20  clist[iOff];.   
234e0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
234f0 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Pos = 0;.       
23500 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d         while( p-
23510 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
23520 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23530 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 70    int nSpace = p
23540 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20 2d 20  gsz - pBuf->n - 
23550 70 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20 20 20  pPgidx->n;.     
23560 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
23570 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
23580 20 20 20 20 20 20 69 66 28 20 28 6e 43 6f 70 79        if( (nCopy
23590 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65   - iPos)<=nSpace
235a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
235b0 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20        n = nCopy 
235c0 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  - iPos;.        
235d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
235e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235f0 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74   n = fts5Poslist
23600 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74  Prefix(&pPoslist
23610 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b  [iPos], nSpace);
23620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23630 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
23640 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29     assert( n>0 )
23650 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23660 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
23670 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
23680 20 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d   &pPoslist[iPos]
23690 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
236a0 20 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b        iPos += n;
236b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
236c0 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
236d0 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a  pPgidx->n)>=pgsz
236e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
236f0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
23700 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69  lushLeaf(p, &wri
23710 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
23720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23730 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
23740 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b  >=nCopy ) break;
23750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
23760 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23770 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20             iOff 
23780 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  += nCopy;.      
23790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
237a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
237b0 2a 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74  * TODO2: Doclist
237c0 20 74 65 72 6d 69 6e 61 74 6f 72 20 77 72 69 74   terminator writ
237d0 74 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ten here. */.   
237e0 20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42     /* pBuf->p[pB
237f0 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b  uf->n++] = '\0';
23800 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
23810 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d  ( pBuf->n<=pBuf-
23820 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20  >nSpace );.     
23830 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
23840 54 45 5f 4f 4b 20 29 20 73 71 6c 69 74 65 33 46  TE_OK ) sqlite3F
23850 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28  ts5HashScanNext(
23860 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20  pHash);.    }.  
23870 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
23880 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20  hClear(pHash);. 
23890 20 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69     fts5WriteFini
238a0 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26  sh(p, &writer, &
238b0 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20  pgnoLast);..    
238c0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
238d0 73 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20  s5Structure. It 
238e0 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
238f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
23900 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74  by the.    ** ft
23910 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
23920 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e  se() call below.
23930 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
23940 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20  ruct->nLevel==0 
23950 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
23960 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
23970 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29  p->rc, &pStruct)
23980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
23990 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
239a0 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
239b0 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  ruct, 0, 1, 0);.
239c0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
239d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
239e0 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
239f0 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65  t->aLevel[0].aSe
23a00 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  g[ pStruct->aLev
23a10 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a  el[0].nSeg++ ];.
23a20 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67        pSeg->iSeg
23a30 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
23a40 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
23a50 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53  st = 1;.      pS
23a60 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70  eg->pgnoLast = p
23a70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70  gnoLast;.      p
23a80 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
23a90 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ++;.    }.    ft
23aa0 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
23ab0 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74  te(p, 0, pStruct
23ac0 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e  );.  }..  fts5In
23ad0 64 65 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20  dexAutomerge(p, 
23ae0 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61  &pStruct, pgnoLa
23af0 73 74 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  st);.  fts5Index
23b00 43 72 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26  Crisismerge(p, &
23b10 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
23b20 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
23b30 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74  , pStruct);.  ft
23b40 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
23b50 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a  se(pStruct);.}..
23b60 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
23b70 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
23b80 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
23b90 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  h tables to the 
23ba0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
23bb0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
23bc0 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65  exFlush(Fts5Inde
23bd0 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65  x *p){.  /* Unle
23be0 73 73 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20  ss it is empty, 
23bf0 66 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74  flush the hash t
23c00 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a  able to disk */.
23c10 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e    if( p->nPendin
23c20 67 44 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73  gData ){.    ass
23c30 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b  ert( p->pHash );
23c40 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
23c50 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74  Data = 0;.    ft
23c60 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70  s5FlushOneHash(p
23c70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
23c80 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
23c90 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  fts5IndexOptimiz
23ca0 65 53 74 72 75 63 74 28 0a 20 20 46 74 73 35 49  eStruct(.  Fts5I
23cb0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
23cc0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
23cd0 63 74 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  ct.){.  Fts5Stru
23ce0 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
23cf0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
23d00 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
23d10 46 74 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a  Fts5Structure);.
23d20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74    int nSeg = pSt
23d30 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a  ruct->nSegment;.
23d40 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46    int i;..  /* F
23d50 69 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69  igure out if thi
23d60 73 20 73 74 72 75 63 74 75 72 65 20 72 65 71 75  s structure requ
23d70 69 72 65 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ires optimizatio
23d80 6e 2e 20 41 20 73 74 72 75 63 74 75 72 65 20 64  n. A structure d
23d90 6f 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 71  oes.  ** not req
23da0 75 69 72 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  uire optimizatio
23db0 6e 20 69 66 20 65 69 74 68 65 72 3a 0a 20 20 2a  n if either:.  *
23dc0 2a 0a 20 20 2a 2a 20 20 2b 20 69 74 20 63 6f 6e  *.  **  + it con
23dd0 73 69 73 74 73 20 6f 66 20 66 65 77 65 72 20 74  sists of fewer t
23de0 68 61 6e 20 74 77 6f 20 73 65 67 6d 65 6e 74 73  han two segments
23df0 2c 20 6f 72 20 0a 20 20 2a 2a 20 20 2b 20 61 6c  , or .  **  + al
23e00 6c 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6f  l segments are o
23e10 6e 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c  n the same level
23e20 2c 20 6f 72 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c  , or.  **  + all
23e30 20 73 65 67 6d 65 6e 74 73 20 65 78 63 65 70 74   segments except
23e40 20 6f 6e 65 20 61 72 65 20 63 75 72 72 65 6e 74   one are current
23e50 6c 79 20 69 6e 70 75 74 73 20 74 6f 20 61 20 6d  ly inputs to a m
23e60 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  erge operation..
23e70 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65    **.  ** In the
23e80 20 66 69 72 73 74 20 63 61 73 65 2c 20 72 65 74   first case, ret
23e90 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74 68 65  urn NULL. In the
23ea0 20 73 65 63 6f 6e 64 2c 20 69 6e 63 72 65 6d 65   second, increme
23eb0 6e 74 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74  nt the ref-count
23ec0 0a 20 20 2a 2a 20 6f 6e 20 2a 70 53 74 72 75 63  .  ** on *pStruc
23ed0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  t and return a c
23ee0 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  opy of the point
23ef0 65 72 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20  er to it..  */. 
23f00 20 69 66 28 20 6e 53 65 67 3c 32 20 29 20 72 65   if( nSeg<2 ) re
23f10 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
23f20 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  0; i<pStruct->nL
23f30 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
23f40 69 6e 74 20 6e 54 68 69 73 20 3d 20 70 53 74 72  int nThis = pStr
23f50 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e  uct->aLevel[i].n
23f60 53 65 67 3b 0a 20 20 20 20 69 66 28 20 6e 54 68  Seg;.    if( nTh
23f70 69 73 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e 54 68  is==nSeg || (nTh
23f80 69 73 3d 3d 6e 53 65 67 2d 31 20 26 26 20 70 53  is==nSeg-1 && pS
23f90 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  truct->aLevel[i]
23fa0 2e 6e 4d 65 72 67 65 3d 3d 6e 54 68 69 73 29 20  .nMerge==nThis) 
23fb0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
23fc0 75 63 74 75 72 65 52 65 66 28 70 53 74 72 75 63  uctureRef(pStruc
23fd0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
23fe0 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a   pStruct;.    }.
23ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
24000 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e  uct->aLevel[i].n
24010 4d 65 72 67 65 3c 3d 6e 54 68 69 73 20 29 3b 0a  Merge<=nThis );.
24020 20 20 7d 0a 0a 20 20 6e 42 79 74 65 20 2b 3d 20    }..  nByte += 
24030 28 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  (pStruct->nLevel
24040 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  +1) * sizeof(Fts
24050 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
24060 3b 0a 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35  ;.  pNew = (Fts5
24070 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74  Structure*)sqlit
24080 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
24090 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
240a0 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ..  if( pNew ){.
240b0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
240c0 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20  eLevel *pLvl;.  
240d0 20 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a    nByte = nSeg *
240e0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
240f0 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
24100 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20     pNew->nLevel 
24110 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  = pStruct->nLeve
24120 6c 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  l+1;.    pNew->n
24130 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65  Ref = 1;.    pNe
24140 77 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  w->nWriteCounter
24150 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69   = pStruct->nWri
24160 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70  teCounter;.    p
24170 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65  Lvl = &pNew->aLe
24180 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65  vel[pStruct->nLe
24190 76 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  vel];.    pLvl->
241a0 61 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75  aSeg = (Fts5Stru
241b0 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71  ctureSegment*)sq
241c0 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
241d0 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74  ero(&p->rc, nByt
241e0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c  e);.    if( pLvl
241f0 2d 3e 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20  ->aSeg ){.      
24200 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
24210 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75        int iSegOu
24220 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  t = 0;.      /* 
24230 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
24240 61 6c 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66 72  all segments, fr
24250 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
24260 65 73 74 2e 20 41 64 64 20 74 68 65 6d 20 74 6f  est. Add them to
24270 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
24280 77 20 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a 65  w Fts5Level obje
24290 63 74 20 73 6f 20 74 68 61 74 20 70 4c 76 6c 2d  ct so that pLvl-
242a0 3e 61 53 65 67 5b 30 5d 20 69 73 20 74 68 65 20  >aSeg[0] is the 
242b0 6f 6c 64 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  oldest.      ** 
242c0 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64  segment in the d
242d0 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20  ata structure.  
242e0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76  */.      for(iLv
242f0 6c 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l=pStruct->nLeve
24300 6c 2d 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69 4c  l-1; iLvl>=0; iL
24310 76 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66  vl--){.        f
24320 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
24330 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
24340 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
24350 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ++){.          p
24360 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75  Lvl->aSeg[iSegOu
24370 74 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c  t] = pStruct->aL
24380 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b  evel[iLvl].aSeg[
24390 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20  iSeg];.         
243a0 20 69 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20   iSegOut++;.    
243b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
243c0 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65      pNew->nSegme
243d0 6e 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20  nt = pLvl->nSeg 
243e0 3d 20 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73  = nSeg;.    }els
243f0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
24400 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  _free(pNew);.   
24410 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
24420 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
24430 20 70 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73 71   pNew;.}..int sq
24440 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
24450 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78  timize(Fts5Index
24460 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
24470 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
24480 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
24490 2a 70 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61 73  *pNew = 0;..  as
244a0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
244b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
244c0 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20  IndexFlush(p);. 
244d0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
244e0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
244f0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
24500 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a  Invalidate(p);..
24510 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
24520 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35  .    pNew = fts5
24530 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72  IndexOptimizeStr
24540 75 63 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b  uct(p, pStruct);
24550 0a 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63  .  }.  fts5Struc
24560 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
24570 75 63 74 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  uct);..  assert(
24580 20 70 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65 77   pNew==0 || pNew
24590 2d 3e 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a  ->nSegment>0 );.
245a0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
245b0 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20 20    int iLvl;.    
245c0 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65 77  for(iLvl=0; pNew
245d0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
245e0 53 65 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29 7b  Seg==0; iLvl++){
245f0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  }.    while( p->
24600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24610 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c   pNew->aLevel[iL
24620 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20  vl].nSeg>0 ){.  
24630 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46      int nRem = F
24640 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49  TS5_OPT_WORK_UNI
24650 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64  T;.      fts5Ind
24660 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
24670 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52  &pNew, iLvl, &nR
24680 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  em);.    }..    
24690 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
246a0 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  te(p, pNew);.   
246b0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
246c0 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d  lease(pNew);.  }
246d0 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ..  return fts5I
246e0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a  ndexReturn(p); .
246f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
24700 20 63 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c 65   called to imple
24710 6d 65 6e 74 20 74 68 65 20 73 70 65 63 69 61 6c  ment the special
24720 20 22 56 41 4c 55 45 53 28 27 6d 65 72 67 65 27   "VALUES('merge'
24730 2c 20 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20 49  , $nMerge)".** I
24740 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  NSERT command..*
24750 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
24760 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35  5IndexMerge(Fts5
24770 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d  Index *p, int nM
24780 65 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72  erge){.  Fts5Str
24790 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
247a0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
247b0 65 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53  ead(p);.  if( pS
247c0 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74  truct ){.    int
247d0 20 6e 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e 66   nMin = p->pConf
247e0 69 67 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b 0a  ig->nUsermerge;.
247f0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
24800 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
24810 20 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3c 30      if( nMerge<0
24820 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74   ){.      Fts5St
24830 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20  ructure *pNew = 
24840 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  fts5IndexOptimiz
24850 65 53 74 72 75 63 74 28 70 2c 20 70 53 74 72 75  eStruct(p, pStru
24860 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53  ct);.      fts5S
24870 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
24880 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
24890 70 53 74 72 75 63 74 20 3d 20 70 4e 65 77 3b 0a  pStruct = pNew;.
248a0 20 20 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b 0a        nMin = 2;.
248b0 20 20 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 6e        nMerge = n
248c0 4d 65 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d 0a  Merge*-1;.    }.
248d0 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20      if( pStruct 
248e0 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  && pStruct->nLev
248f0 65 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  el ){.      if( 
24900 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70  fts5IndexMerge(p
24910 2c 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72  , &pStruct, nMer
24920 67 65 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20 20  ge, nMin) ){.   
24930 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
24940 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75  reWrite(p, pStru
24950 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
24960 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
24970 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
24980 75 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  uct);.  }.  retu
24990 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
249a0 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn(p);.}..static
249b0 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64   void fts5Append
249c0 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64  Rowid(.  Fts5Ind
249d0 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65  ex *p,.  i64 iDe
249e0 6c 74 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20  lta,.  Fts5Iter 
249f0 2a 70 55 6e 75 73 65 64 2c 0a 20 20 46 74 73 35  *pUnused,.  Fts5
24a00 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a  Buffer *pBuf.){.
24a10 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
24a20 55 6e 75 73 65 64 29 3b 0a 20 20 66 74 73 35 42  Unused);.  fts5B
24a30 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
24a40 74 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  t(&p->rc, pBuf, 
24a50 69 44 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61 74  iDelta);.}..stat
24a60 69 63 20 76 6f 69 64 20 66 74 73 35 41 70 70 65  ic void fts5Appe
24a70 6e 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  ndPoslist(.  Fts
24a80 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34  5Index *p,.  i64
24a90 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49   iDelta,.  Fts5I
24aa0 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46  ter *pMulti,.  F
24ab0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a  ts5Buffer *pBuf.
24ac0 29 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d  ){.  int nData =
24ad0 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e 44   pMulti->base.nD
24ae0 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ata;.  assert( n
24af0 44 61 74 61 3e 30 20 29 3b 0a 20 20 69 66 28 20  Data>0 );.  if( 
24b00 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
24b10 20 26 26 20 30 3d 3d 66 74 73 35 42 75 66 66 65   && 0==fts5Buffe
24b20 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42  rGrow(&p->rc, pB
24b30 75 66 2c 20 6e 44 61 74 61 2b 39 2b 39 29 20 29  uf, nData+9+9) )
24b40 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
24b50 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
24b60 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a  (pBuf, iDelta);.
24b70 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24b80 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
24b90 42 75 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a 20  Buf, nData*2);. 
24ba0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
24bb0 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
24bc0 2c 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 70  , pMulti->base.p
24bd0 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
24be0 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  }.}...static voi
24bf0 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65  d fts5DoclistIte
24c00 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73  rNext(Fts5Doclis
24c10 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  tIter *pIter){. 
24c20 20 75 38 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e   u8 *p = pIter->
24c30 61 50 6f 73 6c 69 73 74 20 2b 20 70 49 74 65 72  aPoslist + pIter
24c40 2d 3e 6e 53 69 7a 65 20 2b 20 70 49 74 65 72 2d  ->nSize + pIter-
24c50 3e 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61 73  >nPoslist;..  as
24c60 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 50 6f  sert( pIter->aPo
24c70 73 6c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  slist );.  if( p
24c80 3e 3d 70 49 74 65 72 2d 3e 61 45 6f 66 20 29 7b  >=pIter->aEof ){
24c90 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73  .    pIter->aPos
24ca0 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  list = 0;.  }els
24cb0 65 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  e{.    i64 iDelt
24cc0 61 3b 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74 73  a;..    p += fts
24cd0 35 47 65 74 56 61 72 69 6e 74 28 70 2c 20 28 75  5GetVarint(p, (u
24ce0 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
24cf0 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
24d00 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
24d10 2f 2a 20 52 65 61 64 20 70 6f 73 69 74 69 6f 6e  /* Read position
24d20 20 6c 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20 20   list size */.  
24d30 20 20 69 66 28 20 70 5b 30 5d 20 26 20 30 78 38    if( p[0] & 0x8
24d40 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
24d50 50 6f 73 3b 0a 20 20 20 20 20 20 70 49 74 65 72  Pos;.      pIter
24d60 2d 3e 6e 53 69 7a 65 20 3d 20 66 74 73 35 47 65  ->nSize = fts5Ge
24d70 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 50 6f  tVarint32(p, nPo
24d80 73 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  s);.      pIter-
24d90 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50 6f  >nPoslist = (nPo
24da0 73 3e 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  s>>1);.    }else
24db0 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  {.      pIter->n
24dc0 50 6f 73 6c 69 73 74 20 3d 20 28 28 69 6e 74 29  Poslist = ((int)
24dd0 28 70 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20 20  (p[0])) >> 1;.  
24de0 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65      pIter->nSize
24df0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
24e00 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
24e10 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = p;.  }.}..sta
24e20 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63  tic void fts5Doc
24e30 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20  listIterInit(.  
24e40 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
24e50 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74  , .  Fts5Doclist
24e60 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20  Iter *pIter.){. 
24e70 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
24e80 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
24e90 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f 73  );.  pIter->aPos
24ea0 6c 69 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a  list = pBuf->p;.
24eb0 20 20 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20    pIter->aEof = 
24ec0 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
24ed0 5d 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74  ];.  fts5Doclist
24ee0 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b  IterNext(pIter);
24ef0 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  .}..#if 0./*.** 
24f00 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74  Append a doclist
24f10 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
24f20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
24f30 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
24f40 74 20 73 70 61 63 65 20 77 69 74 68 69 6e 20 74  t space within t
24f50 68 65 20 62 75 66 66 65 72 20 68 61 73 20 61 6c  he buffer has al
24f60 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c  ready been.** al
24f70 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  located..*/.stat
24f80 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
24f90 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20  eAppendDocid(.  
24fa0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
24fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24fc0 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 69  /* Buffer to wri
24fd0 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a  te to */.  i64 *
24fe0 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20  piLastRowid,    
24ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
25000 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72  /OUT: Previous r
25010 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69 66  owid written (if
25020 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69   any) */.  i64 i
25030 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
25040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
25050 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  wid to append */
25060 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42  .){.  assert( pB
25070 75 66 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69  uf->n!=0 || (*pi
25080 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b  LastRowid)==0 );
25090 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66  .  fts5BufferSaf
250a0 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42  eAppendVarint(pB
250b0 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69  uf, iRowid - *pi
250c0 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70  LastRowid);.  *p
250d0 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f  iLastRowid = iRo
250e0 77 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  wid;.}.#endif..#
250f0 64 65 66 69 6e 65 20 66 74 73 35 4d 65 72 67 65  define fts5Merge
25100 41 70 70 65 6e 64 44 6f 63 69 64 28 70 42 75 66  AppendDocid(pBuf
25110 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52  , iLastRowid, iR
25120 6f 77 69 64 29 20 7b 20 20 20 20 20 20 20 5c 0a  owid) {       \.
25130 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29    assert( (pBuf)
25140 2d 3e 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74  ->n!=0 || (iLast
25150 52 6f 77 69 64 29 3d 3d 30 20 29 3b 20 20 20 20  Rowid)==0 );    
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
25170 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66  .  fts5BufferSaf
25180 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 28 70  eAppendVarint((p
25190 42 75 66 29 2c 20 28 69 52 6f 77 69 64 29 20 2d  Buf), (iRowid) -
251a0 20 28 69 4c 61 73 74 52 6f 77 69 64 29 29 3b 20   (iLastRowid)); 
251b0 5c 0a 20 20 28 69 4c 61 73 74 52 6f 77 69 64 29  \.  (iLastRowid)
251c0 20 3d 20 28 69 52 6f 77 69 64 29 3b 20 20 20 20   = (iRowid);    
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70   \.}../*.** Swap
25200 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
25210 20 62 75 66 66 65 72 20 2a 70 31 20 77 69 74 68   buffer *p1 with
25220 20 74 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a 2f   that of *p2..*/
25230 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
25240 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35  5BufferSwap(Fts5
25250 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35  Buffer *p1, Fts5
25260 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46  Buffer *p2){.  F
25270 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20  ts5Buffer tmp = 
25280 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32  *p1;.  *p1 = *p2
25290 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d  ;.  *p2 = tmp;.}
252a0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
252b0 73 35 4e 65 78 74 52 6f 77 69 64 28 46 74 73 35  s5NextRowid(Fts5
252c0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 6e  Buffer *pBuf, in
252d0 74 20 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a 70  t *piOff, i64 *p
252e0 69 52 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20 69  iRowid){.  int i
252f0 20 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66 28   = *piOff;.  if(
25300 20 69 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a 20   i>=pBuf->n ){. 
25310 20 20 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a     *piOff = -1;.
25320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36 34    }else{.    u64
25330 20 69 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f 66   iVal;.    *piOf
25340 66 20 3d 20 69 20 2b 20 73 71 6c 69 74 65 33 46  f = i + sqlite3F
25350 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
25360 75 66 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c 29  uf->p[i], &iVal)
25370 3b 0a 20 20 20 20 2a 70 69 52 6f 77 69 64 20 2b  ;.    *piRowid +
25380 3d 20 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iVal;.  }.}../
25390 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
253a0 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 66   equivalent of f
253b0 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
253c0 73 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c  sts() for detail
253d0 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20 49  =none mode..** I
253e0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
253f0 62 75 66 66 65 72 73 20 63 6f 6e 73 69 73 74 20  buffers consist 
25400 6f 66 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f 64  of a delta-encod
25410 65 64 20 6c 69 73 74 20 6f 66 20 72 6f 77 69 64  ed list of rowid
25420 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  s only..*/.stati
25430 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
25440 52 6f 77 69 64 4c 69 73 74 73 28 0a 20 20 46 74  RowidLists(.  Ft
25450 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25470 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
25480 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75  ject */.  Fts5Bu
25490 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20  ffer *p1,       
254a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
254b0 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65  st list to merge
254c0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
254d0 20 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20   *p2            
254e0 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
254f0 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f  list to merge */
25500 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 30  .){.  int i1 = 0
25510 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 30 3b 0a  ;.  int i2 = 0;.
25520 20 20 69 36 34 20 69 52 6f 77 69 64 31 20 3d 20    i64 iRowid1 = 
25530 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 32  0;.  i64 iRowid2
25540 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 4f 75 74   = 0;.  i64 iOut
25550 20 3d 20 30 3b 0a 0a 20 20 46 74 73 35 42 75 66   = 0;..  Fts5Buf
25560 66 65 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73 65  fer out;.  memse
25570 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f  t(&out, 0, sizeo
25580 66 28 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69 74  f(out));.  sqlit
25590 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
255a0 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70  (&p->rc, &out, p
255b0 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20  1->n + p2->n);. 
255c0 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
255d0 75 72 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78 74  urn;..  fts5Next
255e0 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26  Rowid(p1, &i1, &
255f0 69 52 6f 77 69 64 31 29 3b 0a 20 20 66 74 73 35  iRowid1);.  fts5
25600 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69  NextRowid(p2, &i
25610 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20  2, &iRowid2);.  
25620 77 68 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c 20  while( i1>=0 || 
25630 69 32 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  i2>=0 ){.    if(
25640 20 69 31 3e 3d 30 20 26 26 20 28 69 32 3c 30 20   i1>=0 && (i2<0 
25650 7c 7c 20 69 52 6f 77 69 64 31 3c 69 52 6f 77 69  || iRowid1<iRowi
25660 64 32 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  d2) ){.      ass
25670 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20  ert( iOut==0 || 
25680 69 52 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b 0a  iRowid1>iOut );.
25690 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
256a0 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
256b0 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 31 20 2d  (&out, iRowid1 -
256c0 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f   iOut);.      iO
256d0 75 74 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20 20  ut = iRowid1;.  
256e0 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69      fts5NextRowi
256f0 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77  d(p1, &i1, &iRow
25700 69 64 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  id1);.    }else{
25710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
25720 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64  Out==0 || iRowid
25730 32 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20  2>iOut );.      
25740 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
25750 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c  pendVarint(&out,
25760 20 69 52 6f 77 69 64 32 20 2d 20 69 4f 75 74 29   iRowid2 - iOut)
25770 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69  ;.      iOut = i
25780 52 6f 77 69 64 32 3b 0a 20 20 20 20 20 20 69 66  Rowid2;.      if
25790 28 20 69 31 3e 3d 30 20 26 26 20 69 52 6f 77 69  ( i1>=0 && iRowi
257a0 64 31 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a 20  d1==iRowid2 ){. 
257b0 20 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52         fts5NextR
257c0 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69  owid(p1, &i1, &i
257d0 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 20 20 7d  Rowid1);.      }
257e0 0a 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52  .      fts5NextR
257f0 6f 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69  owid(p2, &i2, &i
25800 52 6f 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a 20  Rowid2);.    }. 
25810 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72   }..  fts5Buffer
25820 53 77 61 70 28 26 6f 75 74 2c 20 70 31 29 3b 0a  Swap(&out, p1);.
25830 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
25840 28 26 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&out);.}../*.**
25850 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20   Buffers p1 and 
25860 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69  p2 contain docli
25870 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  sts. This functi
25880 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f  on merges the co
25890 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20  ntent.** of the 
258a0 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67  two doclists tog
258b0 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62  ether and sets b
258c0 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20  uffer p1 to the 
258d0 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a  result before.**
258e0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
258f0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
25900 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
25910 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70  ode is left in p
25920 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  ->rc. If an erro
25930 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  r has.** already
25940 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
25950 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
25960 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
25970 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65  oid fts5MergePre
25980 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35  fixLists(.  Fts5
25990 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
259a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
259b0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
259c0 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ct */.  Fts5Buff
259d0 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20  er *p1,         
259e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
259f0 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
25a00 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
25a10 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
25a20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69      /* Second li
25a30 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  st to merge */.)
25a40 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b  {.  if( p2->n ){
25a50 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
25a60 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
25a70 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b  5DoclistIter i1;
25a80 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
25a90 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73  Iter i2;.    Fts
25aa0 35 42 75 66 66 65 72 20 6f 75 74 20 3d 20 7b 30  5Buffer out = {0
25ab0 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 46 74 73  , 0, 0};.    Fts
25ac0 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 7b 30  5Buffer tmp = {0
25ad0 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0};..    /*
25ae0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   The maximum siz
25af0 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  e of the output 
25b00 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
25b10 73 75 6d 20 6f 66 20 74 68 65 20 74 77 6f 20 0a  sum of the two .
25b20 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 73 69 7a      ** input siz
25b30 65 73 20 2b 20 31 20 76 61 72 69 6e 74 20 28 39  es + 1 varint (9
25b40 20 62 79 74 65 73 29 2e 20 54 68 65 20 65 78 74   bytes). The ext
25b50 72 61 20 76 61 72 69 6e 74 20 69 73 20 62 65 63  ra varint is bec
25b60 61 75 73 65 20 69 66 20 74 68 65 0a 20 20 20 20  ause if the.    
25b70 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 69  ** first rowid i
25b80 6e 20 6f 6e 65 20 69 6e 70 75 74 20 69 73 20 61  n one input is a
25b90 20 6c 61 72 67 65 20 6e 65 67 61 74 69 76 65 20   large negative 
25ba0 6e 75 6d 62 65 72 2c 20 61 6e 64 20 74 68 65 20  number, and the 
25bb0 66 69 72 73 74 20 69 6e 0a 20 20 20 20 2a 2a 20  first in.    ** 
25bc0 74 68 65 20 6f 74 68 65 72 20 61 20 6e 6f 6e 2d  the other a non-
25bd0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2c  negative number,
25be0 20 74 68 65 20 64 65 6c 74 61 20 66 6f 72 20 74   the delta for t
25bf0 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 0a  he non-negative.
25c00 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 77 69      ** number wi
25c10 6c 6c 20 62 65 20 6c 61 72 67 65 72 20 6f 6e 20  ll be larger on 
25c20 64 69 73 6b 20 74 68 61 6e 20 74 68 65 20 6c 69  disk than the li
25c30 74 65 72 61 6c 20 69 6e 74 65 67 65 72 20 76 61  teral integer va
25c40 6c 75 65 0a 20 20 20 20 2a 2a 20 77 61 73 2e 20  lue.    ** was. 
25c50 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
25c60 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
25c70 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  e(&p->rc, &out, 
25c80 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 20 2b 20  p1->n + p2->n + 
25c90 39 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  9) ) return;.   
25ca0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
25cb0 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a 20  Init(p1, &i1);. 
25cc0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
25cd0 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29 3b  erInit(p2, &i2);
25ce0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  ..    while( 1 )
25cf0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 31 2e 69  {.      if( i1.i
25d00 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 20  Rowid<i2.iRowid 
25d10 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ){.        /* Co
25d20 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31  py entry from i1
25d30 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
25d40 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
25d50 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
25d60 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i1.iRowid);. 
25d70 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
25d80 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
25d90 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73  &out, i1.aPoslis
25da0 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69  t, i1.nPoslist+i
25db0 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  1.nSize);.      
25dc0 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
25dd0 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20  rNext(&i1);.    
25de0 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c      if( i1.aPosl
25df0 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ist==0 ) break;.
25e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
25e10 73 65 20 69 66 28 20 69 32 2e 69 52 6f 77 69 64  se if( i2.iRowid
25e20 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20  !=i1.iRowid ){. 
25e30 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
25e40 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a  ntry from i2 */.
25e50 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
25e60 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75  eAppendDocid(&ou
25e70 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  t, iLastRowid, i
25e80 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
25e90 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
25ea0 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
25eb0 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i2.aPoslist, i
25ec0 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53  2.nPoslist+i2.nS
25ed0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ize);.        ft
25ee0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
25ef0 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20  t(&i2);.        
25f00 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d  if( i2.aPoslist=
25f10 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
25f20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a    }.      else{.
25f30 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65          /* Merge
25f40 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f   the two positio
25f50 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20  n lists. */ .   
25f60 20 20 20 20 20 69 36 34 20 69 50 6f 73 31 20 3d       i64 iPos1 =
25f70 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
25f80 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20 20  iPos2 = 0;.     
25f90 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20 30     int iOff1 = 0
25fa0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
25fb0 66 66 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ff2 = 0;.       
25fc0 20 75 38 20 2a 61 31 20 3d 20 26 69 31 2e 61 50   u8 *a1 = &i1.aP
25fd0 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65 5d  oslist[i1.nSize]
25fe0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 32  ;.        u8 *a2
25ff0 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73 74 5b   = &i2.aPoslist[
26000 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20 20  i2.nSize];..    
26010 20 20 20 20 69 36 34 20 69 50 72 65 76 20 3d 20      i64 iPrev = 
26020 30 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  0;.        Fts5P
26030 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69  oslistWriter wri
26040 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ter;.        mem
26050 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20  set(&writer, 0, 
26060 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b  sizeof(writer));
26070 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  ..        fts5Me
26080 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
26090 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
260a0 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i2.iRowid);.   
260b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
260c0 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20  ero(&tmp);.     
260d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
260e0 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
260f0 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c 69   &tmp, i1.nPosli
26100 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69 73 74  st + i2.nPoslist
26110 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
26120 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ->rc ) break;.. 
26130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
26140 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
26150 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  a1, i1.nPoslist,
26160 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29   &iOff1, &iPos1)
26170 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26180 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
26190 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69  64(a2, i2.nPosli
261a0 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f  st, &iOff2, &iPo
261b0 73 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  s2);.        ass
261c0 65 72 74 28 20 69 50 6f 73 31 3e 3d 30 20 26 26  ert( iPos1>=0 &&
261d0 20 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20 20   iPos2>=0 );..  
261e0 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c        if( iPos1<
261f0 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20  iPos2 ){.       
26200 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26210 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
26220 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
26230 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
26240 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
26250 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e  stNext64(a1, i1.
26260 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31  nPoslist, &iOff1
26270 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  , &iPos1);.     
26280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26290 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
262a0 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
262b0 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
262c0 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos2);.         
262d0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
262e0 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
262f0 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
26300 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20  2, &iPos2);.    
26310 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
26320 66 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69  f( iPos1>=0 && i
26330 50 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20 20 20  Pos2>=0 ){.     
26340 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
26350 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26360 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a   iPos1<iPos2 ){.
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26380 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29  ( iPos1!=iPrev )
26390 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
263a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
263b0 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26  listSafeAppend(&
263c0 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f  tmp, &iPrev, iPo
263d0 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s1);.           
263e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
263f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26400 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20  slistNext64(a1, 
26410 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i1.nPoslist, &iO
26420 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20  ff1, &iPos1);.  
26430 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26440 69 50 6f 73 31 3c 30 20 29 20 62 72 65 61 6b 3b  iPos1<0 ) break;
26450 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
26460 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
26470 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 32 21    assert( iPos2!
26480 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20  =iPrev );.      
26490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
264a0 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
264b0 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
264c0 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  v, iPos2);.     
264d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
264e0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
264f0 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  4(a2, i2.nPoslis
26500 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73  t, &iOff2, &iPos
26510 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
26520 20 20 69 66 28 20 69 50 6f 73 32 3c 30 20 29 20    if( iPos2<0 ) 
26530 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
26540 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
26550 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
26560 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d 30      if( iPos1>=0
26570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
26580 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29  ( iPos1!=iPrev )
26590 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
265a0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
265b0 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
265c0 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b   &iPrev, iPos1);
265d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
265e0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
265f0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
26600 26 74 6d 70 2c 20 26 61 31 5b 69 4f 66 66 31 5d  &tmp, &a1[iOff1]
26610 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2d 69 4f  , i1.nPoslist-iO
26620 66 66 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ff1);.        }e
26630 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
26640 73 73 65 72 74 28 20 69 50 6f 73 32 3e 3d 30 20  ssert( iPos2>=0 
26650 26 26 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20  && iPos2!=iPrev 
26660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
26670 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
26680 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
26690 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a  &iPrev, iPos2);.
266a0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
266b0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
266c0 6f 62 28 26 74 6d 70 2c 20 26 61 32 5b 69 4f 66  ob(&tmp, &a2[iOf
266d0 66 32 5d 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  f2], i2.nPoslist
266e0 2d 69 4f 66 66 32 29 3b 0a 20 20 20 20 20 20 20  -iOff2);.       
266f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
26700 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
26710 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
26720 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
26730 61 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e  arint(&out, tmp.
26740 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20  n * 2);.        
26750 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
26760 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74  pendBlob(&out, t
26770 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20  mp.p, tmp.n);.  
26780 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
26790 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a  tIterNext(&i1);.
267a0 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
267b0 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29  istIterNext(&i2)
267c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
267d0 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20  .aPoslist==0 || 
267e0 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29  i2.aPoslist==0 )
267f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26800 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
26810 31 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20  1.aPoslist ){.  
26820 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
26830 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
26840 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52  LastRowid, i1.iR
26850 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73  owid);.      fts
26860 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
26870 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61  dBlob(&out, i1.a
26880 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45 6f 66  Poslist, i1.aEof
26890 20 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b   - i1.aPoslist);
268a0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
268b0 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 20  if( i2.aPoslist 
268c0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72  ){.      fts5Mer
268d0 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
268e0 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
268f0 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
26900 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
26910 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
26920 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32   i2.aPoslist, i2
26930 2e 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f 73 6c  .aEof - i2.aPosl
26940 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
26950 61 73 73 65 72 74 28 20 6f 75 74 2e 6e 3c 3d 28  assert( out.n<=(
26960 70 31 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20 29  p1->n+p2->n+9) )
26970 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ;..    fts5Buffe
26980 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c  rSet(&p->rc, p1,
26990 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a   out.n, out.p);.
269a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
269b0 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74  ee(&tmp);.    ft
269c0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75  s5BufferFree(&ou
269d0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  t);.  }.}..stati
269e0 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70  c void fts5Setup
269f0 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46 74  PrefixIter(.  Ft
26a00 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a20 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66   Index to read f
26a30 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  rom */.  int bDe
26a40 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
26a50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26a60 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72   for "ORDER BY r
26a70 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20  owid DESC" */.  
26a80 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e  const u8 *pToken
26a90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26aa0 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
26ab0 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d  ning prefix to m
26ac0 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  atch */.  int nT
26ad0 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
26ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
26af0 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b  e of buffer pTok
26b00 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  en in bytes */. 
26b10 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
26b20 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
26b30 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
26b40 63 68 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f  ches to these co
26b50 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49  lumns */.  Fts5I
26b60 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20  ter **ppIter    
26b70 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
26b80 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  w iterator */.){
26b90 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
26ba0 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
26bb0 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20  5Buffer *aBuf;. 
26bc0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20   const int nBuf 
26bd0 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a  = 32;..  void (*
26be0 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64 65  xMerge)(Fts5Inde
26bf0 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c  x*, Fts5Buffer*,
26c00 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20   Fts5Buffer*);. 
26c10 20 76 6f 69 64 20 28 2a 78 41 70 70 65 6e 64 29   void (*xAppend)
26c20 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36 34  (Fts5Index*, i64
26c30 2c 20 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73  , Fts5Iter*, Fts
26c40 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66 28  5Buffer*);.  if(
26c50 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
26c60 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
26c70 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78 4d  L_NONE ){.    xM
26c80 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65  erge = fts5Merge
26c90 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20 20  RowidLists;.    
26ca0 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70  xAppend = fts5Ap
26cb0 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65 6c  pendRowid;.  }el
26cc0 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d  se{.    xMerge =
26cd0 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
26ce0 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65  Lists;.    xAppe
26cf0 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64 50  nd = fts5AppendP
26d00 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 61  oslist;.  }..  a
26d10 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65  Buf = (Fts5Buffe
26d20 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
26d30 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42  (p, sizeof(Fts5B
26d40 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20  uffer)*nBuf);.  
26d50 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
26d60 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
26d70 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70  .  if( aBuf && p
26d80 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f  Struct ){.    co
26d90 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
26da0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
26db0 53 43 41 4e 20 0a 20 20 20 20 20 20 20 20 20 20  SCAN .          
26dc0 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53 35            | FTS5
26dd0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50  INDEX_QUERY_SKIP
26de0 45 4d 50 54 59 20 0a 20 20 20 20 20 20 20 20 20  EMPTY .         
26df0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53             | FTS
26e00 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f  5INDEX_QUERY_NOO
26e10 55 54 50 55 54 3b 0a 20 20 20 20 69 6e 74 20 69  UTPUT;.    int i
26e20 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  ;.    i64 iLastR
26e30 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
26e40 73 35 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20  s5Iter *p1 = 0; 
26e50 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
26e60 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20 64  used to gather d
26e70 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a  ata from index *
26e80 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
26e90 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35 42  pData;.    Fts5B
26ea0 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 20  uffer doclist;. 
26eb0 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20     int bNewTerm 
26ec0 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  = 1;..    memset
26ed0 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69  (&doclist, 0, si
26ee0 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a  zeof(doclist));.
26ef0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
26f00 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
26f10 20 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74 2c   flags, pColset,
26f20 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c   pToken, nToken,
26f30 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20   -1, 0, &p1);.  
26f40 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
26f50 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 31  putCb(&p->rc, p1
26f60 29 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20 6e  );.    for( /* n
26f70 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20 20  o-op */ ;.      
26f80 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
26f90 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20  of(p, p1)==0;.  
26fa0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
26fb0 74 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c 20  terNext2(p, p1, 
26fc0 26 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20 29  &bNewTerm).    )
26fd0 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
26fe0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 31 2d  ter *pSeg = &p1-
26ff0 3e 61 53 65 67 5b 20 70 31 2d 3e 61 46 69 72 73  >aSeg[ p1->aFirs
27000 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
27010 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d       int nTerm =
27020 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a 20   pSeg->term.n;. 
27030 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
27040 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72  Term = pSeg->ter
27050 6d 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e 78  m.p;.      p1->x
27060 53 65 74 4f 75 74 70 75 74 73 28 70 31 2c 20 70  SetOutputs(p1, p
27070 53 65 67 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  Seg);..      ass
27080 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70  ert_nc( memcmp(p
27090 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49  Token, pTerm, MI
270a0 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29  N(nToken, nTerm)
270b0 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )<=0 );.      if
270c0 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20  ( bNewTerm ){.  
270d0 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c        if( nTerm<
270e0 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70  nToken || memcmp
270f0 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
27100 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b  nToken) ) break;
27110 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
27120 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44 61  if( p1->base.nDa
27130 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ta==0 ) continue
27140 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d  ;..      if( p1-
27150 3e 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69 4c  >base.iRowid<=iL
27160 61 73 74 52 6f 77 69 64 20 26 26 20 64 6f 63 6c  astRowid && docl
27170 69 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 20  ist.n>0 ){.     
27180 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72     for(i=0; p->r
27190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
271a0 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b  doclist.n; i++){
271b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
271c0 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20  t( i<nBuf );.   
271d0 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b         if( aBuf[
271e0 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  i].n==0 ){.     
271f0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
27200 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20  rSwap(&doclist, 
27210 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
27220 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
27230 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b  rZero(&doclist);
27240 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
27250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 4d  {.            xM
27260 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74  erge(p, &doclist
27270 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
27280 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
27290 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d  ferZero(&aBuf[i]
272a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
272b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
272c0 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
272d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
272e0 78 41 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e 62  xAppend(p, p1->b
272f0 61 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73 74  ase.iRowid-iLast
27300 52 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f 63 6c  Rowid, p1, &docl
27310 69 73 74 29 3b 0a 20 20 20 20 20 20 69 4c 61 73  ist);.      iLas
27320 74 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61 73  tRowid = p1->bas
27330 65 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a  e.iRowid;.    }.
27340 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27350 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nBuf; i++){.    
27360 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
27370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27380 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63    xMerge(p, &doc
27390 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
273a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
273b0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61  ts5BufferFree(&a
273c0 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Buf[i]);.    }. 
273d0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
273e0 46 72 65 65 28 70 31 29 3b 0a 0a 20 20 20 20 70  Free(p1);..    p
273f0 44 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61  Data = fts5IdxMa
27400 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
27410 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69  ts5Data) + docli
27420 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  st.n);.    if( p
27430 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44  Data ){.      pD
27440 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70  ata->p = (u8*)&p
27450 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70  Data[1];.      p
27460 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61  Data->nn = pData
27470 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69  ->szLeaf = docli
27480 73 74 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  st.n;.      if( 
27490 64 6f 63 6c 69 73 74 2e 6e 20 29 20 6d 65 6d 63  doclist.n ) memc
274a0 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63  py(pData->p, doc
274b0 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e  list.p, doclist.
274c0 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  n);.      fts5Mu
274d0 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70  ltiIterNew2(p, p
274e0 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49  Data, bDesc, ppI
274f0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
27500 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
27510 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  doclist);.  }.. 
27520 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
27530 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
27540 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
27550 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Buf);.}.../*.** 
27560 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c  Indicate that al
27570 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  l subsequent cal
27580 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ls to sqlite3Fts
27590 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65  5IndexWrite() pe
275a0 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  rtain.** to the 
275b0 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f  document with ro
275c0 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69  wid iRowid..*/.i
275d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
275e0 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74  dexBeginWrite(Ft
275f0 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
27600 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f  bDelete, i64 iRo
27610 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  wid){.  assert( 
27620 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
27630 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
27640 74 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  te the hash tabl
27650 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  e if it has not 
27660 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
27670 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  ocated */.  if( 
27680 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20  p->pHash==0 ){. 
27690 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
276a0 65 33 46 74 73 35 48 61 73 68 4e 65 77 28 70 2d  e3Fts5HashNew(p-
276b0 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70 48  >pConfig, &p->pH
276c0 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e  ash, &p->nPendin
276d0 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f  gData);.  }..  /
276e0 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61 73 68  * Flush the hash
276f0 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 69   table to disk i
27700 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
27710 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69 57  if( iRowid<p->iW
27720 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20 7c 7c  riteRowid .   ||
27730 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57 72   (iRowid==p->iWr
27740 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d 3e 62  iteRowid && p->b
27750 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c  Delete==0).   ||
27760 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74   (p->nPendingDat
27770 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  a > p->pConfig->
27780 6e 48 61 73 68 53 69 7a 65 29 20 0a 20 20 29 7b  nHashSize) .  ){
27790 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c  .    fts5IndexFl
277a0 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70  ush(p);.  }..  p
277b0 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20  ->iWriteRowid = 
277c0 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65  iRowid;.  p->bDe
277d0 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a  lete = bDelete;.
277e0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
277f0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
27800 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74  /*.** Commit dat
27810 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  a to disk..*/.in
27820 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
27830 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78  exSync(Fts5Index
27840 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
27850 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
27860 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46   );.  fts5IndexF
27870 6c 75 73 68 28 70 29 3b 0a 20 20 66 74 73 35 43  lush(p);.  fts5C
27880 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
27890 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
278a0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
278b0 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79  *.** Discard any
278c0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
278d0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
278e0 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f  sh tables. Do no
278f0 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f  t write it.** to
27900 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
27910 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73  dditionally, ass
27920 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ume that the con
27930 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64  tents of the %_d
27940 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79  ata.** table may
27950 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e   have changed on
27960 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e   disk. So any in
27970 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f  -memory caches o
27980 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63  f %_data .** rec
27990 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76  ords must be inv
279a0 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  alidated..*/.int
279b0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
279c0 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e  xRollback(Fts5In
279d0 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43  dex *p){.  fts5C
279e0 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
279f0 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72   fts5IndexDiscar
27a00 64 44 61 74 61 28 70 29 3b 0a 20 20 66 74 73 35  dData(p);.  fts5
27a10 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
27a20 61 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61 73 73  ate(p);.  /* ass
27a30 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
27a40 54 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72 65  TE_OK ); */.  re
27a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27a60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  }../*.** The %_d
27a70 61 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  ata table is com
27a80 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68  pletely empty wh
27a90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27aa0 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73   is called. This
27ab0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  .** function pop
27ac0 75 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74  ulates it with t
27ad0 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63  he initial struc
27ae0 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72  ture objects for
27af0 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20   each index,.** 
27b00 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  and the initial 
27b10 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22  version of the "
27b20 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
27b30 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c   (a zero-byte bl
27b40 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ob)..*/.int sqli
27b50 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e  te3Fts5IndexRein
27b60 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  it(Fts5Index *p)
27b70 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
27b80 65 20 73 3b 0a 20 20 66 74 73 35 53 74 72 75 63  e s;.  fts5Struc
27b90 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70  tureInvalidate(p
27ba0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20  );.  memset(&s, 
27bb0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
27bc0 72 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73  ructure));.  fts
27bd0 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
27be0 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
27bf0 44 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22  D, (const u8*)""
27c00 2c 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75  , 0);.  fts5Stru
27c10 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73  ctureWrite(p, &s
27c20 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
27c30 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
27c40 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
27c50 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61  new Fts5Index ha
27c60 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72  ndle. If the bCr
27c70 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73  eate argument is
27c80 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a   true, create.**
27c90 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
27ca0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25  the underlying %
27cb0 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
27cc0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
27cd0 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69  , set *pp to poi
27ce0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62  nt to the new ob
27cf0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
27d00 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74  SQLITE_OK..** Ot
27d10 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70  herwise, set *pp
27d20 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74   to NULL and ret
27d30 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
27d40 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
27d50 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27d60 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e  xOpen(.  Fts5Con
27d70 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20  fig *pConfig, . 
27d80 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20   int bCreate, . 
27d90 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c   Fts5Index **pp,
27da0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
27db0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
27dc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49  LITE_OK;.  Fts5I
27dd0 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20  ndex *p;        
27de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
27df0 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a  w object */..  *
27e00 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e  pp = p = (Fts5In
27e10 64 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35  dex*)sqlite3Fts5
27e20 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
27e30 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78  sizeof(Fts5Index
27e40 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
27e50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
27e60 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e  ->pConfig = pCon
27e70 66 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72  fig;.    p->nWor
27e80 6b 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52  kUnit = FTS5_WOR
27e90 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a  K_UNIT;.    p->z
27ea0 44 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65  DataTbl = sqlite
27eb0 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63  3Fts5Mprintf(&rc
27ec0 2c 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f  , "%s_data", pCo
27ed0 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  nfig->zName);.  
27ee0 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62    if( p->zDataTb
27ef0 6c 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a  l && bCreate ){.
27f00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27f10 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c  e3Fts5CreateTabl
27f20 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  e(.          pCo
27f30 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69  nfig, "data", "i
27f40 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
27f50 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f  Y KEY, block BLO
27f60 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20  B", 0, pzErr.   
27f70 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
27f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27f90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
27fa0 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54  lite3Fts5CreateT
27fb0 61 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69  able(pConfig, "i
27fc0 64 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  dx", .          
27fd0 20 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20    "segid, term, 
27fe0 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45  pgno, PRIMARY KE
27ff0 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c  Y(segid, term)",
28000 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 31 2c   .            1,
28010 20 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29   pzErr.        )
28020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28040 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
28050 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
28060 65 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20  exReinit(p);.   
28070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
28080 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
28090 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
280a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
280b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
280c0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
280d0 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  lose(p);.    *pp
280e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
280f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28100 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f  Close a handle o
28110 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  pened by an earl
28120 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ier call to sqli
28130 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e  te3Fts5IndexOpen
28140 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
28150 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
28160 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
28170 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28180 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b  E_OK;.  if( p ){
28190 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
281a0 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20  pReader==0 );.  
281b0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
281c0 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20  nvalidate(p);.  
281d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
281e0 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  ze(p->pWriter);.
281f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
28200 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72  lize(p->pDeleter
28210 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
28220 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57  inalize(p->pIdxW
28230 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  riter);.    sqli
28240 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
28250 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20  pIdxDeleter);.  
28260 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
28270 7a 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  ze(p->pIdxSelect
28280 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
28290 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61 74 61  inalize(p->pData
282a0 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 73 71  Version);.    sq
282b0 6c 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65  lite3Fts5HashFre
282c0 65 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20  e(p->pHash);.   
282d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
282e0 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20  >zDataTbl);.    
282f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
28300 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
28320 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20  ent p points to 
28330 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
28340 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74  ing utf-8 text t
28350 68 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69  hat is n bytes i
28360 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75  n .** size. Retu
28370 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
28380 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43   bytes in the nC
28390 68 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72  har character pr
283a0 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62  efix of the.** b
283b0 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74  uffer, or 0 if t
283c0 68 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68  here are less th
283d0 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  an nChar charact
283e0 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f  ers in total..*/
283f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
28400 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79  IndexCharlenToBy
28410 74 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  telen(.  const c
28420 68 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e  har *p, .  int n
28430 42 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68  Byte, .  int nCh
28440 61 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  ar.){.  int n = 
28450 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
28460 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20  r(i=0; i<nChar; 
28470 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e  i++){.    if( n>
28480 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e 20  =nByte ) return 
28490 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74  0;      /* Input
284a0 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
284b0 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73  than nChar chars
284c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73   */.    if( (uns
284d0 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b  igned char)p[n++
284e0 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20  ]>=0xc0 ){.     
284f0 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20   while( (p[n] & 
28500 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20  0xc0)==0x80 ){. 
28510 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
28520 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65      if( n>=nByte
28530 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28540 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
28550 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
28560 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20   pIn is a UTF-8 
28570 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20  encoded string, 
28580 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  nIn bytes in siz
28590 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  e. Return the nu
285a0 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f  mber of.** unico
285b0 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  de characters in
285c0 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a   the string..*/.
285d0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
285e0 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73  ndexCharlen(cons
285f0 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74  t char *pIn, int
28600 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68   nIn){.  int nCh
28610 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
28620 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b     .  int i = 0;
28630 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20  .  while( i<nIn 
28640 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69  ){.    if( (unsi
28650 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b  gned char)pIn[i+
28660 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20  +]>=0xc0 ){.    
28670 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26    while( i<nIn &
28680 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30  & (pIn[i] & 0xc0
28690 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20  )==0x80 ) i++;. 
286a0 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b     }.    nChar++
286b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
286c0 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Char;.}../*.** I
286d0 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20  nsert or remove 
286e0 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20  data to or from 
286f0 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20  the index. Each 
28700 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20  time a document 
28710 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  is .** added to 
28720 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
28730 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20  the index, this 
28740 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
28750 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  ed one or more.*
28760 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  * times..**.** F
28770 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74  or an insert, it
28780 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
28790 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f  once for each to
287a0 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64  ken in the new d
287b0 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74  ocument..** If t
287c0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
287d0 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73  a delete, it mus
287e0 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20  t be called (at 
287f0 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20  least) once for 
28800 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74  each.** unique t
28810 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75  oken in the docu
28820 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f  ment with an iCo
28830 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61  l value less tha
28840 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73  n zero. The iPos
28850 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
28860 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65  ignored for a de
28870 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lete..*/.int sql
28880 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69  ite3Fts5IndexWri
28890 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  te(.  Fts5Index 
288a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
288b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
288c0 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
288d0 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288f0 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20  /* Column token 
28900 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20  appears in (-ve 
28910 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20  -> delete) */.  
28920 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20  int iPos,       
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74  /* Position of t
28950 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75  oken within colu
28960 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
28970 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20  ar *pToken, int 
28980 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e  nToken  /* Token
28990 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76   to add or remov
289a0 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64  e to or from ind
289b0 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ex */.){.  int i
289c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
289d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
289e0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
289f0 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f  rough indexes */
28a00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28a10 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
28a20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
28a30 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69  e */.  Fts5Confi
28a40 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
28a50 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65  pConfig;..  asse
28a60 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
28a70 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
28a80 28 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62  ( (iCol<0)==p->b
28a90 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20  Delete );..  /* 
28aa0 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f  Add the entry to
28ab0 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20   the main terms 
28ac0 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d  index. */.  rc =
28ad0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
28ae0 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e  Write(.      p->
28af0 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74 65  pHash, p->iWrite
28b00 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
28b10 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  s, FTS5_MAIN_PRE
28b20 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  FIX, pToken, nTo
28b30 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28  ken.  );..  for(
28b40 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e  i=0; i<pConfig->
28b50 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53  nPrefix && rc==S
28b60 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
28b70 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43      const int nC
28b80 68 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61  har = pConfig->a
28b90 50 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69  Prefix[i];.    i
28ba0 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74  nt nByte = sqlit
28bb0 65 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c  e3Fts5IndexCharl
28bc0 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b  enToBytelen(pTok
28bd0 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61  en, nToken, nCha
28be0 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  r);.    if( nByt
28bf0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
28c00 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57  sqlite3Fts5HashW
28c10 72 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a  rite(p->pHash, .
28c20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72            p->iWr
28c30 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  iteRowid, iCol, 
28c40 69 50 6f 73 2c 20 28 63 68 61 72 29 28 46 54 53  iPos, (char)(FTS
28c50 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b  5_MAIN_PREFIX+i+
28c60 31 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20  1), pToken,.    
28c70 20 20 20 20 20 20 6e 42 79 74 65 0a 20 20 20 20        nByte.    
28c80 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
28c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28ca0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
28cb0 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65   iterator to ite
28cc0 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20  rate though all 
28cd0 72 6f 77 69 64 20 74 68 61 74 20 6d 61 74 63 68  rowid that match
28ce0 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69   the .** specifi
28cf0 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  ed token or toke
28d00 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74  n prefix..*/.int
28d10 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28d20 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e  xQuery(.  Fts5In
28d30 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
28d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
28d50 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20   index to query 
28d60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
28d70 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
28d80 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f  ken, /* Token (o
28d90 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65  r prefix) to que
28da0 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
28db0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
28dd0 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
28de0 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a  _QUERY_X flags *
28df0 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
28e00 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20  pColset,        
28e10 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65      /* Match the
28e20 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20  se columns only 
28e30 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
28e40 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20  er **ppIter     
28e50 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
28e60 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
28e70 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e   */.){.  Fts5Con
28e80 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
28e90 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73  ->pConfig;.  Fts
28ea0 35 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b  5Iter *pRet = 0;
28eb0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
28ec0 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a  f = {0, 0, 0};..
28ed0 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52    /* If the QUER
28ee0 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73  Y_SCAN flag is s
28ef0 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  et, all other fl
28f00 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61  ags must be clea
28f10 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  r. */.  assert( 
28f20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
28f30 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d  EX_QUERY_SCAN)==
28f40 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35  0 || flags==FTS5
28f50 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
28f60 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   );..  if( sqlit
28f70 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
28f80 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e  (&p->rc, &buf, n
28f90 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20  Token+1)==0 ){. 
28fa0 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b     int iIdx = 0;
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61   /* Index to sea
28fd0 72 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  rch */.    if( n
28fe0 54 6f 6b 65 6e 20 29 20 6d 65 6d 63 70 79 28 26  Token ) memcpy(&
28ff0 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e  buf.p[1], pToken
29000 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20  , nToken);..    
29010 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
29020 69 63 68 20 69 6e 64 65 78 20 74 6f 20 73 65 61  ich index to sea
29030 72 63 68 20 61 6e 64 20 73 65 74 20 69 49 64 78  rch and set iIdx
29040 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
29050 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   this.    ** is 
29060 61 20 70 72 65 66 69 78 20 71 75 65 72 79 20 66  a prefix query f
29070 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69  or which there i
29080 73 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64 65  s no prefix inde
29090 78 2c 20 73 65 74 20 69 49 64 78 20 74 6f 0a 20  x, set iIdx to. 
290a0 20 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68     ** greater th
290b0 61 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  an pConfig->nPre
290c0 66 69 78 20 74 6f 20 69 6e 64 69 63 61 74 65 20  fix to indicate 
290d0 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 77  that the query w
290e0 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73 61  ill be.    ** sa
290f0 74 69 73 66 69 65 64 20 62 79 20 73 63 61 6e 6e  tisfied by scann
29100 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  ing multiple ter
29110 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69  ms in the main i
29120 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ndex..    **.   
29130 20 2a 2a 20 49 66 20 74 68 65 20 51 55 45 52 59   ** If the QUERY
29140 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67  _TEST_NOIDX flag
29150 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20   was specified, 
29160 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62  then this must b
29170 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69  e a.    ** prefi
29180 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64  x-query. Instead
29190 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65 66   of using a pref
291a0 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65  ix-index (if one
291b0 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a   exists), .    *
291c0 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 70  * evaluate the p
291d0 72 65 66 69 78 20 71 75 65 72 79 20 75 73 69 6e  refix query usin
291e0 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69  g the main FTS i
291f0 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20 75 73  ndex. This is us
29200 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e  ed.    ** for in
29210 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  ternal sanity ch
29220 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e  ecking by the in
29230 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e  tegrity-check in
29240 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d   debug .    ** m
29250 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69  ode only.  */.#i
29260 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
29270 47 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69  G.    if( pConfi
29280 67 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78 3d  g->bPrefixIndex=
29290 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46  =0 || (flags & F
292a0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54  TS5INDEX_QUERY_T
292b0 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20  EST_NOIDX) ){.  
292c0 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
292d0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
292e0 45 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20  ERY_PREFIX );.  
292f0 20 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f      iIdx = 1+pCo
29300 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20  nfig->nPrefix;. 
29310 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
29320 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
29330 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
29340 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20  PREFIX ){.      
29350 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35  int nChar = fts5
29360 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f  IndexCharlen(pTo
29370 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
29380 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20      for(iIdx=1; 
29390 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
293a0 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b  Prefix; iIdx++){
293b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
293c0 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49  nfig->aPrefix[iI
293d0 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62  dx-1]==nChar ) b
293e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
293f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64    }..    if( iId
29400 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x<=pConfig->nPre
29410 66 69 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  fix ){.      /* 
29420 53 74 72 61 69 67 68 74 20 69 6e 64 65 78 20 6c  Straight index l
29430 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 46  ookup */.      F
29440 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
29450 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
29460 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
29470 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 28      buf.p[0] = (
29480 75 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52  u8)(FTS5_MAIN_PR
29490 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20  EFIX + iIdx);.  
294a0 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20      if( pStruct 
294b0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ){.        fts5M
294c0 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
294d0 53 74 72 75 63 74 2c 20 66 6c 61 67 73 20 7c 20  Struct, flags | 
294e0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
294f0 53 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20 20 20  SKIPEMPTY, .    
29500 20 20 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2c          pColset,
29510 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
29520 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a 20  , -1, 0, &pRet. 
29530 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
29540 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
29550 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
29560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
29570 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63 61  se{.      /* Sca
29580 6e 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73  n multiple terms
29590 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64   in the main ind
295a0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
295b0 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26  bDesc = (flags &
295c0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
295d0 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20  _DESC)!=0;.     
295e0 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35   buf.p[0] = FTS5
295f0 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20  _MAIN_PREFIX;.  
29600 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65      fts5SetupPre
29610 66 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63  fixIter(p, bDesc
29620 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b  , buf.p, nToken+
29630 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65  1, pColset, &pRe
29640 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
29650 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
29660 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f 6c  OK || pRet->pCol
29670 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
29680 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
29690 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 52 65 74  tCb(&p->rc, pRet
296a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
296b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
296c0 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67  .        Fts5Seg
296d0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 52  Iter *pSeg = &pR
296e0 65 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e 61  et->aSeg[pRet->a
296f0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
29700 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
29710 65 67 2d 3e 70 4c 65 61 66 20 29 20 70 52 65 74  eg->pLeaf ) pRet
29720 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 52  ->xSetOutputs(pR
29730 65 74 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  et, pSeg);.     
29740 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
29750 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20  ( p->rc ){.     
29760 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
29770 43 6c 6f 73 65 28 28 46 74 73 35 49 6e 64 65 78  Close((Fts5Index
29780 49 74 65 72 2a 29 70 52 65 74 29 3b 0a 20 20 20  Iter*)pRet);.   
29790 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
297a0 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
297b0 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  er(p);.    }..  
297c0 20 20 2a 70 70 49 74 65 72 20 3d 20 28 46 74 73    *ppIter = (Fts
297d0 35 49 6e 64 65 78 49 74 65 72 2a 29 70 52 65 74  5IndexIter*)pRet
297e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
297f0 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
29800 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
29810 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
29820 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
29830 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
29840 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
29850 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
29860 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a  ment is at EOF..
29870 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  */./*.** Move to
29880 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
29890 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e  ng rowid. .*/.in
298a0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
298b0 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 49  rNext(Fts5IndexI
298c0 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29  ter *pIndexIter)
298d0 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49  {.  Fts5Iter *pI
298e0 74 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a  ter = (Fts5Iter*
298f0 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 61  )pIndexIter;.  a
29900 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49  ssert( pIter->pI
29910 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  ndex->rc==SQLITE
29920 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c  _OK );.  fts5Mul
29930 74 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  tiIterNext(pIter
29940 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c  ->pIndex, pIter,
29950 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
29960 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
29970 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
29980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
29990 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
299a0 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20  ing term/rowid. 
299b0 55 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  Used by the fts5
299c0 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f  vocab module..*/
299d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
299e0 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73  IterNextScan(Fts
299f0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64  5IndexIter *pInd
29a00 65 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49  exIter){.  Fts5I
29a10 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74  ter *pIter = (Ft
29a20 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
29a30 65 72 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  er;.  Fts5Index 
29a40 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64  *p = pIter->pInd
29a50 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ex;..  assert( p
29a60 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
29a70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
29a80 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
29a90 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
29aa0 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63   0);.  if( p->rc
29ab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29ac0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
29ad0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
29ae0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
29af0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
29b00 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c      if( pSeg->pL
29b10 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72  eaf && pSeg->ter
29b20 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49  m.p[0]!=FTS5_MAI
29b30 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20  N_PREFIX ){.    
29b40 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
29b50 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a  e(pSeg->pLeaf);.
29b60 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61        pSeg->pLea
29b70 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74  f = 0;.      pIt
29b80 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20  er->base.bEof = 
29b90 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
29ba0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
29bb0 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
29bc0 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
29bd0 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
29be0 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20   matching rowid 
29bf0 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f  that occurs at o
29c00 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20  r after iMatch. 
29c10 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f  The.** definitio
29c20 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65  n of "at or afte
29c30 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  r" depends on wh
29c40 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61  ether this itera
29c50 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20  tor iterates.** 
29c60 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20  in ascending or 
29c70 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64  descending rowid
29c80 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   order..*/.int s
29c90 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
29ca0 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78  xtFrom(Fts5Index
29cb0 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72  Iter *pIndexIter
29cc0 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20  , i64 iMatch){. 
29cd0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
29ce0 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49   = (Fts5Iter*)pI
29cf0 6e 64 65 78 49 74 65 72 3b 0a 20 20 66 74 73 35  ndexIter;.  fts5
29d00 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f  MultiIterNextFro
29d10 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  m(pIter->pIndex,
29d20 20 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b   pIter, iMatch);
29d30 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
29d40 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d  dexReturn(pIter-
29d50 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  >pIndex);.}../*.
29d60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
29d70 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63  rrent term..*/.c
29d80 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
29d90 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28 46  e3Fts5IterTerm(F
29da0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
29db0 6e 64 65 78 49 74 65 72 2c 20 69 6e 74 20 2a 70  ndexIter, int *p
29dc0 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  n){.  int n;.  c
29dd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
29de0 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35  const char*)fts5
29df0 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 28 46  MultiIterTerm((F
29e00 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49  ts5Iter*)pIndexI
29e10 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20  ter, &n);.  *pn 
29e20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20  = n-1;.  return 
29e30 26 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &z[1];.}../*.** 
29e40 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f  Close an iterato
29e50 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65  r opened by an e
29e60 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73  arlier call to s
29e70 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
29e80 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  uery()..*/.void 
29e90 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
29ea0 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49 74  lose(Fts5IndexIt
29eb0 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b  er *pIndexIter){
29ec0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 49 74 65  .  if( pIndexIte
29ed0 72 20 29 7b 0a 20 20 20 20 46 74 73 35 49 74 65  r ){.    Fts5Ite
29ee0 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35  r *pIter = (Fts5
29ef0 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72  Iter*)pIndexIter
29f00 3b 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20  ;.    Fts5Index 
29f10 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d  *pIndex = pIter-
29f20 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73  >pIndex;.    fts
29f30 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
29f40 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43  Iter);.    fts5C
29f50 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65  loseReader(pInde
29f60 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  x);.  }.}../*.**
29f70 20 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65   Read and decode
29f80 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20   the "averages" 
29f90 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
29fa0 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a  database. .**.**
29fb0 20 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a   Parameter anSiz
29fc0 65 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  e must point to 
29fd0 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65  an array of size
29fe0 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f   nCol, where nCo
29ff0 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  l is.** the numb
2a000 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e  er of user defin
2a010 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
2a020 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a  e FTS table..*/.
2a030 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2a040 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28  ndexGetAverages(
2a050 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
2a060 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61  4 *pnRow, i64 *a
2a070 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43  nSize){.  int nC
2a080 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ol = p->pConfig-
2a090 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74  >nCol;.  Fts5Dat
2a0a0 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e  a *pData;..  *pn
2a0b0 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  Row = 0;.  memse
2a0c0 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a  t(anSize, 0, siz
2a0d0 65 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29  eof(i64) * nCol)
2a0e0 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35  ;.  pData = fts5
2a0f0 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
2a100 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29  _AVERAGES_ROWID)
2a110 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
2a120 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74  QLITE_OK && pDat
2a130 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74  a->nn ){.    int
2a140 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20   i = 0;.    int 
2a150 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66  iCol;.    i += f
2a160 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
2a170 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a  ata->p[i], (u64*
2a180 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72  )pnRow);.    for
2a190 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61  (iCol=0; i<pData
2a1a0 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f  ->nn && iCol<nCo
2a1b0 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
2a1c0 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
2a1d0 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
2a1e0 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65  ], (u64*)&anSize
2a1f0 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20  [iCol]);.    }. 
2a200 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
2a210 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20  lease(pData);.  
2a220 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
2a230 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
2a240 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
2a250 63 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65  current "average
2a260 73 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74  s" record with t
2a270 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2a280 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75  he buffer .** su
2a290 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65  pplied as the se
2a2a0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
2a2b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2a2c0 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65  5IndexSetAverage
2a2d0 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
2a2e0 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c  const u8 *pData,
2a2f0 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61   int nData){.  a
2a300 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
2a310 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
2a320 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
2a330 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
2a340 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29  D, pData, nData)
2a350 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
2a360 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
2a370 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2a380 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2a390 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d  of blocks this m
2a3a0 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66  odule has read f
2a3b0 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a  rom the %_data.*
2a3c0 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74  * table since it
2a3d0 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f   was created..*/
2a3e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2a3f0 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49  IndexReads(Fts5I
2a400 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75  ndex *p){.  retu
2a410 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a  rn p->nRead;.}..
2a420 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32  /*.** Set the 32
2a430 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75  -bit cookie valu
2a440 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
2a450 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72  start of all str
2a460 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72  ucture .** recor
2a470 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ds to the value 
2a480 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2a490 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
2a4a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2a4b0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
2a4c0 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
2a4d0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
2a4e0 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
2a4f0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2a500 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f  e3Fts5IndexSetCo
2a510 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a  okie(Fts5Index *
2a520 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20  p, int iNew){.  
2a530 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2a560 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e  ode */.  Fts5Con
2a570 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
2a580 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a  ->pConfig;    /*
2a590 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
2a5a0 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43  bject */.  u8 aC
2a5b0 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20  ookie[4];       
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5d0 2f 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73  /* Binary repres
2a5e0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77  entation of iNew
2a5f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c   */.  sqlite3_bl
2a600 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a  ob *pBlob = 0;..
2a610 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
2a620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2a630 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32  sqlite3Fts5Put32
2a640 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b  (aCookie, iNew);
2a650 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2a660 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66  _blob_open(pConf
2a670 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d  ig->db, pConfig-
2a680 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
2a690 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b  l, .      "block
2a6a0 22 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  ", FTS5_STRUCTUR
2a6b0 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c  E_ROWID, 1, &pBl
2a6c0 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  ob.  );.  if( rc
2a6d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a6e0 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
2a6f0 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f  write(pBlob, aCo
2a700 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20  okie, 4, 0);.   
2a710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
2a720 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b  ob_close(pBlob);
2a730 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2a740 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
2a750 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f  3Fts5IndexLoadCo
2a760 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a  nfig(Fts5Index *
2a770 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
2a780 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
2a790 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
2a7a0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
2a7b0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
2a7c0 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
2a7d0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
2a7e0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
2a7f0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2a800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2a840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a880 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
2a890 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
2a8a0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2a8b0 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69  n of the integri
2a8c0 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e  ty-check .** fun
2a8d0 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a  ctionality..*/..
2a8e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
2a8f0 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76  imple checksum v
2a900 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68  alue based on th
2a910 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  e arguments..*/.
2a920 75 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49  u64 sqlite3Fts5I
2a930 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a  ndexEntryCksum(.
2a940 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20    i64 iRowid, . 
2a950 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e   int iCol, .  in
2a960 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69  t iPos, .  int i
2a970 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Idx,.  const cha
2a980 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20  r *pTerm,.  int 
2a990 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69  nTerm.){.  int i
2a9a0 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52  ;.  u64 ret = iR
2a9b0 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28  owid;.  ret += (
2a9c0 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a  ret<<3) + iCol;.
2a9d0 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
2a9e0 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20  ) + iPos;.  if( 
2a9f0 69 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d  iIdx>=0 ) ret +=
2aa00 20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53   (ret<<3) + (FTS
2aa10 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20  5_MAIN_PREFIX + 
2aa20 69 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30  iIdx);.  for(i=0
2aa30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20  ; i<nTerm; i++) 
2aa40 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
2aa50 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65  + pTerm[i];.  re
2aa60 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66  turn ret;.}..#if
2aa70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2aa80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2aa90 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61  tion is purely a
2aaa0 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e  n internal test.
2aab0 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   It does not con
2aac0 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46  tribute to .** F
2aad0 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  TS functionality
2aae0 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e  , or even the in
2aaf0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69  tegrity-check, i
2ab00 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
2ab10 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73   Instead, it tes
2ab20 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ts that the same
2ab30 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77   set of pgno/row
2ab40 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  id combinations 
2ab50 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20  are .** visited 
2ab60 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2ab70 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73  ether the doclis
2ab80 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69  t-index identifi
2ab90 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73  ed by parameters
2aba0 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66  .** iSegid/iLeaf
2abb0 20 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20   is iterated in 
2abc0 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65  forwards or reve
2abd0 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  rse order..*/.st
2abe0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65  atic void fts5Te
2abf0 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a  stDlidxReverse(.
2ac00 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
2ac10 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20  .  int iSegid,  
2ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac30 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64     /* Segment id
2ac40 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f   to load from */
2ac50 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20  .  int iLeaf    
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac70 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69     /* Load docli
2ac80 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69  st-index for thi
2ac90 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46  s leaf */.){.  F
2aca0 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
2acb0 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20  lidx = 0;.  u64 
2acc0 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75  cksum1 = 13;.  u
2acd0 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a  64 cksum2 = 13;.
2ace0 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74  .  for(pDlidx=ft
2acf0 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
2ad00 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c  p, 0, iSegid, iL
2ad10 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35  eaf);.      fts5
2ad20 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
2ad30 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
2ad40 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
2ad50 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  ext(p, pDlidx). 
2ad60 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
2ad70 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  id = fts5DlidxIt
2ad80 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b  erRowid(pDlidx);
2ad90 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  .    int pgno = 
2ada0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
2adb0 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61  o(pDlidx);.    a
2adc0 73 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61  ssert( pgno>iLea
2add0 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20  f );.    cksum1 
2ade0 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
2adf0 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
2ae00 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
2ae10 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
2ae20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66  pDlidx = 0;..  f
2ae30 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c  or(pDlidx=fts5Dl
2ae40 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31  idxIterInit(p, 1
2ae50 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29  , iSegid, iLeaf)
2ae60 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
2ae70 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
2ae80 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  dx)==0;.      ft
2ae90 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
2aea0 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a  p, pDlidx).  ){.
2aeb0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
2aec0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f   fts5DlidxIterRo
2aed0 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  wid(pDlidx);.   
2aee0 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35   int pgno = fts5
2aef0 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
2af00 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72  lidx);.    asser
2af10 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  t( fts5DlidxIter
2af20 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65  Pgno(pDlidx)>iLe
2af30 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32  af );.    cksum2
2af40 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69   += iRowid + ((i
2af50 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20  64)pgno<<32);.  
2af60 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  }.  fts5DlidxIte
2af70 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
2af80 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20   pDlidx = 0;..  
2af90 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
2afa0 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d  E_OK && cksum1!=
2afb0 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d  cksum2 ) p->rc =
2afc0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d   FTS5_CORRUPT;.}
2afd0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
2afe0 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46  5QueryCksum(.  F
2aff0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b010 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a  * Fts5 index obj
2b020 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ect */.  int iId
2b030 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
2b040 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *z,             
2b050 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65       /* Index ke
2b060 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  y to query for *
2b070 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b090 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69      /* Size of i
2b0a0 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65  ndex key in byte
2b0b0 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  s */.  int flags
2b0c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b0d0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
2b0e0 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65  for Fts5IndexQue
2b0f0 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b  ry */.  u64 *pCk
2b100 73 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  sum             
2b110 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2b120 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75  T: Checksum valu
2b130 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44  e */.){.  int eD
2b140 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66  etail = p->pConf
2b150 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75  ig->eDetail;.  u
2b160 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73  64 cksum = *pCks
2b170 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49  um;.  Fts5IndexI
2b180 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a  ter *pIter = 0;.
2b190 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
2b1a0 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
2b1b0 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c  (p, z, n, flags,
2b1c0 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20 20   0, &pIter);..  
2b1d0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2b1e0 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74  E_OK && 0==sqlit
2b1f0 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
2b200 74 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20  ter) ){.    i64 
2b210 72 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 69  rowid = pIter->i
2b220 52 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20  Rowid;..    if( 
2b230 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
2b240 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
2b250 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69     cksum ^= sqli
2b260 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2b270 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c  yCksum(rowid, 0,
2b280 20 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b   0, iIdx, z, n);
2b290 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b2a0 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61    Fts5PoslistRea
2b2b0 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20  der sReader;.   
2b2c0 20 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74     for(sqlite3Ft
2b2d0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49  s5PoslistReaderI
2b2e0 6e 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74 61  nit(pIter->pData
2b2f0 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20  , pIter->nData, 
2b300 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20  &sReader);.     
2b310 20 20 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f       sReader.bEo
2b320 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  f==0;.          
2b330 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
2b340 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 73 52  stReaderNext(&sR
2b350 65 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a  eader).      ){.
2b360 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
2b370 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55   = FTS5_POS2COLU
2b380 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29  MN(sReader.iPos)
2b390 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
2b3a0 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46  ff = FTS5_POS2OF
2b3b0 46 53 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f  FSET(sReader.iPo
2b3c0 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  s);.        cksu
2b3d0 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35  m ^= sqlite3Fts5
2b3e0 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
2b3f0 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66  rowid, iCol, iOf
2b400 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a  f, iIdx, z, n);.
2b410 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2b440 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
2b450 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20 20  rNext(pIter);.  
2b460 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2b470 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70  3Fts5IterClose(p
2b480 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75  Iter);..  *pCksu
2b490 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74  m = cksum;.  ret
2b4a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2b4b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2b4c0 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61  is also purely a
2b4d0 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e  n internal test.
2b4e0 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   It does not con
2b4f0 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46  tribute to .** F
2b500 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  TS functionality
2b510 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e  , or even the in
2b520 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69  tegrity-check, i
2b530 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74  n any way..*/.st
2b540 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65  atic void fts5Te
2b550 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  stTerm(.  Fts5In
2b560 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42  dex *p, .  Fts5B
2b570 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20  uffer *pPrev,   
2b580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
2b590 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20  evious term */. 
2b5a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
2b5b0 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
2b5c0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77   /* Possibly new
2b5d0 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f   term to test */
2b5e0 0a 20 20 75 36 34 20 65 78 70 65 63 74 65 64 2c  .  u64 expected,
2b5f0 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29  .  u64 *pCksum.)
2b600 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
2b610 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d  rc;.  if( pPrev-
2b620 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  >n==0 ){.    fts
2b630 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
2b640 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74  pPrev, n, (const
2b650 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65   u8*)z);.  }else
2b660 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b670 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e  E_OK && (pPrev->
2b680 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  n!=n || memcmp(p
2b690 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20  Prev->p, z, n)) 
2b6a0 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d  ){.    u64 cksum
2b6b0 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20  3 = *pCksum;.   
2b6c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
2b6d0 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rm = (const char
2b6e0 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20  *)&pPrev->p[1]; 
2b6f0 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72   /* term sans pr
2b700 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20  efix-byte */.   
2b710 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72   int nTerm = pPr
2b720 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20  ev->n-1;        
2b730 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
2b740 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
2b750 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20  .    int iIdx = 
2b760 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46  (pPrev->p[0] - F
2b770 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29  TS5_MAIN_PREFIX)
2b780 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
2b790 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a  = (iIdx==0 ? 0 :
2b7a0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
2b7b0 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36  _PREFIX);.    u6
2b7c0 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75  4 ck1 = 0;.    u
2b7d0 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20  64 ck2 = 0;..   
2b7e0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2b7f0 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72  he results retur
2b800 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20  ned for ASC and 
2b810 44 45 53 43 20 71 75 65 72 69 65 73 20 61 72 65  DESC queries are
2b820 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  .    ** the same
2b830 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74  . If not, call t
2b840 68 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  his corruption. 
2b850 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
2b860 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
2b870 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
2b880 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b  m, flags, &ck1);
2b890 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b8a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b8b0 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54  int f = flags|FT
2b8c0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
2b8d0 53 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  SC;.      rc = f
2b8e0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
2b8f0 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
2b900 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20  erm, f, &ck2);. 
2b910 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2b920 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
2b930 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54  1!=ck2 ) rc = FT
2b940 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20  S5_CORRUPT;..   
2b950 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2b960 20 70 72 65 66 69 78 20 71 75 65 72 79 2c 20 63   prefix query, c
2b970 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65  heck that the re
2b980 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69  sults returned i
2b990 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  f the.    ** the
2b9a0 20 69 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c   index is disabl
2b9b0 65 64 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ed are the same.
2b9c0 20 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64   In both ASC and
2b9d0 20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20   DESC order. .  
2b9e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2b9f0 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20   check may only 
2ba00 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
2ba10 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69  the hash table i
2ba20 73 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20  s empty. This.  
2ba30 20 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20    ** is because 
2ba40 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f  the hash table o
2ba50 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20 73  nly supports a s
2ba60 69 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79  ingle scan query
2ba70 20 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d   at.    ** a tim
2ba80 65 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69  e, and the multi
2ba90 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20  -iter loop from 
2baa0 77 68 69 63 68 20 74 68 69 73 20 66 75 6e 63 74  which this funct
2bab0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20  ion is called.  
2bac0 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
2bad0 70 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20  performing such 
2bae0 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69  a scan. */.    i
2baf0 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  f( p->nPendingDa
2bb00 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ta==0 ){.      i
2bb10 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d  f( iIdx>0 && rc=
2bb20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bb30 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c        int f = fl
2bb40 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  ags|FTS5INDEX_QU
2bb50 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a  ERY_TEST_NOIDX;.
2bb60 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b          ck2 = 0;
2bb70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
2bb80 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
2bb90 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
2bba0 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20  rm, f, &ck2);.  
2bbb0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2bbc0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d  LITE_OK && ck1!=
2bbd0 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ck2 ) rc = FTS5_
2bbe0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2bbf0 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e  .      if( iIdx>
2bc00 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
2bc10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
2bc20 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
2bc30 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54  INDEX_QUERY_TEST
2bc40 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58  _NOIDX|FTS5INDEX
2bc50 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20  _QUERY_DESC;.   
2bc60 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20       ck2 = 0;.  
2bc70 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
2bc80 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
2bc90 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
2bca0 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20   f, &ck2);.     
2bcb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bcc0 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
2bcd0 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
2bce0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
2bcf0 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20    }..    cksum3 
2bd00 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35  ^= ck1;.    fts5
2bd10 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70  BufferSet(&rc, p
2bd20 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20  Prev, n, (const 
2bd30 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28  u8*)z);..    if(
2bd40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2bd50 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74  & cksum3!=expect
2bd60 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
2bd70 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2bd80 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d     }.    *pCksum
2bd90 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20   = cksum3;.  }. 
2bda0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20   p->rc = rc;.}. 
2bdb0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2bdc0 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76  fts5TestDlidxRev
2bdd0 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65  erse(x,y,z).# de
2bde0 66 69 6e 65 20 66 74 73 35 54 65 73 74 54 65 72  fine fts5TestTer
2bdf0 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  m(u,v,w,x,y,z).#
2be00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
2be10 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  ck that:.**.**  
2be20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f   1) All leaves o
2be30 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69  f pSeg between i
2be40 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20  First and iLast 
2be50 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73  (inclusive) exis
2be60 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f  t and.**      co
2be70 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73  ntain zero terms
2be80 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65  ..**   2) All le
2be90 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74  aves of pSeg bet
2bea0 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e  ween iNoRowid an
2beb0 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69  d iLast (inclusi
2bec0 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a  ve) exist and.**
2bed0 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65        contain ze
2bee0 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74  ro rowids..*/.st
2bef0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
2bf00 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
2bf10 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e  kEmpty(.  Fts5In
2bf20 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74  dex *p,.  Fts5St
2bf30 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
2bf40 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67  pSeg,     /* Seg
2bf50 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e  ment to check in
2bf60 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e  ternal consisten
2bf70 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  cy */.  int iFir
2bf80 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77  st,.  int iNoRow
2bf90 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a  id,.  int iLast.
2bfa0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
2bfb0 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  * Now check that
2bfc0 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79   the iter.nEmpty
2bfd0 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e   leaves followin
2bfe0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  g the current le
2bff0 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73  af.  ** (a) exis
2c000 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
2c010 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20  n no terms. */. 
2c020 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70   for(i=iFirst; p
2c030 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2c040 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b  && i<=iLast; i++
2c050 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
2c060 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74  *pLeaf = fts5Dat
2c070 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
2c080 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
2c090 2d 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20  ->iSegid, i));. 
2c0a0 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a     if( pLeaf ){.
2c0b0 20 20 20 20 20 20 69 66 28 20 21 66 74 73 35 4c        if( !fts5L
2c0c0 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c  eafIsTermless(pL
2c0d0 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  eaf) ) p->rc = F
2c0e0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c0f0 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77     if( i>=iNoRow
2c100 69 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61  id && 0!=fts5Lea
2c110 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
2c120 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20  Leaf) ) p->rc = 
2c130 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2c140 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61    }.    fts5Data
2c150 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
2c160 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
2c170 69 64 20 66 74 73 35 49 6e 74 65 67 72 69 74 79  id fts5Integrity
2c180 43 68 65 63 6b 50 67 69 64 78 28 46 74 73 35 49  CheckPgidx(Fts5I
2c190 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74  ndex *p, Fts5Dat
2c1a0 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74  a *pLeaf){.  int
2c1b0 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20   iTermOff = 0;. 
2c1c0 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35   int ii;..  Fts5
2c1d0 42 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30  Buffer buf1 = {0
2c1e0 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66  ,0,0};.  Fts5Buf
2c1f0 66 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c  fer buf2 = {0,0,
2c200 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61  0};..  ii = pLea
2c210 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69  f->szLeaf;.  whi
2c220 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e  le( ii<pLeaf->nn
2c230 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
2c240 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
2c250 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  res;.    int iOf
2c260 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72  f;.    int nIncr
2c270 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73  ;..    ii += fts
2c280 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2c290 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63  eaf->p[ii], nInc
2c2a0 72 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66  r);.    iTermOff
2c2b0 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69   += nIncr;.    i
2c2c0 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
2c2d0 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  .    if( iOff>=p
2c2e0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2c2f0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2c300 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2c310 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f  }else if( iTermO
2c320 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20  ff==nIncr ){.   
2c330 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
2c340 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2c350 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2c360 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79  af->p[iOff], nBy
2c370 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  te);.      if( (
2c380 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61  iOff+nByte)>pLea
2c390 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
2c3a0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2c3b0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2c3c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c3d0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
2c3e0 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79  ->rc, &buf1, nBy
2c3f0 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  te, &pLeaf->p[iO
2c400 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ff]);.      }.  
2c410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2c420 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b  nt nKeep, nByte;
2c430 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
2c440 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2c450 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
2c460 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f  nKeep);.      iO
2c470 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2c480 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
2c490 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
2c4a0 20 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62       if( nKeep>b
2c4b0 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e  uf1.n || (iOff+n
2c4c0 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Byte)>pLeaf->szL
2c4d0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eaf ){.        p
2c4e0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2c4f0 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
2c500 7b 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e  {.        buf1.n
2c510 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20   = nKeep;.      
2c520 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
2c530 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
2c540 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c  buf1, nByte, &pL
2c550 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20  eaf->p[iOff]);. 
2c560 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2c570 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2c580 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2c590 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f  s = fts5BufferCo
2c5a0 6d 70 61 72 65 28 26 62 75 66 31 2c 20 26 62 75  mpare(&buf1, &bu
2c5b0 66 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f2);.        if(
2c5c0 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20   res<=0 ) p->rc 
2c5d0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2c5e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c5f0 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
2c600 26 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62  &p->rc, &buf2, b
2c610 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a  uf1.n, buf1.p);.
2c620 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65    }..  fts5Buffe
2c630 72 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20  rFree(&buf1);.  
2c640 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
2c650 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  buf2);.}..static
2c660 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49   void fts5IndexI
2c670 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67  ntegrityCheckSeg
2c680 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65  ment(.  Fts5Inde
2c690 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
2c6a0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
2c6b0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
2c6c0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
2c6d0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20  eSegment *pSeg  
2c6e0 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
2c6f0 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c  o check internal
2c700 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a   consistency */.
2c710 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
2c720 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
2c730 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33  onfig;.  sqlite3
2c740 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
2c750 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69  ;.  int rc2;.  i
2c760 6e 74 20 69 49 64 78 50 72 65 76 4c 65 61 66 20  nt iIdxPrevLeaf 
2c770 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
2c780 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64  t-1;.  int iDlid
2c790 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67  xPrevLeaf = pSeg
2c7a0 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69  ->pgnoLast;..  i
2c7b0 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  f( pSeg->pgnoFir
2c7c0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
2c7d0 0a 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70  .  fts5IndexPrep
2c7e0 61 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d  areStmt(p, &pStm
2c7f0 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  t, sqlite3_mprin
2c800 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43  tf(.      "SELEC
2c810 54 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28  T segid, term, (
2c820 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26  pgno>>1), (pgno&
2c830 31 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69  1) FROM %Q.'%q_i
2c840 64 78 27 20 57 48 45 52 45 20 73 65 67 69 64 3d  dx' WHERE segid=
2c850 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66  %d",.      pConf
2c860 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
2c870 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69  ->zName, pSeg->i
2c880 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f  Segid.  ));..  /
2c890 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
2c8a0 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  h the b-tree hie
2c8b0 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68  rarchy.  */.  wh
2c8c0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
2c8d0 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
2c8e0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2c8f0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
2c900 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20  i64 iRow;       
2c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c920 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   Rowid for this 
2c930 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35  leaf */.    Fts5
2c940 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20  Data *pLeaf;    
2c950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2c960 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20  a for this leaf 
2c970 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78  */..    int nIdx
2c980 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  Term = sqlite3_c
2c990 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
2c9a0 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74  t, 1);.    const
2c9b0 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20   char *zIdxTerm 
2c9c0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
2c9d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2c9e0 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
2c9f0 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d    int iIdxLeaf =
2ca00 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2ca10 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20  int(pStmt, 2);. 
2ca20 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78     int bIdxDlidx
2ca30 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2ca40 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b  n_int(pStmt, 3);
2ca50 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2ca60 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e  leaf in question
2ca70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2ca80 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74  n trimmed from t
2ca90 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20  he segment, .   
2caa0 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20   ** ignore this 
2cab0 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74  b-tree entry. Ot
2cac0 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74  herwise, load it
2cad0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f   into memory. */
2cae0 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c 65 61  .    if( iIdxLea
2caf0 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  f<pSeg->pgnoFirs
2cb00 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
2cb10 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45    iRow = FTS5_SE
2cb20 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
2cb30 2d 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65  ->iSegid, iIdxLe
2cb40 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d  af);.    pLeaf =
2cb50 20 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c   fts5LeafRead(p,
2cb60 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20   iRow);.    if( 
2cb70 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
2cb80 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
2cb90 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f  that the leaf co
2cba0 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
2cbb0 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68  one term, and th
2cbc0 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20  at it is equal. 
2cbd0 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67     ** to or larg
2cbe0 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69  er than the spli
2cbf0 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72  t-key in zIdxTer
2cc00 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74  m.  Also check t
2cc10 68 61 74 20 69 66 20 74 68 65 72 65 0a 20 20 20  hat if there.   
2cc20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f   ** is also a ro
2cc30 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68  wid pointer with
2cc40 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  in the leaf page
2cc50 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e   header, it poin
2cc60 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c  ts to a.    ** l
2cc70 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74  ocation before t
2cc80 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20  he term.  */.   
2cc90 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d   if( pLeaf->nn<=
2cca0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
2ccb0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
2ccc0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2ccd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
2cce0 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t iOff;         
2ccf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2cd00 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72  set of first ter
2cd10 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20  m on leaf */.   
2cd20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
2cd30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2cd40 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
2cd50 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20  t rowid on leaf 
2cd60 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65  */.      int nTe
2cd70 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2cd80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2cd90 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20  term on leaf in 
2cda0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  bytes */.      i
2cdb0 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
2cdc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2cdd0 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d  mparison of term
2cde0 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a   and split-key *
2cdf0 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  /..      iOff = 
2ce00 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72  fts5LeafFirstTer
2ce10 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20  mOff(pLeaf);.   
2ce20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
2ce30 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
2ce40 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20  dOff(pLeaf);.   
2ce50 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
2ce60 3e 3d 69 4f 66 66 20 7c 7c 20 69 4f 66 66 3e 3d  >=iOff || iOff>=
2ce70 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
2ce80 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
2ce90 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2cea0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ceb0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2cec0 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2ced0 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65  af->p[iOff], nTe
2cee0 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73  rm);.        res
2cef0 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66   = memcmp(&pLeaf
2cf00 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54  ->p[iOff], zIdxT
2cf10 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20  erm, MIN(nTerm, 
2cf20 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20  nIdxTerm));.    
2cf30 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
2cf40 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e   res = nTerm - n
2cf50 49 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  IdxTerm;.       
2cf60 20 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e   if( res<0 ) p->
2cf70 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2cf80 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  T;.      }..    
2cf90 20 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43    fts5IntegrityC
2cfa0 68 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65  heckPgidx(p, pLe
2cfb0 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  af);.    }.    f
2cfc0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
2cfd0 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70  Leaf);.    if( p
2cfe0 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ->rc ) break;.. 
2cff0 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20     /* Now check 
2d000 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45  that the iter.nE
2d010 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c  mpty leaves foll
2d020 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  owing the curren
2d030 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61  t leaf.    ** (a
2d040 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20  ) exist and (b) 
2d050 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
2d060 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64  . */.    fts5Ind
2d070 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2d080 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20 70  Empty(.        p
2d090 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72 65 76  , pSeg, iIdxPrev
2d0a0 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72  Leaf+1, iDlidxPr
2d0b0 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65  evLeaf+1, iIdxLe
2d0c0 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20  af-1.    );.    
2d0d0 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61  if( p->rc ) brea
2d0e0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  k;..    /* If th
2d0f0 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
2d100 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68  -index, check th
2d110 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68  at it looks righ
2d120 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  t. */.    if( bI
2d130 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  dxDlidx ){.     
2d140 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
2d150 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20  pDlidx = 0;  /* 
2d160 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
2d170 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e  rough doclist in
2d180 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
2d190 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64   iPrevLeaf = iId
2d1a0 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74  xLeaf;.      int
2d1b0 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e   iSegid = pSeg->
2d1c0 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e  iSegid;.      in
2d1d0 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20  t iPg = 0;.     
2d1e0 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20   i64 iKey;..    
2d1f0 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
2d200 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
2d210 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64  , 0, iSegid, iId
2d220 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  xLeaf);.        
2d230 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
2d240 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
2d250 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
2d260 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
2d270 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29   pDlidx).      )
2d280 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  {..        /* Ch
2d290 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65  eck any rowid-le
2d2a0 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63  ss pages that oc
2d2b0 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63  cur before the c
2d2c0 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a  urrent leaf. */.
2d2d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
2d2e0 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67  iPrevLeaf+1; iPg
2d2f0 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67  <fts5DlidxIterPg
2d300 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b  no(pDlidx); iPg+
2d310 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b  +){.          iK
2d320 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ey = FTS5_SEGMEN
2d330 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
2d340 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iPg);.          
2d350 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2d360 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
2d370 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
2d380 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2d390 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 46 69    if( fts5LeafFi
2d3a0 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
2d3b0 66 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  f)!=0 ) p->rc = 
2d3c0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2d3d0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
2d3e0 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
2d3f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d410 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35  iPrevLeaf = fts5
2d420 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
2d430 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20  lidx);..        
2d440 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2d450 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69  e leaf page indi
2d460 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
2d470 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  rator really doe
2d480 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  s.        ** con
2d490 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73  tain the rowid s
2d4a0 75 67 67 65 73 74 65 64 20 62 79 20 74 68 65 20  uggested by the 
2d4b0 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  same. */.       
2d4c0 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
2d4d0 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
2d4e0 64 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20  d, iPrevLeaf);. 
2d4f0 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
2d500 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
2d510 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
2d520 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
2d530 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b       i64 iRowid;
2d540 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2d550 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c  RowidOff = fts5L
2d560 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
2d570 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
2d580 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46     ASSERT_SZLEAF
2d590 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  _OK(pLeaf);.    
2d5a0 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
2d5b0 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
2d5c0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2d5d0 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
2d5e0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2d5f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d600 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
2d610 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
2d620 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
2d630 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
2d640 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21       if( iRowid!
2d650 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  =fts5DlidxIterRo
2d660 77 69 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d  wid(pDlidx) ) p-
2d670 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2d680 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
2d690 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
2d6a0 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
2d6b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d6c0 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64    }..      iDlid
2d6d0 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b  xPrevLeaf = iPg;
2d6e0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
2d6f0 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
2d700 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65 73 74  ;.      fts5Test
2d710 44 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c 20  DlidxReverse(p, 
2d720 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
2d730 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d740 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65      iDlidxPrevLe
2d750 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  af = pSeg->pgnoL
2d760 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  ast;.      /* TO
2d770 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20  DO: Check there 
2d780 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e  is no doclist in
2d790 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  dex */.    }..  
2d7a0 20 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d    iIdxPrevLeaf =
2d7b0 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a   iIdxLeaf;.  }..
2d7c0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
2d7d0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2d7e0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
2d7f0 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
2d800 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67  = rc2;..  /* Pag
2d810 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73  e iter.iLeaf mus
2d820 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67  t now be the rig
2d830 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65  htmost leaf-page
2d840 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20   in the segment 
2d850 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70  */.#if 0.  if( p
2d860 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2d870 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70  && iter.iLeaf!=p
2d880 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
2d890 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
2d8a0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23  5_CORRUPT;.  }.#
2d8b0 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
2d8c0 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  Run internal che
2d8d0 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  cks to ensure th
2d8e0 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  at the FTS index
2d8f0 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c   (a) is internal
2d900 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e  ly .** consisten
2d910 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
2d920 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77  ns entries for w
2d930 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20  hich the XOR of 
2d940 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a  the checksums.**
2d950 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62   as calculated b
2d960 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  y sqlite3Fts5Ind
2d970 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69  exEntryCksum() i
2d980 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52  s cksum..**.** R
2d990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2d9a0 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74  RUPT if any of t
2d9b0 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  he internal chec
2d9c0 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74  ks fail, or if t
2d9d0 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64  he.** checksum d
2d9e0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52  oes not match. R
2d9f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2da00 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61  if all checks pa
2da10 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72  ss without.** er
2da20 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ror, or some oth
2da30 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  er SQLite error 
2da40 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20  code if another 
2da50 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29  error (e.g. OOM)
2da60 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
2da70 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2da80 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
2da90 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  k(Fts5Index *p, 
2daa0 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e  u64 cksum){.  in
2dab0 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70  t eDetail = p->p
2dac0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
2dad0 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  u64 cksum2 = 
2dae0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2daf0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62     /* Checksum b
2db00 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73  ased on contents
2db10 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20   of indexes */. 
2db20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
2db30 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  ist = {0,0,0};  
2db40 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
2db50 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73  to hold a poslis
2db60 74 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20  t */.  Fts5Iter 
2db70 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
2db80 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
2db90 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2dba0 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a  h entire index *
2dbb0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
2dbc0 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20  e *pStruct;     
2dbd0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
2dbe0 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65  ucture */..#ifde
2dbf0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2dc00 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74 72   /* Used by extr
2dc10 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73  a internal tests
2dc20 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45   only run if NDE
2dc30 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
2dc40 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75  ed */.  u64 cksu
2dc50 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  m3 = 0;         
2dc60 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2dc70 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e  sum based on con
2dc80 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73  tents of indexes
2dc90 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2dca0 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b   term = {0,0,0};
2dcb0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
2dcc0 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73  used to hold mos
2dcd0 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f  t recent term */
2dce0 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20  .#endif.  const 
2dcf0 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
2dd00 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55  INDEX_QUERY_NOOU
2dd10 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c 6f  TPUT;.  .  /* Lo
2dd20 61 64 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  ad the FTS index
2dd30 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2dd40 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
2dd50 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
2dd60 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2dd70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
2dd80 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d  des of each segm
2dd90 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65  ent match the le
2dda0 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53  aves */.  if( pS
2ddb0 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74  truct ){.    int
2ddc0 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
2ddd0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
2dde0 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
2ddf0 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
2de00 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
2de10 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
2de20 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
2de30 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
2de40 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2de50 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53  ment *pSeg = &pS
2de60 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
2de70 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
2de80 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65          fts5Inde
2de90 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
2dea0 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b  egment(p, pSeg);
2deb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2dec0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73   }..  /* The cks
2ded0 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  um argument pass
2dee0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
2def0 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75  ion is a checksu
2df00 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a  m calculated.  *
2df10 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65  * based on all e
2df20 78 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20  xpected entries 
2df30 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  in the FTS index
2df40 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66   (including pref
2df50 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e  ix index.  ** en
2df60 74 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f  tries). This blo
2df70 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61  ck checks that a
2df80 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c   checksum calcul
2df90 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
2dfa0 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f  e.  ** actual co
2dfb0 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e  ntents of FTS in
2dfc0 64 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c  dex is identical
2dfd0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20  ..  **.  ** Two 
2dfe0 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
2dff0 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72  same checksum ar
2e000 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68  e calculated. Th
2e010 65 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20  e first (stack. 
2e020 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73   ** variable cks
2e030 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e  um2) based on en
2e040 74 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20  tries extracted 
2e050 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65  from the full-te
2e060 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68  xt index.  ** wh
2e070 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65  ile doing a line
2e080 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20  ar scan of each 
2e090 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78  individual index
2e0a0 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a   in turn. .  **.
2e0b0 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72    ** As each ter
2e0c0 6d 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  m visited by the
2e0d0 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61   linear scans, a
2e0e0 20 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20   separate query 
2e0f0 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
2e100 65 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72  e term is perfor
2e110 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63  med. cksum3 is c
2e120 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20  alculated based 
2e130 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20  on the entries. 
2e140 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79   ** extracted by
2e150 20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a   these queries..
2e160 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d    */.  for(fts5M
2e170 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
2e180 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30  Struct, flags, 0
2e190 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26  , 0, 0, -1, 0, &
2e1a0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74  pIter);.      ft
2e1b0 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
2e1c0 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20  , pIter)==0;.   
2e1d0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
2e1e0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
2e1f0 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  , 0).  ){.    in
2e200 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
2e210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2e220 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74  e of term in byt
2e230 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50  es */.    i64 iP
2e240 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  os = 0;         
2e250 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
2e260 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c  n read from posl
2e270 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ist */.    int i
2e280 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Off = 0;        
2e290 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2e2a0 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20   within poslist 
2e2b0 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  */.    i64 iRowi
2e2c0 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
2e2d0 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
2e2e0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
2e2f0 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
2e300 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29  rTerm(pIter, &n)
2e310 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2e320 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c  s is a new term,
2e330 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55   query for it. U
2e340 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74  pdate cksum3 wit
2e350 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a  h the results. *
2e360 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65  /.    fts5TestTe
2e370 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20  rm(p, &term, z, 
2e380 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75  n, cksum2, &cksu
2e390 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44  m3);..    if( eD
2e3a0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
2e3b0 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
2e3c0 20 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c 74   if( 0==fts5Mult
2e3d0 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
2e3e0 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20  pIter) ){.      
2e3f0 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69    cksum2 ^= sqli
2e400 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2e410 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 30  yCksum(iRowid, 0
2e420 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  , 0, -1, z, n);.
2e430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2e440 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74  e{.      poslist
2e450 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74  .n = 0;.      ft
2e460 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
2e470 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67  (p, &pIter->aSeg
2e480 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31  [pIter->aFirst[1
2e490 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26 70  ].iFirst], 0, &p
2e4a0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  oslist);.      w
2e4b0 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33  hile( 0==sqlite3
2e4c0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
2e4d0 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73  4(poslist.p, pos
2e4e0 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26  list.n, &iOff, &
2e4f0 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20  iPos) ){.       
2e500 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35   int iCol = FTS5
2e510 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73  _POS2COLUMN(iPos
2e520 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2e530 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f  TokOff = FTS5_PO
2e540 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a  S2OFFSET(iPos);.
2e550 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e          cksum2 ^
2e560 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2e570 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
2e580 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f  wid, iCol, iTokO
2e590 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  ff, -1, z, n);. 
2e5a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e5b0 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  .  fts5TestTerm(
2e5c0 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20  p, &term, 0, 0, 
2e5d0 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29  cksum2, &cksum3)
2e5e0 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ;..  fts5MultiIt
2e5f0 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20  erFree(pIter);. 
2e600 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2e610 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d  TE_OK && cksum!=
2e620 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d  cksum2 ) p->rc =
2e630 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
2e640 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
2e650 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
2e660 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2e670 45 42 55 47 0a 20 20 66 74 73 35 42 75 66 66 65  EBUG.  fts5Buffe
2e680 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65  rFree(&term);.#e
2e690 6e 64 69 66 0a 20 20 66 74 73 35 42 75 66 66 65  ndif.  fts5Buffe
2e6a0 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b  rFree(&poslist);
2e6b0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
2e6c0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
2e6d0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2e6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2e720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e760 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
2e770 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
2e780 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2e790 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
2e7a0 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20  ode() scalar.** 
2e7b0 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a  function only..*
2e7c0 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  /../*.** Decode 
2e7d0 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72  a segment-data r
2e7e0 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  owid from the %_
2e7f0 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73  data table. This
2e800 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
2e810 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20  the opposite of 
2e820 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45  macro FTS5_SEGME
2e830 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73  NT_ROWID()..*/.s
2e840 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2e850 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36  ecodeRowid(.  i6
2e860 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
2e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e880 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61   Rowid from %_da
2e890 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ta table */.  in
2e8a0 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20  t *piSegid,     
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e8c0 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64   OUT: Segment id
2e8d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69   */.  int *pbDli
2e8e0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
2e8f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c        /* OUT: Dl
2e900 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e  idx flag */.  in
2e910 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20  t *piHeight,    
2e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e930 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a   OUT: Height */.
2e940 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20    int *piPgno   
2e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e960 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e    /* OUT: Page n
2e970 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70  umber */.){.  *p
2e980 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52  iPgno = (int)(iR
2e990 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
2e9a0 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47  << FTS5_DATA_PAG
2e9b0 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  E_B) - 1));.  iR
2e9c0 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
2e9d0 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70  TA_PAGE_B;..  *p
2e9e0 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28  iHeight = (int)(
2e9f0 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
2ea00 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48  1 << FTS5_DATA_H
2ea10 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a  EIGHT_B) - 1));.
2ea20 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
2ea30 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b  5_DATA_HEIGHT_B;
2ea40 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28  ..  *pbDlidx = (
2ea50 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78  int)(iRowid & 0x
2ea60 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20  0001);.  iRowid 
2ea70 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c  >>= FTS5_DATA_DL
2ea80 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64  I_B;..  *piSegid
2ea90 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
2eaa0 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
2eab0 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20  S5_DATA_ID_B) - 
2eac0 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  1));.}..static v
2ead0 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77  oid fts5DebugRow
2eae0 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  id(int *pRc, Fts
2eaf0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
2eb00 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20  64 iKey){.  int 
2eb10 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c  iSegid, iHeight,
2eb20 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20   iPgno, bDlidx; 
2eb30 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63        /* Rowid c
2eb40 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66  ompenents */.  f
2eb50 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69  ts5DecodeRowid(i
2eb60 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62  Key, &iSegid, &b
2eb70 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c  Dlidx, &iHeight,
2eb80 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28   &iPgno);..  if(
2eb90 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
2eba0 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35    if( iKey==FTS5
2ebb0 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
2ebc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2ebd0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2ebe0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2ebf0 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29  , "{averages} ")
2ec00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ec10 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ec20 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ec30 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74  (pRc, pBuf, "{st
2ec40 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20  ructure}");.    
2ec50 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20  }.  }.  else{.  
2ec60 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2ec70 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2ec80 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73  pRc, pBuf, "{%ss
2ec90 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e  egid=%d h=%d pgn
2eca0 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20  o=%d}",.        
2ecb0 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20  bDlidx ? "dlidx 
2ecc0 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20  " : "", iSegid, 
2ecd0 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20  iHeight, iPgno. 
2ece0 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61     );.  }.}..sta
2ecf0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
2ed00 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69  ugStructure(.  i
2ed10 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
2ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ed30 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20  * IN/OUT: error 
2ed40 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
2ed50 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74  ffer *pBuf,.  Ft
2ed60 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29  s5Structure *p.)
2ed70 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53  {.  int iLvl, iS
2ed80 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
2ed90 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
2eda0 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73  hrough levels, s
2edb0 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f  egments */..  fo
2edc0 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
2edd0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
2ede0 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
2edf0 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
2ee00 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  = &p->aLevel[iLv
2ee10 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l];.    sqlite3F
2ee20 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2ee30 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2ee40 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c   .        " {lvl
2ee50 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53  =%d nMerge=%d nS
2ee60 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c  eg=%d", iLvl, pL
2ee70 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c  vl->nMerge, pLvl
2ee80 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20  ->nSeg.    );.  
2ee90 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
2eea0 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
2eeb0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Seg++){.      Ft
2eec0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2eed0 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
2eee0 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
2eef0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2ef00 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2ef10 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b  f(pRc, pBuf, " {
2ef20 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e  id=%d leaves=%d.
2ef30 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20  .%d}", .        
2ef40 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20    pSeg->iSegid, 
2ef50 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c  pSeg->pgnoFirst,
2ef60 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a   pSeg->pgnoLast.
2ef70 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2ef80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ef90 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2efa0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29  (pRc, pBuf, "}")
2efb0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2efc0 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74  his is part of t
2efd0 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
2efe0 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a   debugging aid..
2eff0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20  **.** Arguments 
2f000 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74  pBlob/nBlob cont
2f010 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64  ain a serialized
2f020 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
2f030 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66  bject. This.** f
2f040 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
2f050 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
2f060 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2f070 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65  of the same obje
2f080 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66  ct.** to the buf
2f090 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68  fer passed as th
2f0a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2f0b0 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
2f0c0 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72  id fts5DecodeStr
2f0d0 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70  ucture(.  int *p
2f0e0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
2f0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2f100 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
2f110 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2f120 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75  *pBuf,.  const u
2f130 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  8 *pBlob, int nB
2f140 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lob.){.  int rc;
2f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f160 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2f170 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
2f180 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20  5Structure *p = 
2f190 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2f1a0 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72  Decoded structur
2f1b0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72  e object */..  r
2f1c0 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  c = fts5Structur
2f1d0 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e  eDecode(pBlob, n
2f1e0 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20  Blob, 0, &p);.  
2f1f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f200 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20  K ){.    *pRc = 
2f210 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2f220 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67    }..  fts5Debug
2f230 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70  Structure(pRc, p
2f240 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53  Buf, p);.  fts5S
2f250 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
2f260 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  p);.}../*.** Thi
2f270 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  s is part of the
2f280 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
2f290 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a  ebugging aid..**
2f2a0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42  .** Arguments pB
2f2b0 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69  lob/nBlob contai
2f2c0 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20  n an "averages" 
2f2d0 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e  record. This fun
2f2e0 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64  ction .** append
2f2f0 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
2f300 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
2f310 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74  n of record to t
2f320 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  he buffer passed
2f330 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f   .** as the seco
2f340 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f  nd argument. .*/
2f350 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2f360 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28  5DecodeAverages(
2f370 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
2f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f390 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
2f3a0 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
2f3b0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
2f3c0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f    const u8 *pBlo
2f3d0 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a  b, int nBlob.){.
2f3e0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63    int i = 0;.  c
2f3f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63  onst char *zSpac
2f400 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65  e = "";..  while
2f410 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20  ( i<nBlob ){.   
2f420 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   u64 iVal;.    i
2f430 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
2f440 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b  etVarint(&pBlob[
2f450 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  i], &iVal);.    
2f460 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2f470 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2f480 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c  c, pBuf, "%s%d",
2f490 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56   zSpace, (int)iV
2f4a0 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20  al);.    zSpace 
2f4b0 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = " ";.  }.}../*
2f4c0 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29  .** Buffer (a/n)
2f4d0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
2f4e0 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66  ontain a list of
2f4f0 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69   serialized vari
2f500 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63  nts. Read.** eac
2f510 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70  h varint and app
2f520 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72  end its string r
2f530 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f  epresentation to
2f540 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65   buffer pBuf. Re
2f550 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69  turn.** after ei
2f560 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62  ther the input b
2f570 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74  uffer is exhaust
2f580 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20  ed or a 0 value 
2f590 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  is read..**.** T
2f5a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2f5b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2f5c0 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
2f5d0 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2f5e0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2f5f0 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
2f600 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
2f610 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
2f620 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
2f630 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  n){.  int iOff =
2f640 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66   0;.  while( iOf
2f650 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  f<n ){.    int i
2f660 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  Val;.    iOff +=
2f670 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2f680 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29  (&a[iOff], iVal)
2f690 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2f6a0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2f6b0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2f6c0 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d   %d", iVal);.  }
2f6d0 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
2f6e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61  }../*.** The sta
2f6f0 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f  rt of buffer (a/
2f700 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  n) contains the 
2f710 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69  start of a docli
2f720 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a  st. The doclist.
2f730 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ** may or may no
2f740 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20  t finish within 
2f750 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73  the buffer. This
2f760 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
2f770 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72  s a text.** repr
2f780 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2f790 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f  e part of the do
2f7a0 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72  clist that is pr
2f7b0 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a  esent to buffer.
2f7c0 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20  ** pBuf. .**.** 
2f7d0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2f7e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2f7f0 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
2f800 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
2f810 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2f820 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  t fts5DecodeDocl
2f830 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
2f840 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2f850 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2f860 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69   n){.  i64 iDoci
2f870 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  d = 0;.  int iOf
2f880 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e  f = 0;..  if( n>
2f890 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20  0 ){.    iOff = 
2f8a0 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
2f8b0 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69  rint(a, (u64*)&i
2f8c0 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Docid);.    sqli
2f8d0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2f8e0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2f8f0 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c  Buf, " id=%lld",
2f900 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20   iDocid);.  }.  
2f910 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
2f920 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20  .    int nPos;. 
2f930 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20     int bDel;.   
2f940 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2f950 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69  PoslistSize(&a[i
2f960 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
2f970 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
2f980 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f990 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2f9a0 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20  , " nPos=%d%s", 
2f9b0 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22  nPos, bDel?"*":"
2f9c0 22 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  ");.    iOff += 
2f9d0 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2f9e0 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b  t(pRc, pBuf, &a[
2f9f0 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66  iOff], MIN(n-iOf
2fa00 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69  f, nPos));.    i
2fa10 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
2fa20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
2fa30 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
2fa40 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
2fa50 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
2fa60 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
2fa70 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c    iDocid += iDel
2fa80 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ta;.      sqlite
2fa90 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2faa0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2fab0 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69  f, " id=%lld", i
2fac0 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Docid);.    }.  
2fad0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66  }..  return iOff
2fae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2faf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74  function is part
2fb00 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
2fb10 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20  ode() debugging 
2fb20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  function. It is 
2fb30 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75 73  .** only ever us
2fb40 65 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e  ed with detail=n
2fb50 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  one tables..**.*
2fb60 2a 20 42 75 66 66 65 72 20 28 70 44 61 74 61 2f  * Buffer (pData/
2fb70 6e 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73 20  nData) contains 
2fb80 61 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 65  a doclist in the
2fb90 20 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79 20   format used by 
2fba0 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74  detail=none.** t
2fbb0 61 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e 63  ables. This func
2fbc0 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68  tion appends a h
2fbd0 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65  uman-readable ve
2fbe0 72 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c 69  rsion of that li
2fbf0 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20  st to.** buffer 
2fc00 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  pBuf..**.** If *
2fc10 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61  pRc is other tha
2fc20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  n SQLITE_OK when
2fc30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2fc40 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
2fc50 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20 61  a.** no-op. If a
2fc60 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20 65  n OOM or other e
2fc70 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
2fc80 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
2fc90 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65 74  , *pRc is.** set
2fca0 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72   to an SQLite er
2fcb0 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20  ror code before 
2fcc0 72 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 66  returning. The f
2fcd0 69 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62 75  inal state of bu
2fce0 66 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73 20  ffer.** pBuf is 
2fcf0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
2fd00 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
2fd10 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2fd20 65 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69 6e  eRowidList(.  in
2fd30 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fd50 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
2fd60 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2fd70 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20  fer *pBuf,      
2fd80 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
2fd90 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78  er to append tex
2fda0 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  t to */.  const 
2fdb0 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  u8 *pData, int n
2fdc0 44 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61 74  Data      /* Dat
2fdd0 61 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73 74  a to decode list
2fde0 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d 20  -of-rowids from 
2fdf0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  */.){.  int i = 
2fe00 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20  0;.  i64 iRowid 
2fe10 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69  = 0;..  while( i
2fe20 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63 6f  <nData ){.    co
2fe30 6e 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20 3d  nst char *zApp =
2fe40 20 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56 61   "";.    u64 iVa
2fe50 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  l;.    i += sqli
2fe60 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2fe70 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56 61  (&pData[i], &iVa
2fe80 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 2b  l);.    iRowid +
2fe90 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66 28  = iVal;..    if(
2fea0 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74   i<nData && pDat
2feb0 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20  a[i]==0x00 ){.  
2fec0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69      i++;.      i
2fed0 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44  f( i<nData && pD
2fee0 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a  ata[i]==0x00 ){.
2fef0 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
2ff00 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22 3b       zApp = "+";
2ff10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ff20 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a 22        zApp = "*"
2ff30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ff40 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2ff50 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2ff60 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2ff70 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64 2c  %lld%s", iRowid,
2ff80 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   zApp);.  }.}../
2ff90 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
2ffa0 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d  ntation of user-
2ffb0 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
2ffc0 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63  unction fts5_dec
2ffd0 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
2ffe0 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2fff0 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
30000 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
30010 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x,          /* F
30020 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
30030 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  text */.  int nA
30040 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
30050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30060 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77  ber of args (alw
30070 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69  ays 2) */.  sqli
30080 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
30090 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  l           /* F
300a0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
300b0 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52  s */.){.  i64 iR
300c0 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
300d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
300e0 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65  id for record be
300f0 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20  ing decoded */. 
30100 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69   int iSegid,iHei
30110 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78  ght,iPgno,bDlidx
30120 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e  ;/* Rowid compon
30130 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
30140 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e  u8 *aBlob; int n
30150 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63  ;         /* Rec
30160 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f  ord to decode */
30170 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20  .  u8 *a = 0;.  
30180 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20  Fts5Buffer s;   
30190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301a0 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74  /* Build up text
301b0 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20   to return here 
301c0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
301d0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
301e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
301f0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
30200 5f 69 6e 74 36 34 20 6e 53 70 61 63 65 20 3d 20  _int64 nSpace = 
30210 30 3b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  0;.  int eDetail
30220 4e 6f 6e 65 20 3d 20 28 73 71 6c 69 74 65 33 5f  None = (sqlite3_
30230 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 21  user_data(pCtx)!
30240 3d 30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  =0);..  assert( 
30250 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 55 4e 55  nArg==2 );.  UNU
30260 53 45 44 5f 50 41 52 41 4d 28 6e 41 72 67 29 3b  SED_PARAM(nArg);
30270 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c  .  memset(&s, 0,
30280 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
30290 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d  er));.  iRowid =
302a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
302b0 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  nt64(apVal[0]);.
302c0 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
302d0 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
302e0 61 72 67 75 6d 65 6e 74 20 28 61 20 62 6c 6f 62  argument (a blob
302f0 29 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54 68  ) in aBlob[]. Th
30300 65 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63  e aBlob[].  ** c
30310 6f 70 79 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20  opy is followed 
30320 62 79 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52  by FTS5_DATA_ZER
30330 4f 5f 50 41 44 44 49 4e 47 20 30 78 30 30 20 62  O_PADDING 0x00 b
30340 79 74 65 73 2c 20 77 68 69 63 68 20 70 72 65 76  ytes, which prev
30350 65 6e 74 73 0a 20 20 2a 2a 20 62 75 66 66 65 72  ents.  ** buffer
30360 20 6f 76 65 72 72 65 61 64 73 20 65 76 65 6e 20   overreads even 
30370 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  if the record is
30380 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20   corrupt.  */.  
30390 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
303a0 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d  e_bytes(apVal[1]
303b0 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c  );.  aBlob = sql
303c0 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
303d0 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70  apVal[1]);.  nSp
303e0 61 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44  ace = n + FTS5_D
303f0 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
30400 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c  ;.  a = (u8*)sql
30410 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
30420 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b  ro(&rc, nSpace);
30430 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f  .  if( a==0 ) go
30440 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20  to decode_out;. 
30450 20 69 66 28 20 6e 3e 30 20 29 20 6d 65 6d 63 70   if( n>0 ) memcp
30460 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a  y(a, aBlob, n);.
30470 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
30480 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67  id(iRowid, &iSeg
30490 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48  id, &bDlidx, &iH
304a0 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a  eight, &iPgno);.
304b0 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  .  fts5DebugRowi
304c0 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69  d(&rc, &s, iRowi
304d0 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78  d);.  if( bDlidx
304e0 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
304f0 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35   dlidx;.    Fts5
30500 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20  DlidxLvl lvl;.. 
30510 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a     dlidx.p = a;.
30520 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e      dlidx.nn = n
30530 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c  ;..    memset(&l
30540 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
30550 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
30560 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64    lvl.pData = &d
30570 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c  lidx;.    lvl.iL
30580 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b  eafPgno = iPgno;
30590 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c  ..    for(fts5Dl
305a0 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29  idxLvlNext(&lvl)
305b0 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66  ; lvl.bEof==0; f
305c0 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
305d0 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71  &lvl)){.      sq
305e0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
305f0 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
30600 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20   &s, .          
30610 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c  " %d(%lld)", lvl
30620 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e  .iLeafPgno, lvl.
30630 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a  iRowid.      );.
30640 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
30650 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
30660 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46     if( iRowid==F
30670 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
30680 49 44 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ID ){.      fts5
30690 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 26  DecodeAverages(&
306a0 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20  rc, &s, a, n);. 
306b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
306c0 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
306d0 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ure(&rc, &s, a, 
306e0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
306f0 65 20 69 66 28 20 65 44 65 74 61 69 6c 4e 6f 6e  e if( eDetailNon
30700 65 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66  e ){.    Fts5Buf
30710 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
30720 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
30730 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d  t term read from
30740 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
30750 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 6e 74   szLeaf;.    int
30760 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c   iPgidxOff = szL
30770 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  eaf = fts5GetU16
30780 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 69 6e 74  (&a[2]);.    int
30790 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 69   iTermOff;.    i
307a0 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20  nt nKeep = 0;.  
307b0 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20    int iOff;..   
307c0 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30   memset(&term, 0
307d0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
307e0 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  fer));..    /* D
307f0 65 63 6f 64 65 20 61 6e 79 20 65 6e 74 72 69 65  ecode any entrie
30800 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66  s that occur bef
30810 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 74 65  ore the first te
30820 72 6d 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  rm. */.    if( s
30830 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20 20 20 20 20  zLeaf<n ){.     
30840 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74   iPgidxOff += ft
30850 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
30860 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65  [iPgidxOff], iTe
30870 72 6d 4f 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73  rmOff);.    }els
30880 65 7b 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66  e{.      iTermOf
30890 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  f = szLeaf;.    
308a0 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65  }.    fts5Decode
308b0 52 6f 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26  RowidList(&rc, &
308c0 73 2c 20 26 61 5b 34 5d 2c 20 69 54 65 72 6d 4f  s, &a[4], iTermO
308d0 66 66 2d 34 29 3b 0a 0a 20 20 20 20 69 4f 66 66  ff-4);..    iOff
308e0 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20   = iTermOff;.   
308f0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 73 7a 4c   while( iOff<szL
30900 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  eaf ){.      int
30910 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20   nAppend;..     
30920 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 65 72   /* Read the ter
30930 6d 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e  m data for the n
30940 65 78 74 20 74 65 72 6d 2a 2f 0a 20 20 20 20 20  ext term*/.     
30950 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
30960 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
30970 5d 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20  ], nAppend);.   
30980 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65     term.n = nKee
30990 70 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  p;.      fts5Buf
309a0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72  ferAppendBlob(&r
309b0 63 2c 20 26 74 65 72 6d 2c 20 6e 41 70 70 65 6e  c, &term, nAppen
309c0 64 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  d, &a[iOff]);.  
309d0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
309e0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
309f0 66 28 0a 20 20 20 20 20 20 20 20 20 20 26 72 63  f(.          &rc
30a00 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a  , &s, " term=%.*
30a10 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e  s", term.n, (con
30a20 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a  st char*)term.p.
30a30 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
30a40 4f 66 66 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a  Off += nAppend;.
30a50 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65  .      /* Figure
30a60 20 6f 75 74 20 77 68 65 72 65 20 74 68 65 20 64   out where the d
30a70 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20  oclist for this 
30a80 74 65 72 6d 20 65 6e 64 73 20 2a 2f 0a 20 20 20  term ends */.   
30a90 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66     if( iPgidxOff
30aa0 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  <n ){.        in
30ab0 74 20 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20 20  t nIncr;.       
30ac0 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74   iPgidxOff += ft
30ad0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
30ae0 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 49 6e  [iPgidxOff], nIn
30af0 63 72 29 3b 0a 20 20 20 20 20 20 20 20 69 54 65  cr);.        iTe
30b00 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a  rmOff += nIncr;.
30b10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30b20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
30b30 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a  szLeaf;.      }.
30b40 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
30b50 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63 2c 20  eRowidList(&rc, 
30b60 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 54  &s, &a[iOff], iT
30b70 65 72 6d 4f 66 66 2d 69 4f 66 66 29 3b 0a 20 20  ermOff-iOff);.  
30b80 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d      iOff = iTerm
30b90 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Off;.      if( i
30ba0 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20  Off<szLeaf ){.  
30bb0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
30bc0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
30bd0 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
30be0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
30bf0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
30c00 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  e(&term);.  }els
30c10 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  e{.    Fts5Buffe
30c20 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
30c30 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
30c40 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70  term read from p
30c50 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  age */.    int s
30c60 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  zLeaf;          
30c70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
30c80 65 74 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61  et of pgidx in a
30c90 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50  [] */.    int iP
30ca0 67 69 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74  gidxOff;.    int
30cb0 20 69 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b   iPgidxPrev = 0;
30cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
30cd0 65 76 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61  evious value rea
30ce0 64 20 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a  d from pgidx */.
30cf0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66      int iTermOff
30d00 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52   = 0;.    int iR
30d10 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20  owidOff = 0;.   
30d20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69   int iOff;.    i
30d30 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20  nt nDoclist;..  
30d40 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
30d50 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
30d60 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  ffer));..    if(
30d70 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71   n<4 ){.      sq
30d80 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
30d90 65 74 28 26 72 63 2c 20 26 73 2c 20 37 2c 20 28  et(&rc, &s, 7, (
30da0 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75  const u8*)"corru
30db0 70 74 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pt");.      goto
30dc0 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20   decode_out;.   
30dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
30de0 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65  owidOff = fts5Ge
30df0 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20  tU16(&a[0]);.   
30e00 20 20 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73     iPgidxOff = s
30e10 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
30e20 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20  16(&a[2]);.     
30e30 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
30e40 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
30e50 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
30e60 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d  PgidxOff], iTerm
30e70 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Off);.      }.  
30e80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
30e90 64 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  de the position 
30ea0 6c 69 73 74 20 74 61 69 6c 20 61 74 20 74 68 65  list tail at the
30eb0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
30ec0 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52  ge */.    if( iR
30ed0 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20  owidOff!=0 ){.  
30ee0 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69      iOff = iRowi
30ef0 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20  dOff;.    }else 
30f00 69 66 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20  if( iTermOff!=0 
30f10 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ){.      iOff = 
30f20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65  iTermOff;.    }e
30f30 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  lse{.      iOff 
30f40 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a  = szLeaf;.    }.
30f50 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f      fts5DecodePo
30f60 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  slist(&rc, &s, &
30f70 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a  a[4], iOff-4);..
30f80 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e      /* Decode an
30f90 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64  y more doclist d
30fa0 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
30fb0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 62 65 66   on the page bef
30fc0 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66  ore the.    ** f
30fd0 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  irst term. */.  
30fe0 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54    nDoclist = (iT
30ff0 65 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66  ermOff ? iTermOf
31000 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f  f : szLeaf) - iO
31010 66 66 3b 0a 20 20 20 20 66 74 73 35 44 65 63 6f  ff;.    fts5Deco
31020 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
31030 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f  s, &a[iOff], nDo
31040 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69  clist);..    whi
31050 6c 65 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  le( iPgidxOff<n 
31060 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
31070 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 46   ){.      int bF
31080 69 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f 66  irst = (iPgidxOf
31090 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20 20  f==szLeaf);     
310a0 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73  /* True for firs
310b0 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  t term on page *
310c0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  /.      int nByt
310d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
310e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
310f0 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a   Bytes of data *
31100 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64  /.      int iEnd
31110 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  ;.      .      i
31120 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
31130 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
31140 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65  PgidxOff], nByte
31150 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 50  );.      iPgidxP
31160 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rev += nByte;.  
31170 20 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69 64      iOff = iPgid
31180 78 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69 66  xPrev;..      if
31190 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b  ( iPgidxOff<n ){
311a0 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74  .        fts5Get
311b0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
311c0 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  dxOff], nByte);.
311d0 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69          iEnd = i
311e0 50 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79 74  PgidxPrev + nByt
311f0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
31200 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73          iEnd = s
31210 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 20  zLeaf;.      }. 
31220 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e 73 7a       if( iEnd>sz
31230 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
31240 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
31250 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
31260 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20  decode_out;.    
31270 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 62    }..      if( b
31280 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
31290 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
312a0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
312b0 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
312c0 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65 3e        if( nByte>
312d0 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20  term.n ){.      
312e0 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f      rc = FTS5_CO
312f0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
31300 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
31310 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31320 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79      term.n = nBy
31330 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
31340 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
31350 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
31360 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
31370 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
31380 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72  ndBlob(&rc, &ter
31390 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66  m, nByte, &a[iOf
313a0 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  f]);.      iOff 
313b0 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20  += nByte;..     
313c0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
313d0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a  erAppendPrintf(.
313e0 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
313f0 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
31400 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
31410 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
31420 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66     );.      iOff
31430 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f   += fts5DecodeDo
31440 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
31450 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f  a[iOff], iEnd-iO
31460 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ff);.    }..    
31470 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
31480 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64  term);.  }.  . d
31490 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c  ecode_out:.  sql
314a0 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
314b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
314c0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
314d0 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
314e0 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
314f0 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45  s.p, s.n, SQLITE
31500 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
31510 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
31520 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
31530 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20  ode(pCtx, rc);. 
31540 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
31550 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree(&s);.}../*.*
31560 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
31570 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
31580 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
31590 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28  tion fts5_rowid(
315a0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
315b0 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74  d fts5RowidFunct
315c0 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
315d0 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
315e0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
315f0 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
31600 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
31610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31620 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
31630 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32  f args (always 2
31640 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) */.  sqlite3_v
31650 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
31660 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
31670 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
31680 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
31690 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72  *zArg;.  if( nAr
316a0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  g==0 ){.    sqli
316b0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
316c0 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62  (pCtx, "should b
316d0 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75  e: fts5_rowid(su
316e0 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d  bject, ....)", -
316f0 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
31700 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63   zArg = (const c
31710 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
31720 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
31730 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  );.    if( 0==sq
31740 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
31750 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29  rg, "segment") )
31760 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
31770 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65  id;.      int se
31780 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20  gid, pgno;.     
31790 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a   if( nArg!=3 ){.
317a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
317b0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
317c0 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  x, .            
317d0 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35  "should be: fts5
317e0 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27  _rowid('segment'
317f0 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29 22  , segid, pgno))"
31800 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a  , -1.        );.
31810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31820 20 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c       segid = sql
31830 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
31840 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20  pVal[1]);.      
31850 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33    pgno = sqlite3
31860 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
31870 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52  [2]);.        iR
31880 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
31890 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
318a0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
318b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
318c0 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69  nt64(pCtx, iRowi
318d0 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
318e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
318f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
31900 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
31910 20 22 66 69 72 73 74 20 61 72 67 20 74 6f 20 66   "first arg to f
31920 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74  ts5_rowid() must
31930 20 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20 2c   be 'segment'" ,
31940 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   -1.      );.   
31950 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
31960 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
31970 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74  s part of regist
31980 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d  ering the FTS5 m
31990 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62  odule with datab
319a0 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
319b0 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65  n db. It registe
319c0 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d  rs several user-
319d0 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
319e0 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a  unctions useful.
319f0 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a  ** with FTS5..**
31a00 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
31a10 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
31a20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
31a30 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f  error occurs, so
31a40 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69  me other.** SQLi
31a50 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
31a60 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
31a70 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
31a80 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73  3Fts5IndexInit(s
31a90 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
31aa0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
31ab0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
31ac0 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35  .      db, "fts5
31ad0 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c  _decode", 2, SQL
31ae0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
31af0 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c  5DecodeFunction,
31b00 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 20 20 69 66   0, 0.  );..  if
31b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31b20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
31b30 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
31b40 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ion(.        db,
31b50 20 22 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e 6f   "fts5_decode_no
31b60 6e 65 22 2c 20 32 2c 20 0a 20 20 20 20 20 20 20  ne", 2, .       
31b70 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
31b80 6f 69 64 2a 29 64 62 2c 20 66 74 73 35 44 65 63  oid*)db, fts5Dec
31b90 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
31ba0 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  0.    );.  }..  
31bb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31bc0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
31bd0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
31be0 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64  ction(.        d
31bf0 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c  b, "fts5_rowid",
31c00 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
31c10 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75  , 0, fts5RowidFu
31c20 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20  nction, 0, 0.   
31c30 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
31c40 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c   rc;.}...int sql
31c50 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 73  ite3Fts5IndexRes
31c60 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  et(Fts5Index *p)
31c70 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
31c80 53 74 72 75 63 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Struct==0 || p->
31c90 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 21 3d  iStructVersion!=
31ca0 30 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 49  0 );.  if( fts5I
31cb0 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e 28  ndexDataVersion(
31cc0 70 29 21 3d 70 2d 3e 69 53 74 72 75 63 74 56 65  p)!=p->iStructVe
31cd0 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 66 74 73  rsion ){.    fts
31ce0 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
31cf0 64 61 74 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  date(p);.  }.  r
31d00 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
31d10 65 74 75 72 6e 28 70 29 3b 0a 7d 0a              eturn(p);.}.