/ Hex Artifact Content
Login

Artifact 39939320ee5185cbfd0a8c8c7e1c878ebde7c43d:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
4d20: 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
4d30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 74 72   /* Database str
4d40: 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20  ucture for this 
4d50: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74  iterator */.  Ft
4d60: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
4d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d80: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
4d90: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
4da0: 73 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  st */.  Fts5Cols
4db0: 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
4dc0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
4dd0: 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
4de0: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  hese columns */.
4df0: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64 20 74 6f  .  /* Invoked to
4e00: 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   set output vari
4e10: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76 6f 69 64  ables. */.  void
4e20: 20 28 2a 78 53 65 74 4f 75 74 70 75 74 73 29 28   (*xSetOutputs)(
4e30: 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 53  Fts5Iter*, Fts5S
4e40: 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20 69 6e 74  egIter*);..  int
4e50: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e70: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4e80: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4e90: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4eb0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4ec0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4ed0: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ef0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4f00: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4f10: 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20 69 53 77  es */..  i64 iSw
4f20: 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20 20 20  itchRowid;      
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4f40: 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20 6f 74  test rowid of ot
4f50: 68 65 72 20 74 68 61 6e 20 61 46 69 72 73 74 5b  her than aFirst[
4f60: 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  1] */.  Fts5CRes
4f70: 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20 20 20  ult *aFirst;    
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f90: 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28  nt merge state (
4fa0: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
4fb0: 46 74 73 35 53 65 67 49 74 65 72 20 61 53 65 67  Fts5SegIter aSeg
4fc0: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
4fd0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
4fe0: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f  ent iterators */
4ff0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  .};.../*.** An i
5000: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5010: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
5020: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5030: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5040: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5050: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5060: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5070: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5080: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5090: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
50a0: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
50b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
50c0: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
50d0: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
50e0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
50f0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5100: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5110: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5120: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
5130: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
5140: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5150: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5160: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
5170: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
5180: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
51b0: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
51c0: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51e0: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
5200: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5210: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5220: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
5230: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
5240: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5250: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5280: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5290: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
52a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
52b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
52c0: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
52d0: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
52e0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
52f0: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
5300: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5310: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5320: 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  [1];.};..static 
5330: 76 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28  void fts5PutU16(
5340: 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56  u8 *aOut, u16 iV
5350: 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d  al){.  aOut[0] =
5360: 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f   (iVal>>8);.  aO
5370: 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78  ut[1] = (iVal&0x
5380: 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  FF);.}..static u
5390: 31 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f  16 fts5GetU16(co
53a0: 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20  nst u8 *aIn){.  
53b0: 72 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e  return ((u16)aIn
53c0: 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b  [0] << 8) + aIn[
53d0: 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c  1];.} ../*.** Al
53e0: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
53f0: 6e 20 61 20 62 75 66 66 65 72 20 61 74 20 6c 65  n a buffer at le
5400: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20  ast nByte bytes 
5410: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
5420: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
5430: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72  s encountered, r
5440: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73  eturn NULL and s
5450: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
5460: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35  e in.** the Fts5
5470: 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73  Index handle pas
5480: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5490: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49  atic void *fts5I
54b0: 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64  dxMalloc(Fts5Ind
54c0: 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ex *p, int nByte
54d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
54e0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
54f0: 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
5500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
5510: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5520: 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75 66  of the pLeft buf
5530: 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52 69  fer with the pRi
5540: 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e  ght/nRight blob.
5550: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
5560: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
5570: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
5580: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
5590: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
55a0: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
55b0: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
55c0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
55d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
55e0: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
55f0: 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ht.*/.#ifdef SQL
5600: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5610: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
5620: 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74  ompareBlob(.  Ft
5630: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5650: 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20   Left hand side 
5660: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
5670: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
5680: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20  ght, int nRight 
5690: 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64     /* Right hand
56a0: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
56b0: 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
56c0: 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74  nCmp = MIN(pLeft
56d0: 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20  ->n, nRight);.  
56e0: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
56f0: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5700: 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  t, nCmp);.  retu
5710: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
5720: 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29  eft->n - nRight)
5730: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
5740: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  f../*.** Compare
5750: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
5760: 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
5770: 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
5780: 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a   If one buffer.*
5790: 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  * is a prefix of
57a0: 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
57b0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65  s considered the
57c0: 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   lesser..**.** R
57d0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
57e0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
57f0: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
5800: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
5810: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
5820: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
5830: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
5840: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
5850: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
5860: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
5870: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
5880: 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42  ferCompare(Fts5B
5890: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74  uffer *pLeft, Ft
58a0: 73 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74  s5Buffer *pRight
58b0: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
58c0: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52  MIN(pLeft->n, pR
58d0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20  ight->n);.  int 
58e0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
58f0: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70  ft->p, pRight->p
5900: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
5910: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
5920: 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e  ft->n - pRight->
5930: 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73 74  n) : res);.}..st
5940: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65 61  atic int fts5Lea
5950: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46 74  fFirstTermOff(Ft
5960: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a  s5Data *pLeaf){.
5970: 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74 73    int ret;.  fts
5980: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
5990: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
59a0: 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20 72  Leaf], ret);.  r
59b0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
59c0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
59d0: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
59e0: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
59f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
5a00: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
5a10: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
5a20: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
5a30: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
5a40: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20  3_blob *pReader 
5a50: 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20  = p->pReader;.  
5a60: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
5a70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  ;.    sqlite3_bl
5a80: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
5a90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
5aa0: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
5ab0: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
5ac0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
5ad0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5ae0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
5af0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
5b00: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
5b10: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
5b20: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
5b30: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
5b40: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
5b50: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
5b60: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
5b70: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
5b80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b90: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
5ba0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28  ITE_OK;..    if(
5bb0: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
5bc0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
5bd0: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
5be0: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
5bf0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
5c00: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
5c10: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
5c20: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
5c30: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
5c40: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
5c50: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
5c60: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
5c70: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5c80: 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65  Blob = p->pReade
5c90: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  r;.      p->pRea
5ca0: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  der = 0;.      r
5cb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5cc0: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
5cd0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73  Rowid);.      as
5ce0: 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
5cf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
5d00: 70 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b  pReader = pBlob;
5d10: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
5d20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5d30: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
5d40: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  der(p);.      }.
5d50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5d60: 4c 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20  LITE_ABORT ) rc 
5d70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5d90: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  e blob handle is
5da0: 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69   not open at thi
5db0: 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74  s point, open it
5dc0: 20 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a   and seek .    *
5dd0: 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  * to the request
5de0: 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20  ed entry.  */.  
5df0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5e00: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
5e10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
5e20: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
5e30: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
5e40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5e50: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
5e60: 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20  nfig->db, .     
5e70: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
5e80: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
5e90: 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
5ea0: 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a   0, &p->pReader.
5eb0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
5ec0: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
5ed0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
5ee0: 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73  blob_open() or s
5ef0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
5f00: 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  en() calls.    *
5f10: 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64  * above returned
5f20: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72   SQLITE_ERROR, r
5f30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5f40: 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61  RUPT_VTAB instea
5f50: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68  d..    ** All th
5f60: 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20  e reasons those 
5f70: 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20  functions might 
5f80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5f90: 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20  ROR - missing.  
5fa0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73    ** table, miss
5fb0: 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f  ing row, non-blo
5fc0: 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20  b/text in block 
5fd0: 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74  column - indicat
5fe0: 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e  e .    ** backin
5ff0: 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69  g store corrupti
6000: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  on.  */.    if( 
6010: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
6020: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
6030: 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72  RUPT;..    if( r
6040: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6050: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d        u8 *aOut =
6060: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6070: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6080: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6090: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
60a0: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
60b0: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
60c0: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
60d0: 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a  int nAlloc = siz
60e0: 65 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20  eof(Fts5Data) + 
60f0: 6e 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41 54  nByte + FTS5_DAT
6100: 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20  A_PADDING;.     
6110: 20 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74   pRet = (Fts5Dat
6120: 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  a*)sqlite3_mallo
6130: 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  c(nAlloc);.     
6140: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
6150: 20 20 20 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20       pRet->nn = 
6160: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 61  nByte;.        a
6170: 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20  Out = pRet->p = 
6180: 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20  (u8*)&pRet[1];. 
6190: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
61a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
61b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a  NOMEM;.      }..
61c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
61d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
61e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
61f0: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65  blob_read(p->pRe
6200: 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74  ader, aOut, nByt
6210: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
6220: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
6230: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6240: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6250: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
6260: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  et = 0;.      }e
6270: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
6280: 54 4f 44 4f 31 3a 20 46 69 78 20 74 68 69 73 20  TODO1: Fix this 
6290: 2a 2f 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  */.        pRet-
62a0: 3e 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65  >szLeaf = fts5Ge
62b0: 74 55 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d  tU16(&pRet->p[2]
62c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
62d0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
62e0: 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b  .    p->nRead++;
62f0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
6300: 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72  (pRet==0)==(p->r
6310: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  c!=SQLITE_OK) );
6320: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
6330: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  }.../*.** Releas
6340: 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
6350: 20 64 61 74 61 20 72 65 63 6f 72 64 20 72 65 74   data record ret
6360: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
6370: 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66  ier call to.** f
6380: 74 73 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a  ts5DataRead()..*
6390: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
63a0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 46 74  s5DataRelease(Ft
63b0: 73 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a  s5Data *pData){.
63c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
63d0: 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Data);.}..static
63e0: 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 50 72   int fts5IndexPr
63f0: 65 70 61 72 65 53 74 6d 74 28 0a 20 20 46 74 73  epareStmt(.  Fts
6400: 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 73 71 6c  5Index *p,.  sql
6410: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
6420: 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  mt,.  char *zSql
6430: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
6440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6450: 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20    if( zSql ){.  
6460: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
6470: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
6480: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a  ->pConfig->db, z
6490: 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
64a0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
64b0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
64c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
64d0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
64e0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65  free(zSql);.  re
64f0: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a  turn p->rc;.}...
6500: 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20  /*.** INSERT OR 
6510: 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64  REPLACE a record
6520: 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61   into the %_data
6530: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
6540: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 57  c void fts5DataW
6550: 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  rite(Fts5Index *
6560: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63  p, i64 iRowid, c
6570: 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
6580: 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66  int nData){.  if
6590: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
65a0: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
65b0: 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d  if( p->pWriter==
65c0: 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
65d0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
65e0: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
65f0: 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
6600: 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72 69 74  tmt(p, &p->pWrit
6610: 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
6620: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
6630: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
6640: 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64 2c 20  '.'%q_data'(id, 
6650: 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c  block) VALUES(?,
6660: 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ?)", .          
6670: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6680: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6690: 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   ));.    if( p->
66a0: 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  rc ) return;.  }
66b0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ..  sqlite3_bind
66c0: 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65  _int64(p->pWrite
66d0: 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  r, 1, iRowid);. 
66e0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
66f0: 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32  ob(p->pWriter, 2
6700: 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
6710: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6720: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6730: 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d  ->pWriter);.  p-
6740: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
6750: 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  set(p->pWriter);
6760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
6770: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
6780: 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  SQL:.**.**     D
6790: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
67a0: 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45  a WHERE id BETWE
67b0: 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24  EN $iFirst AND $
67c0: 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  iLast.*/.static 
67d0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c  void fts5DataDel
67e0: 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ete(Fts5Index *p
67f0: 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36  , i64 iFirst, i6
6800: 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20  4 iLast){.  if( 
6810: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
6820: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
6830: 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30  ( p->pDeleter==0
6840: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
6850: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
6860: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
6870: 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  nfig;.    char *
6880: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
6890: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
68a0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
68b0: 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48 45 52  '.'%q_data' WHER
68c0: 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d  E id>=? AND id<=
68d0: 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  ?", .          p
68e0: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
68f0: 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  nfig->zName.    
6900: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
6910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
6920: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6940: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
6950: 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d  pare_v2(pConfig-
6960: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
6970: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30 29 3b  p->pDeleter, 0);
6980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
6990: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
69a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
69b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
69c0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
69d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
69e0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62    }..  sqlite3_b
69f0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6a00: 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72 73 74  leter, 1, iFirst
6a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
6a20: 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65  d_int64(p->pDele
6a30: 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a  ter, 2, iLast);.
6a40: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6a50: 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 70  ->pDeleter);.  p
6a60: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6a70: 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74 65 72  eset(p->pDeleter
6a80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  );.}../*.** Remo
6a90: 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61  ve all records a
6aa0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
6ab0: 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e 0a 2a  egment iSegid..*
6ac0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6ad0: 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
6ae0: 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ent(Fts5Index *p
6af0: 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b 0a 20  , int iSegid){. 
6b00: 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 46 54   i64 iFirst = FT
6b10: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
6b20: 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20 20 69  (iSegid, 0);.  i
6b30: 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f  64 iLast = FTS5_
6b40: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
6b50: 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a 20 20  egid+1, 0)-1;.  
6b60: 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
6b70: 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29  , iFirst, iLast)
6b80: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 44  ;.  if( p->pIdxD
6b90: 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  eleter==0 ){.   
6ba0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
6bb0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
6bc0: 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
6bd0: 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
6be0: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c 20  p->pIdxDeleter, 
6bf0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6c00: 0a 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45  .          "DELE
6c10: 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71  TE FROM '%q'.'%q
6c20: 5f 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69  _idx' WHERE segi
6c30: 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d=?",.          
6c40: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6c50: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6c60: 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   ));.  }.  if( p
6c70: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
6c80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
6c90: 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 44  ind_int(p->pIdxD
6ca0: 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65 67 69  eleter, 1, iSegi
6cb0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
6cc0: 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65 6c 65  step(p->pIdxDele
6cd0: 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ter);.    p->rc 
6ce0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6cf0: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b  p->pIdxDeleter);
6d00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6d10: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
6d20: 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75  e to an Fts5Stru
6d30: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74  cture object ret
6d40: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
6d50: 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ier .** call to 
6d60: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
6d70: 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75 63  d() or fts5Struc
6d80: 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f  tureDecode()..*/
6d90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6da0: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
6db0: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e(Fts5Structure 
6dc0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  *pStruct){.  if(
6dd0: 20 70 53 74 72 75 63 74 20 26 26 20 30 3e 3d 28   pStruct && 0>=(
6de0: 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 29  --pStruct->nRef)
6df0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6e00: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
6e10: 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ct->nRef==0 );. 
6e20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
6e30: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
6e40: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6e50: 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74 2d  e3_free(pStruct-
6e60: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29  >aLevel[i].aSeg)
6e70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6e80: 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74  te3_free(pStruct
6e90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
6ea0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
6eb0: 75 72 65 52 65 66 28 46 74 73 35 53 74 72 75 63  ureRef(Fts5Struc
6ec0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
6ed0: 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 2b    pStruct->nRef+
6ee0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  +;.}../*.** Dese
6ef0: 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75  rialize and retu
6f00: 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  rn the structure
6f10: 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c   record currentl
6f20: 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65 72 69  y stored in seri
6f30: 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20 77  alized.** form w
6f40: 69 74 68 69 6e 20 62 75 66 66 65 72 20 70 44 61  ithin buffer pDa
6f50: 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ta/nData..**.** 
6f60: 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  The Fts5Structur
6f70: 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65  e.aLevel[] and e
6f80: 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72  ach Fts5Structur
6f90: 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72  eLevel.aSeg[] ar
6fa0: 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d  ray.** are over-
6fb0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f 6e 65  allocated by one
6fc0: 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c 6c 6f   slot. This allo
6fd0: 77 73 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ws the structure
6fe0: 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f 20   contents.** to 
6ff0: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 65  be more easily e
7000: 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dited..**.** If 
7010: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
7020: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
7030: 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51  o NULL and an SQ
7040: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a  Lite error code.
7050: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  ** returned. Oth
7060: 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74 20 69  erwise, *ppOut i
7070: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
7080: 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
7090: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
70a0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
70b0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74  tatic int fts5St
70c0: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 0a 20  ructureDecode(. 
70d0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
70e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
70f0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
7100: 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64  ining serialized
7110: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7120: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
7150: 72 20 70 44 61 74 61 20 69 6e 20 62 79 74 65 73  r pData in bytes
7160: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6f   */.  int *piCoo
7170: 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  kie,            
7180: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
7190: 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 76 61  ration cookie va
71a0: 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  lue */.  Fts5Str
71b0: 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74 20 20  ucture **ppOut  
71c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
71d0: 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20 6f 62   Deserialized ob
71e0: 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
71f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7200: 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
7210: 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20  int iLvl;.  int 
7220: 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e  nLevel = 0;.  in
7230: 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a  t nSegment = 0;.
7240: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
7270: 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
7280: 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46 74 73  at pRet */.  Fts
7290: 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74  5Structure *pRet
72a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
72b0: 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
72c0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
72d0: 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63 6f 6f   /* Grab the coo
72e0: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  kie value */.  i
72f0: 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20 2a 70  f( piCookie ) *p
7300: 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65  iCookie = sqlite
7310: 33 46 74 73 35 47 65 74 33 32 28 70 44 61 74 61  3Fts5Get32(pData
7320: 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20 20 2f  );.  i = 4;..  /
7330: 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61 6c  * Read the total
7340: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
7350: 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20 66  s and segments f
7360: 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
7370: 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63 74   the.  ** struct
7380: 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  ure record.  */.
7390: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
73a0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
73b0: 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b  , nLevel);.  i +
73c0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
73d0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53 65  2(&pData[i], nSe
73e0: 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65 20  gment);.  nByte 
73f0: 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  = (.      sizeof
7400: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
7410: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
7420: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72       /* Main str
7430: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20  ucture */.      
7440: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7450: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
7460: 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c  evel-1)    /* aL
7470: 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  evel[] array */.
7480: 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46    );.  pRet = (F
7490: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71  ts5Structure*)sq
74a0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
74b0: 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b  ero(&rc, nByte);
74c0: 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ..  if( pRet ){.
74d0: 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d      pRet->nRef =
74e0: 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c   1;.    pRet->nL
74f0: 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20  evel = nLevel;. 
7500: 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e     pRet->nSegmen
7510: 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  t = nSegment;.  
7520: 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
7530: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
7540: 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57  ta[i], &pRet->nW
7550: 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20  riteCounter);.. 
7560: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72     for(iLvl=0; r
7570: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7580: 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76  iLvl<nLevel; iLv
7590: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
75a0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
75b0: 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c  pLvl = &pRet->aL
75c0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
75d0: 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30    int nTotal = 0
75e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
75f0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d  ;..      if( i>=
7600: 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  nData ){.       
7610: 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
7620: 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
7630: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74  .        i += ft
7640: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7650: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
7660: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20  Merge);.        
7670: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7680: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7690: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20  nTotal);.       
76a0: 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e   assert( nTotal>
76b0: 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b  =pLvl->nMerge );
76c0: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61  .        pLvl->a
76d0: 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
76e0: 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
76f0: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
7700: 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  ro(&rc, .       
7710: 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69       nTotal * si
7720: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7730: 72 65 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20  reSegment).     
7740: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
7750: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7760: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7770: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
7780: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7790: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
77a0: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
77b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
77c0: 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  >=nData ){.     
77d0: 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35         rc = FTS5
77e0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
77f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7810: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
7820: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7830: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
7840: 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg].iSegid);.   
7850: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7860: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7870: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7880: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
7890: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  t);.          i 
78a0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
78b0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
78c0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
78d0: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
78e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
78f0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
7900: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7910: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7920: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
7930: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
7940: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74   }.  }..  *ppOut
7950: 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72   = pRet;.  retur
7960: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  n rc;.}../*.**.*
7970: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7980: 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
7990: 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  vel(int *pRc, Ft
79a0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
79b0: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a  Struct){.  if( *
79c0: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
79d0: 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
79e0: 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
79f0: 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e  ppStruct;.    in
7a00: 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75  t nLevel = pStru
7a10: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20  ct->nLevel;.    
7a20: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  int nByte = (.  
7a30: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7a40: 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20  5Structure) +   
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7a60: 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65  * Main structure
7a70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65   */.        size
7a80: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7a90: 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c  Level) * (nLevel
7aa0: 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d  +1)  /* aLevel[]
7ab0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b   array */.    );
7ac0: 0a 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d 20  ..    pStruct = 
7ad0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
7ae0: 70 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b  pStruct, nByte);
7af0: 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
7b00: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
7b10: 28 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  (&pStruct->aLeve
7b20: 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69  l[nLevel], 0, si
7b30: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7b40: 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20  reLevel));.     
7b50: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
7b60: 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72  ++;.      *ppStr
7b70: 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20  uct = pStruct;. 
7b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b90: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
7ba0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  MEM;.    }.  }.}
7bb0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c  ../*.** Extend l
7bc0: 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61  evel iLvl so tha
7bd0: 74 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  t there is room 
7be0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78  for at least nEx
7bf0: 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d  tra more.** segm
7c00: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
7c10: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
7c20: 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20  reExtendLevel(. 
7c30: 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74   int *pRc, .  Ft
7c40: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
7c50: 72 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76  ruct, .  int iLv
7c60: 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  l, .  int nExtra
7c70: 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74  , .  int bInsert
7c80: 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  .){.  if( *pRc==
7c90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7ca0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7cb0: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
7cc0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
7cd0: 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  l];.    Fts5Stru
7ce0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e  ctureSegment *aN
7cf0: 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  ew;.    int nByt
7d00: 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  e;..    nByte = 
7d10: 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45  (pLvl->nSeg + nE
7d20: 78 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46  xtra) * sizeof(F
7d30: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7d40: 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d  ent);.    aNew =
7d50: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
7d60: 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79  (pLvl->aSeg, nBy
7d70: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  te);.    if( aNe
7d80: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  w ){.      if( b
7d90: 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Insert==0 ){.   
7da0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65       memset(&aNe
7db0: 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30  w[pLvl->nSeg], 0
7dc0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
7dd0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
7de0: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   nExtra);.      
7df0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7e00: 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d  nt nMove = pLvl-
7e10: 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46  >nSeg * sizeof(F
7e20: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7e30: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ent);.        me
7e40: 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74  mmove(&aNew[nExt
7e50: 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65  ra], aNew, nMove
7e60: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
7e70: 74 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(aNew, 0, sizeo
7e80: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
7e90: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
7ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7eb0: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e   pLvl->aSeg = aN
7ec0: 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ew;.    }else{. 
7ed0: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
7ee0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
7ef0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
7f00: 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73  s5Structure *fts
7f10: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
7f20: 63 61 63 68 65 64 28 46 74 73 35 49 6e 64 65 78  cached(Fts5Index
7f30: 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
7f40: 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b  cture *pRet = 0;
7f50: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
7f60: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
7f70: 66 69 67 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b  fig;.  int iCook
7f80: 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ie;             
7f90: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
7fa0: 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a  uration cookie *
7fb0: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
7fc0: 61 74 61 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20  ata;..  pData = 
7fd0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
7fe0: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
7ff0: 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e  OWID);.  if( p->
8000: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8010: 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f  .    /* TODO: Do
8020: 20 77 65 20 6e 65 65 64 20 74 68 69 73 20 69 66   we need this if
8030: 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20   the leaf-index 
8040: 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f  is appended? Pro
8050: 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  bably... */.    
8060: 6d 65 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70  memset(&pData->p
8070: 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20  [pData->nn], 0, 
8080: 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
8090: 47 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  G);.    p->rc = 
80a0: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
80b0: 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70 44  ode(pData->p, pD
80c0: 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69  ata->nn, &iCooki
80d0: 65 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20 69  e, &pRet);.    i
80e0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
80f0: 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e  _OK && pConfig->
8100: 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65  iCookie!=iCookie
8110: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8120: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  = sqlite3Fts5Con
8130: 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c  figLoad(pConfig,
8140: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d   iCookie);.    }
8150: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
8160: 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
8170: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
8180: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
8190: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
81a0: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
81b0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d   pRet = 0;.    }
81c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
81d0: 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Ret;.}..static i
81e0: 36 34 20 66 74 73 35 49 6e 64 65 78 44 61 74 61  64 fts5IndexData
81f0: 56 65 72 73 69 6f 6e 28 46 74 73 35 49 6e 64 65  Version(Fts5Inde
8200: 78 20 2a 70 29 7b 0a 20 20 69 36 34 20 69 56 65  x *p){.  i64 iVe
8210: 72 73 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 69 66  rsion = 0;..  if
8220: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8230: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
8240: 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 3d 3d 30  >pDataVersion==0
8250: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8260: 3d 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61  = fts5IndexPrepa
8270: 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44  reStmt(p, &p->pD
8280: 61 74 61 56 65 72 73 69 6f 6e 2c 20 0a 20 20 20  ataVersion, .   
8290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
82a0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25  printf("PRAGMA %
82b0: 51 2e 64 61 74 61 5f 76 65 72 73 69 6f 6e 22 2c  Q.data_version",
82c0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 7a 44 62   p->pConfig->zDb
82d0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
82e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
82f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
8300: 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
8310: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
8320: 65 70 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69  ep(p->pDataVersi
8330: 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 56 65  on) ){.      iVe
8340: 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  rsion = sqlite3_
8350: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 2d 3e  column_int64(p->
8360: 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20 30 29  pDataVersion, 0)
8370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  ;.    }.    p->r
8380: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
8390: 74 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  t(p->pDataVersio
83a0: 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
83b0: 6e 20 69 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  n iVersion;.}../
83c0: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
83d0: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
83e0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
83f0: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  record..**.** Th
8400: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
8410: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
8420: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
8430: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
8440: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
8450: 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72  located as descr
8460: 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f  ibed for functio
8470: 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  n fts5StructureD
8480: 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76  ecode() .** abov
8490: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
84a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
84b0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
84c0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
84d0: 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46  left in the.** F
84e0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
84f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
8500: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
8510: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
8520: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
8530: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
8540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
8550: 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53  Structure *fts5S
8560: 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73  tructureRead(Fts
8570: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 0a 20 20 69  5Index *p){..  i
8580: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 3d 3d 30  f( p->pStruct==0
8590: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 53 74 72 75   ){.    p->iStru
85a0: 63 74 56 65 72 73 69 6f 6e 20 3d 20 66 74 73 35  ctVersion = fts5
85b0: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
85c0: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
85d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
85e0: 0a 20 20 20 20 20 20 70 2d 3e 70 53 74 72 75 63  .      p->pStruc
85f0: 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
8600: 65 52 65 61 64 55 6e 63 61 63 68 65 64 28 70 29  eReadUncached(p)
8610: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
8620: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8630: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 46 74 73  .  else{.    Fts
8640: 35 53 74 72 75 63 74 75 72 65 20 2a 70 54 65 73  5Structure *pTes
8650: 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
8660: 65 52 65 61 64 55 6e 63 61 63 68 65 64 28 70 29  eReadUncached(p)
8670: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 73 74 20  ;.    if( pTest 
8680: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  ){.      int i, 
8690: 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f  j;.      assert_
86a0: 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e  nc( p->pStruct->
86b0: 6e 53 65 67 6d 65 6e 74 3d 3d 70 54 65 73 74 2d  nSegment==pTest-
86c0: 3e 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 20 20 20  >nSegment );.   
86d0: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
86e0: 3e 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  >pStruct->nLevel
86f0: 3d 3d 70 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 20  ==pTest->nLevel 
8700: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
8710: 3b 20 69 3c 70 54 65 73 74 2d 3e 6e 4c 65 76 65  ; i<pTest->nLeve
8720: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
8730: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70   assert_nc( p->p
8740: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8750: 5d 2e 6e 4d 65 72 67 65 3d 3d 70 54 65 73 74 2d  ].nMerge==pTest-
8760: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67  >aLevel[i].nMerg
8770: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  e );.        ass
8780: 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75  ert_nc( p->pStru
8790: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53  ct->aLevel[i].nS
87a0: 65 67 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76 65  eg==pTest->aLeve
87b0: 6c 5b 69 5d 2e 6e 53 65 67 20 29 3b 0a 20 20 20  l[i].nSeg );.   
87c0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
87d0: 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  pTest->aLevel[i]
87e0: 2e 6e 53 65 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20  .nSeg; j++){.   
87f0: 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63         Fts5Struc
8800: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 31 20  tureSegment *p1 
8810: 3d 20 26 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c  = &pTest->aLevel
8820: 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20 20  [i].aSeg[j];.   
8830: 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63         Fts5Struc
8840: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 32 20  tureSegment *p2 
8850: 3d 20 26 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61  = &p->pStruct->a
8860: 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d  Level[i].aSeg[j]
8870: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
8880: 72 74 5f 6e 63 28 20 70 31 2d 3e 69 53 65 67 69  rt_nc( p1->iSegi
8890: 64 3d 3d 70 32 2d 3e 69 53 65 67 69 64 20 29 3b  d==p2->iSegid );
88a0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
88b0: 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 46 69  t_nc( p1->pgnoFi
88c0: 72 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 46 69 72  rst==p2->pgnoFir
88d0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
88e0: 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e 70  assert_nc( p1->p
88f0: 67 6e 6f 4c 61 73 74 3d 3d 70 32 2d 3e 70 67 6e  gnoLast==p2->pgn
8900: 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  oLast );.       
8910: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
8920: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
8930: 6c 65 61 73 65 28 70 54 65 73 74 29 3b 0a 20 20  lease(pTest);.  
8940: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
8950: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
8960: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8970: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  0;.  assert( p->
8980: 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 21 3d  iStructVersion!=
8990: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
89a0: 2d 3e 70 53 74 72 75 63 74 21 3d 30 20 29 3b 0a  ->pStruct!=0 );.
89b0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
89c0: 65 66 28 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a  ef(p->pStruct);.
89d0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 53 74 72    return p->pStr
89e0: 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  uct;.}..static v
89f0: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
8a00: 65 49 6e 76 61 6c 69 64 61 74 65 28 46 74 73 35  eInvalidate(Fts5
8a10: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28  Index *p){.  if(
8a20: 20 70 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a 20   p->pStruct ){. 
8a30: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
8a40: 52 65 6c 65 61 73 65 28 70 2d 3e 70 53 74 72 75  Release(p->pStru
8a50: 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 74 72  ct);.    p->pStr
8a60: 75 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  uct = 0;.  }.}..
8a70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8a80: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
8a90: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64   segments in ind
8aa0: 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74  ex structure pSt
8ab0: 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ruct. This.** fu
8ac0: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
8ad0: 76 65 72 20 75 73 65 64 20 61 73 20 70 61 72 74  ver used as part
8ae0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e   of assert() con
8af0: 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64  ditions..*/.#ifd
8b00: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8b10: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
8b20: 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67  tructureCountSeg
8b30: 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63 74  ments(Fts5Struct
8b40: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
8b50: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
8b60: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8b70: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
8b80: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a   of segments */.
8b90: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
8ba0: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
8bd0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
8be0: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  vels */.    for(
8bf0: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
8c00: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
8c10: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65  vl++){.      nSe
8c20: 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74  gment += pStruct
8c30: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
8c40: 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Seg;.    }.  }..
8c50: 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e    return nSegmen
8c60: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65  t;.}.#endif..#de
8c70: 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 53  fine fts5BufferS
8c80: 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
8c90: 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  uf, pBlob, nBlob
8ca0: 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73 73 65  ) {     \.  asse
8cb0: 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61  rt( (pBuf)->nSpa
8cc0: 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e 2b 6e  ce>=((pBuf)->n+n
8cd0: 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20  Blob) );        
8ce0: 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28       \.  memcpy(
8cf0: 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66  &(pBuf)->p[(pBuf
8d00: 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42  )->n], pBlob, nB
8d10: 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20 20 20  lob);           
8d20: 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20    \.  (pBuf)->n 
8d30: 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  += nBlob;       
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8d60: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .}..#define fts5
8d70: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
8d80: 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 56 61  Varint(pBuf, iVa
8d90: 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l) {            
8da0: 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e      \.  (pBuf)->
8db0: 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
8dc0: 50 75 74 56 61 72 69 6e 74 28 26 28 70 42 75 66  PutVarint(&(pBuf
8dd0: 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c  )->p[(pBuf)->n],
8de0: 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20 20 61   (iVal));  \.  a
8df0: 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e  ssert( (pBuf)->n
8e00: 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d 3e 6e  Space>=(pBuf)->n
8e10: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
8e30: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69  .../*.** Seriali
8e40: 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ze and store the
8e50: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
8e60: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ord..**.** If an
8e70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
8e80: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
8e90: 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49 6e  de in the Fts5In
8ea0: 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  dex object. If a
8eb0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61  n.** error has a
8ec0: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
8ed0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
8ee0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
8ef0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
8f00: 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74 73  ructureWrite(Fts
8f10: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
8f20: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
8f30: 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  t){.  if( p->rc=
8f40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8f50: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
8f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8f70: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65 72  /* Buffer to ser
8f80: 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69 6e  ialize record in
8f90: 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  to */.    int iL
8fa0: 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
8fb0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
8fc0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
8fd0: 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
8fe0: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20   int iCookie;   
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9000: 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20 74  * Cookie value t
9010: 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20 20  o store */..    
9020: 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
9030: 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53  >nSegment==fts5S
9040: 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67  tructureCountSeg
9050: 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29  ments(pStruct) )
9060: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75  ;.    memset(&bu
9070: 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
9080: 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
9090: 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 75  /* Append the cu
90a0: 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74  rrent configurat
90b0: 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20  ion cookie */.  
90c0: 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70    iCookie = p->p
90d0: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b  Config->iCookie;
90e0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69 65  .    if( iCookie
90f0: 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20 30  <0 ) iCookie = 0
9100: 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  ;..    if( 0==sq
9110: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
9120: 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  ize(&p->rc, &buf
9130: 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a 20 20  , 4+9+9+9) ){.  
9140: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
9150: 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43 6f 6f  ut32(buf.p, iCoo
9160: 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75 66 2e  kie);.      buf.
9170: 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66 74 73  n = 4;.      fts
9180: 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
9190: 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53  dVarint(&buf, pS
91a0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a  truct->nLevel);.
91b0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
91c0: 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
91d0: 28 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e  (&buf, pStruct->
91e0: 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20  nSegment);.     
91f0: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
9200: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66  ppendVarint(&buf
9210: 2c 20 28 69 36 34 29 70 53 74 72 75 63 74 2d 3e  , (i64)pStruct->
9220: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
9230: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
9240: 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
9250: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
9260: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l++){.      int 
9270: 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
9280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
9290: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
92a0: 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
92b0: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
92c0: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
92d0: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
92e0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
92f0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9300: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9310: 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  buf, pLvl->nMerg
9320: 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  e);.      fts5Bu
9330: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
9340: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
9350: 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20  Lvl->nSeg);.    
9360: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
9370: 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53  nMerge<=pLvl->nS
9380: 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  eg );..      for
9390: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c  (iSeg=0; iSeg<pL
93a0: 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl->nSeg; iSeg++
93b0: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
93c0: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
93d0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
93e0: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
93f0: 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20  .iSegid);.      
9400: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
9410: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
9420: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
9430: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
9440: 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t);.        fts5
9450: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9460: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9470: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
9480: 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20  ].pgnoLast);.   
9490: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
94a0: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
94b0: 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
94c0: 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20 62 75  ROWID, buf.p, bu
94d0: 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75  f.n);.    fts5Bu
94e0: 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
94f0: 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61    }.}..#if 0.sta
9500: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
9510: 75 67 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a  ugStructure(int*
9520: 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73  ,Fts5Buffer*,Fts
9530: 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74  5Structure*);.st
9540: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 72  atic void fts5Pr
9550: 69 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e  intStructure(con
9560: 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f  st char *zCaptio
9570: 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  n, Fts5Structure
9580: 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e   *pStruct){.  in
9590: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
95a0: 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
95b0: 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
95c0: 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66  f, 0, sizeof(buf
95d0: 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53  ));.  fts5DebugS
95e0: 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 62  tructure(&rc, &b
95f0: 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  uf, pStruct);.  
9600: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
9610: 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70  "%s: %s\n", zCap
9620: 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20  tion, buf.p);.  
9630: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
9640: 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
9650: 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a  (&buf);.}.#else.
9660: 23 20 64 65 66 69 6e 65 20 66 74 73 35 50 72 69  # define fts5Pri
9670: 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c 79 29  ntStructure(x,y)
9680: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
9690: 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53  int fts5SegmentS
96a0: 69 7a 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ize(Fts5Structur
96b0: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b  eSegment *pSeg){
96c0: 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53  .  return 1 + pS
96d0: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70  eg->pgnoLast - p
96e0: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a  Seg->pgnoFirst;.
96f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9700: 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20  a copy of index 
9710: 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
9720: 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f  t. Except, promo
9730: 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73  te as many .** s
9740: 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69  egments as possi
9750: 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72  ble to level iPr
9760: 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d  omote. If an OOM
9770: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
9780: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
9790: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
97a0: 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
97b0: 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65  teTo(.  Fts5Inde
97c0: 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f  x *p,.  int iPro
97d0: 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72  mote,.  int szPr
97e0: 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72  omote,.  Fts5Str
97f0: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a  ucture *pStruct.
9800: 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b  ){.  int il, is;
9810: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
9820: 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70  Level *pOut = &p
9830: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9840: 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28  Promote];..  if(
9850: 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30   pOut->nMerge==0
9860: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69   ){.    for(il=i
9870: 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53  Promote+1; il<pS
9880: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
9890: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
98a0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
98b0: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
98c0: 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20  >aLevel[il];.   
98d0: 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
98e0: 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  rge ) return;.  
98f0: 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d      for(is=pLvl-
9900: 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20  >nSeg-1; is>=0; 
9910: 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69  is--){.        i
9920: 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d  nt sz = fts5Segm
9930: 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61  entSize(&pLvl->a
9940: 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20  Seg[is]);.      
9950: 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f    if( sz>szPromo
9960: 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  te ) return;.   
9970: 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
9980: 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
9990: 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69  ->rc, pStruct, i
99a0: 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a  Promote, 1, 1);.
99b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
99c0: 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  c ) return;.    
99d0: 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d      memcpy(pOut-
99e0: 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53  >aSeg, &pLvl->aS
99f0: 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46  eg[is], sizeof(F
9a00: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
9a10: 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70  ent));.        p
9a20: 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20  Out->nSeg++;.   
9a30: 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d       pLvl->nSeg-
9a40: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
9a50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
9a60: 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20  new segment has 
9a70: 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74 74 65  just been writte
9a80: 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20  n to level iLvl 
9a90: 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  of index structu
9aa0: 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54  re.** pStruct. T
9ab0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
9ac0: 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73  ermines if any s
9ad0: 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  egments should b
9ae0: 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73  e promoted.** as
9af0: 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65   a result. Segme
9b00: 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64  nts are promoted
9b10: 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
9b20: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66  s:.**.**   a) If
9b30: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73   the segment jus
9b40: 74 20 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61  t written is sma
9b50: 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72  ller than one or
9b60: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a   more segments.*
9b70: 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20 74 68  *      within th
9b80: 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c  e previous popul
9b90: 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69  ated level, it i
9ba0: 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68  s promoted to th
9bb0: 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20  e previous.**   
9bc0: 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76     populated lev
9bd0: 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49  el..**.**   b) I
9be0: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75  f the segment ju
9bf0: 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61  st written is la
9c00: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65  rger than the ne
9c10: 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a  west segment on.
9c20: 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65 78 74  **      the next
9c30: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
9c40: 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d  , then that segm
9c50: 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68  ent, and any oth
9c60: 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20  er adjacent.**  
9c70: 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61      segments tha
9c80: 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c  t are also small
9c90: 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20  er than the one 
9ca0: 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72  just written, ar
9cb0: 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f  e .**      promo
9cc0: 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  ted. .**.** If o
9cd0: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
9ce0: 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64  nts are promoted
9cf0: 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  , the structure 
9d00: 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61 74 65  object is update
9d10: 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20  d.** to reflect 
9d20: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
9d30: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
9d40: 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73  rePromote(.  Fts
9d50: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d70: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
9d80: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76  ect */.  int iLv
9d90: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9db0: 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64  x level just upd
9dc0: 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74  ated */.  Fts5St
9dd0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
9de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9df0: 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
9e00: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
9e10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9e20: 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69   int iTst;.    i
9e30: 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31  nt iPromote = -1
9e40: 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d  ;.    int szProm
9e50: 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ote = 0;        
9e60: 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61      /* Promote a
9e70: 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a  nything this siz
9e80: 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a  e or smaller */.
9e90: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
9ea0: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
9eb0: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73    /* Segment jus
9ec0: 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  t written */.   
9ed0: 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20   int szSeg;     
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ef0: 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e  * Size of segmen
9f00: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  t just written *
9f10: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 20 3d  /.    int nSeg =
9f20: 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
9f30: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20 20  [iLvl].nSeg;..  
9f40: 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20 29 20    if( nSeg==0 ) 
9f50: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53 65 67  return;.    pSeg
9f60: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9f70: 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70  vel[iLvl].aSeg[p
9f80: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9f90: 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20  Lvl].nSeg-1];.  
9fa0: 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70    szSeg = (1 + p
9fb0: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
9fc0: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29  pSeg->pgnoFirst)
9fd0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
9fe0: 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61  for condition (a
9ff0: 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73  ) */.    for(iTs
a000: 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d  t=iLvl-1; iTst>=
a010: 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  0 && pStruct->aL
a020: 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d  evel[iTst].nSeg=
a030: 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20  =0; iTst--);.   
a040: 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a   if( iTst>=0 ){.
a050: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a060: 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30     int szMax = 0
a070: 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  ;.      Fts5Stru
a080: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74  ctureLevel *pTst
a090: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
a0a0: 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20  vel[iTst];.     
a0b0: 20 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e   assert( pTst->n
a0c0: 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Merge==0 );.    
a0d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73    for(i=0; i<pTs
a0e0: 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  t->nSeg; i++){. 
a0f0: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
a100: 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67  pTst->aSeg[i].pg
a110: 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61  noLast - pTst->a
a120: 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74  Seg[i].pgnoFirst
a130: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   + 1;.        if
a140: 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d  ( sz>szMax ) szM
a150: 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d  ax = sz;.      }
a160: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78  .      if( szMax
a170: 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20  >=szSeg ){.     
a180: 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20     /* Condition 
a190: 28 61 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f  (a) is true. Pro
a1a0: 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74 20  mote the newest 
a1b0: 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c  segment on level
a1c0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76   .        ** iLv
a1d0: 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e  l to level iTst.
a1e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72    */.        iPr
a1f0: 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20  omote = iTst;.  
a200: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
a210: 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d  = szMax;.      }
a220: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
a230: 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  f condition (a) 
a240: 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75  is not met, assu
a250: 6d 65 20 28 62 29 20 69 73 20 74 72 75 65 2e 20  me (b) is true. 
a260: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
a270: 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61  To().    ** is a
a280: 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20   no-op if it is 
a290: 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  not.  */.    if(
a2a0: 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20   iPromote<0 ){. 
a2b0: 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20       iPromote = 
a2c0: 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72  iLvl;.      szPr
a2d0: 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20  omote = szSeg;. 
a2e0: 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
a2f0: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
a300: 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50  p, iPromote, szP
a310: 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29  romote, pStruct)
a320: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
a330: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
a340: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
a350: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
a360: 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f 66 20  . If the end of 
a370: 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d  the .** doclist-
a380: 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 72 65  index page is re
a390: 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f  ached, return no
a3a0: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
a3b0: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c  c int fts5DlidxL
a3c0: 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69 64 78  vlNext(Fts5Dlidx
a3d0: 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46 74  Lvl *pLvl){.  Ft
a3e0: 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  s5Data *pData = 
a3f0: 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20 20  pLvl->pData;..  
a400: 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d  if( pLvl->iOff==
a410: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
a420: 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29   pLvl->bEof==0 )
a430: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
a440: 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e   = 1;.    pLvl->
a450: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
a460: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 2d 3e  arint32(&pData->
a470: 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61  p[1], pLvl->iLea
a480: 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76 6c  fPgno);.    pLvl
a490: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
a4a0: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
a4b0: 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28  p[pLvl->iOff], (
a4c0: 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f 77  u64*)&pLvl->iRow
a4d0: 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  id);.    pLvl->i
a4e0: 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c 2d  FirstOff = pLvl-
a4f0: 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >iOff;.  }else{.
a500: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
a510: 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c 2d    for(iOff=pLvl-
a520: 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61 74  >iOff; iOff<pDat
a530: 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a  a->nn; iOff++){.
a540: 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 2d        if( pData-
a550: 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b  >p[iOff] ) break
a560: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
a570: 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e  ( iOff<pData->nn
a580: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56   ){.      i64 iV
a590: 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  al;.      pLvl->
a5a0: 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f  iLeafPgno += (iO
a5b0: 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66 29  ff - pLvl->iOff)
a5c0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66 66   + 1;.      iOff
a5d0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
a5e0: 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  t(&pData->p[iOff
a5f0: 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b  ], (u64*)&iVal);
a600: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f  .      pLvl->iRo
a610: 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20  wid += iVal;.   
a620: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20     pLvl->iOff = 
a630: 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iOff;.    }else{
a640: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  .      pLvl->bEo
a650: 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  f = 1;.    }.  }
a660: 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d  ..  return pLvl-
a670: 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >bEof;.}../*.** 
a680: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
a690: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
a6a0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
a6b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a6c0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
a6d0: 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  tR(Fts5Index *p,
a6e0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
a6f0: 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29  pIter, int iLvl)
a700: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c  {.  Fts5DlidxLvl
a710: 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
a720: 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20  >aLvl[iLvl];..  
a730: 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74  assert( iLvl<pIt
a740: 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66  er->nLvl );.  if
a750: 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ( fts5DlidxLvlNe
a760: 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20  xt(pLvl) ){.    
a770: 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70  if( (iLvl+1) < p
a780: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20  Iter->nLvl ){.  
a790: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
a7a0: 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c  rNextR(p, pIter,
a7b0: 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20   iLvl+1);.      
a7c0: 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66  if( pLvl[1].bEof
a7d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
a7e0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
a7f0: 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  Lvl->pData);.   
a800: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c       memset(pLvl
a810: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
a820: 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
a830: 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
a840: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
a850: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  , .            F
a860: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
a870: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  pIter->iSegid, i
a880: 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65  Lvl, pLvl[1].iLe
a890: 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  afPgno).        
a8a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
a8b0: 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66 74 73  Lvl->pData ) fts
a8c0: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
a8d0: 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  vl);.      }.   
a8e0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
a8f0: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
a900: 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bEof;.}.static i
a910: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
a920: 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a  Next(Fts5Index *
a930: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
a940: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
a950: 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  rn fts5DlidxIter
a960: 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20  NextR(p, pIter, 
a970: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  0);.}../*.** The
a980: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
a990: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
a9a0: 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66  gument has the f
a9b0: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
a9c0: 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  set.** as follow
a9d0: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
a9e0: 20 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73   sets up the res
a9f0: 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  t of the iterato
aa00: 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  r so that it.** 
aa10: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
aa20: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  rst rowid in the
aa30: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a   doclist-index..
aa40: 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a  **.**   pData:.*
aa50: 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20 74 6f  *     pointer to
aa60: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
aa70: 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68  ecord, .**.** Wh
aa80: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
aa90: 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65 72   is called pIter
aaa0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20 74  ->iLeafPgno is t
aab0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
aac0: 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73  he.** doclist is
aad0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
aae0: 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75 72   (the one featur
aaf0: 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a  ing the term)..*
ab00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ab10: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
ab20: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
ab30: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Iter){.  int i;.
ab40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
ab50: 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a  er->nLvl; i++){.
ab60: 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c 76 6c      fts5DlidxLvl
ab70: 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61 4c 76  Next(&pIter->aLv
ab80: 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  l[i]);.  }.  ret
ab90: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
aba0: 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61  0].bEof;.}...sta
abb0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
abc0: 78 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  xIterEof(Fts5Ind
abd0: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
abe0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
abf0: 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51  return p->rc!=SQ
ac00: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
ac10: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
ac20: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
ac30: 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74  ts5DlidxIterLast
ac40: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
ac50: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
ac60: 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ter){.  int i;..
ac70: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63    /* Advance eac
ac80: 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65 20 6c  h level to the l
ac90: 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ast entry on the
aca0: 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a 20 20   last page */.  
acb0: 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76  for(i=pIter->nLv
acc0: 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  l-1; p->rc==SQLI
acd0: 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69  TE_OK && i>=0; i
ace0: 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  --){.    Fts5Dli
acf0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
ad00: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20  Iter->aLvl[i];. 
ad10: 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c     while( fts5Dl
ad20: 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29  idxLvlNext(pLvl)
ad30: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  ==0 );.    pLvl-
ad40: 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20  >bEof = 0;..    
ad50: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
ad60: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
ad70: 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31  Child = &pLvl[-1
ad80: 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ];.      fts5Dat
ad90: 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c 64 2d  aRelease(pChild-
ada0: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 6d  >pData);.      m
adb0: 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20 30 2c  emset(pChild, 0,
adc0: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
add0: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 43  xLvl));.      pC
ade0: 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20 66 74  hild->pData = ft
adf0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
ae00: 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
ae10: 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  IDX_ROWID(pIter-
ae20: 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c  >iSegid, i-1, pL
ae30: 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  vl->iLeafPgno). 
ae40: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
ae50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  }.}../*.** Move 
ae60: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
ae70: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
ae80: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
ae90: 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a  previous entry..
aea0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
aeb0: 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 46  s5DlidxLvlPrev(F
aec0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
aed0: 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  l){.  int iOff =
aee0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20   pLvl->iOff;..  
aef0: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45  assert( pLvl->bE
af00: 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  of==0 );.  if( i
af10: 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73  Off<=pLvl->iFirs
af20: 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c  tOff ){.    pLvl
af30: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65  ->bEof = 1;.  }e
af40: 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d  lse{.    u8 *a =
af50: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b   pLvl->pData->p;
af60: 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20  .    i64 iVal;. 
af70: 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20     int iLimit;. 
af80: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69     int ii;.    i
af90: 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20  nt nZero = 0;.. 
afa0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20     /* Currently 
afb0: 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20 74  iOff points to t
afc0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
afd0: 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20   a varint. This 
afe0: 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65  block .    ** de
aff0: 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e  crements iOff un
b000: 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
b010: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
b020: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
b030: 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20  .    ** varint. 
b040: 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20  Taking care not 
b050: 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f  to read any memo
b060: 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61  ry locations tha
b070: 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20 62  t occur.    ** b
b080: 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  efore the buffer
b090: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a   in memory.  */.
b0a0: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f      iLimit = (iO
b0b0: 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20  ff>9 ? iOff-9 : 
b0c0: 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66  0);.    for(iOff
b0d0: 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b  --; iOff>iLimit;
b0e0: 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20   iOff--){.      
b0f0: 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26  if( (a[iOff-1] &
b100: 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65 61   0x80)==0 ) brea
b110: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  k;.    }..    ft
b120: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
b130: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61  Off], (u64*)&iVa
b140: 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 52  l);.    pLvl->iR
b150: 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20  owid -= iVal;.  
b160: 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e    pLvl->iLeafPgn
b170: 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69  o--;..    /* Ski
b180: 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73 74  p backwards past
b190: 20 61 6e 79 20 30 78 30 30 20 76 61 72 69 6e 74   any 0x00 varint
b1a0: 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  s. */.    for(ii
b1b0: 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70 4c 76  =iOff-1; ii>=pLv
b1c0: 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20  l->iFirstOff && 
b1d0: 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69 69 2d  a[ii]==0x00; ii-
b1e0: 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 2b  -){.      nZero+
b1f0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
b200: 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73   ii>=pLvl->iFirs
b210: 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d 20 26  tOff && (a[ii] &
b220: 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20 20 20   0x80) ){.      
b230: 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d 6d 65  /* The byte imme
b240: 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65 20 74  diately before t
b250: 68 65 20 6c 61 73 74 20 30 78 30 30 20 62 79 74  he last 0x00 byt
b260: 65 20 68 61 73 20 74 68 65 20 30 78 38 30 20 62  e has the 0x80 b
b270: 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  it.      ** set.
b280: 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30 78 30   So the last 0x0
b290: 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61 72 69  0 is only a vari
b2a0: 6e 74 20 30 20 69 66 20 74 68 65 72 65 20 61 72  nt 0 if there ar
b2b0: 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a 20 20  e 8 more 0x80.  
b2c0: 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62 65 66      ** bytes bef
b2d0: 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20  ore a[ii]. */.  
b2e0: 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20 3d 20      int bZero = 
b2f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b300: 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73 74 20  /* True if last 
b310: 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f 0a 20  0x00 counts */. 
b320: 20 20 20 20 20 69 66 28 20 28 69 69 2d 38 29 3e       if( (ii-8)>
b330: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
b340: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b350: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
b360: 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61 5b 69  =1; j<=8 && (a[i
b370: 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20 6a 2b  i-j] & 0x80); j+
b380: 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a 65 72  +);.        bZer
b390: 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20 20 20  o = (j>8);.     
b3a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 5a 65   }.      if( bZe
b3b0: 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b  ro==0 ) nZero--;
b3c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d  .    }.    pLvl-
b3d0: 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a  >iLeafPgno -= nZ
b3e0: 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  ero;.    pLvl->i
b3f0: 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e 5a 65  Off = iOff - nZe
b400: 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ro;.  }..  retur
b410: 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a  n pLvl->bEof;.}.
b420: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b430: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 46  DlidxIterPrevR(F
b440: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
b450: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
b460: 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20  r, int iLvl){.  
b470: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
b480: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
b490: 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65  l[iLvl];..  asse
b4a0: 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e  rt( iLvl<pIter->
b4b0: 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74  nLvl );.  if( ft
b4c0: 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 70  s5DlidxLvlPrev(p
b4d0: 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Lvl) ){.    if( 
b4e0: 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72  (iLvl+1) < pIter
b4f0: 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20  ->nLvl ){.      
b500: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
b510: 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76  vR(p, pIter, iLv
b520: 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l+1);.      if( 
b530: 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20  pLvl[1].bEof==0 
b540: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  ){.        fts5D
b550: 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
b560: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >pData);.       
b570: 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c   memset(pLvl, 0,
b580: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
b590: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  xLvl));.        
b5a0: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
b5b0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
b5c0: 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
b5d0: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
b5e0: 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c  r->iSegid, iLvl,
b5f0: 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67   pLvl[1].iLeafPg
b600: 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
b610: 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
b620: 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  >pData ){.      
b630: 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44      while( fts5D
b640: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c  lidxLvlNext(pLvl
b650: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
b660: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30    pLvl->bEof = 0
b670: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b680: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
b690: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
b6a0: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73  Lvl[0].bEof;.}.s
b6b0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
b6c0: 69 64 78 49 74 65 72 50 72 65 76 28 46 74 73 35  idxIterPrev(Fts5
b6d0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
b6e0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
b6f0: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c  .  return fts5Dl
b700: 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20  idxIterPrevR(p, 
b710: 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  pIter, 0);.}../*
b720: 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c 69  .** Free a docli
b730: 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74 6f  st-index iterato
b740: 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74  r object allocat
b750: 65 64 20 62 79 20 66 74 73 35 44 6c 69 64 78 49  ed by fts5DlidxI
b760: 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  terInit()..*/.st
b770: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
b780: 69 64 78 49 74 65 72 46 72 65 65 28 46 74 73 35  idxIterFree(Fts5
b790: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b7a0: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
b7b0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
b7c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
b7d0: 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20  r->nLvl; i++){. 
b7e0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
b7f0: 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c  ease(pIter->aLvl
b800: 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20 20 20  [i].pData);.    
b810: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
b820: 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  ee(pIter);.  }.}
b830: 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44 6c 69  ..static Fts5Dli
b840: 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c 69 64  dxIter *fts5Dlid
b850: 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  xIterInit(.  Fts
b860: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b880: 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74 6f 20  Fts5 Backend to 
b890: 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
b8a0: 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
b8d0: 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a 2f 0a  ORDER BY ASC */.
b8e0: 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20    int iSegid,   
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
b910: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67       /* Leaf pag
b940: 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64  e number to load
b950: 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29 7b   dlidx for */.){
b960: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
b970: 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69   *pIter = 0;.  i
b980: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e  nt i;.  int bDon
b990: 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  e = 0;..  for(i=
b9a0: 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
b9b0: 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b  _OK && bDone==0;
b9c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e   i++){.    int n
b9d0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
b9e0: 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b 20 69  s5DlidxIter) + i
b9f0: 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c   * sizeof(Fts5Dl
ba00: 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74 73  idxLvl);.    Fts
ba10: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e 65 77  5DlidxIter *pNew
ba20: 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 46  ;..    pNew = (F
ba30: 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29 73 71  ts5DlidxIter*)sq
ba40: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49  lite3_realloc(pI
ba50: 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ter, nByte);.   
ba60: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
ba70: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
ba80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
ba90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34  }else{.      i64
baa0: 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 44   iRowid = FTS5_D
bab0: 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65 67 69  LIDX_ROWID(iSegi
bac0: 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a  d, i, iLeafPg);.
bad0: 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c        Fts5DlidxL
bae0: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77  vl *pLvl = &pNew
baf0: 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20  ->aLvl[i];.     
bb00: 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20   pIter = pNew;. 
bb10: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c       memset(pLvl
bb20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
bb30: 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
bb40: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
bb50: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
bb60: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
bb70: 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26  f( pLvl->pData &
bb80: 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e  & (pLvl->pData->
bb90: 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29 3d 3d  p[0] & 0x0001)==
bba0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44 6f  0 ){.        bDo
bbb0: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
bbc0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76        pIter->nLv
bbd0: 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  l = i+1;.    }. 
bbe0: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
bbf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bc00: 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69 64 20    pIter->iSegid 
bc10: 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 69 66  = iSegid;.    if
bc20: 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
bc30: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
bc40: 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20  First(pIter);.  
bc50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
bc60: 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74  ts5DlidxIterLast
bc70: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
bc80: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
bc90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bca0: 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74  .    fts5DlidxIt
bcb0: 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20  erFree(pIter);. 
bcc0: 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20     pIter = 0;.  
bcd0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
bce0: 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34  r;.}..static i64
bcf0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f   fts5DlidxIterRo
bd00: 77 69 64 28 46 74 73 35 44 6c 69 64 78 49 74 65  wid(Fts5DlidxIte
bd10: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
bd20: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
bd30: 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61  0].iRowid;.}.sta
bd40: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
bd50: 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35 44 6c  xIterPgno(Fts5Dl
bd60: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
bd70: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
bd80: 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67  >aLvl[0].iLeafPg
bd90: 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  no;.}../*.** Loa
bda0: 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20  d the next leaf 
bdb0: 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65  page into the se
bdc0: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a  gment iterator..
bdd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
bde0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
bdf0: 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
be00: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
be10: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
be20: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
be30: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
be40: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
be50: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
be60: 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74   advance to next
be70: 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74   page */.){.  Ft
be80: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
be90: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
bea0: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
beb0: 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73  ter->pSeg;.  fts
bec0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
bed0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
bee0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b  ter->iLeafPgno++
bef0: 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ;.  if( pIter->p
bf00: 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20 20 20  NextLeaf ){.    
bf10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
bf20: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b  Iter->pNextLeaf;
bf30: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78  .    pIter->pNex
bf40: 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLeaf = 0;.  }el
bf50: 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c  se if( pIter->iL
bf60: 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  eafPgno<=pSeg->p
bf70: 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
bf80: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74  Iter->pLeaf = ft
bf90: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
bfa0: 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d         FTS5_SEGM
bfb0: 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
bfc0: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
bfd0: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b  LeafPgno).    );
bfe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
bff0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
c000: 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20 70 49    }.  pLeaf = pI
c010: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69  ter->pLeaf;..  i
c020: 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
c030: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
c040: 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
c050: 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 65  ;.    if( fts5Le
c060: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65  afIsTermless(pLe
c070: 61 66 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74  af) ){.      pIt
c080: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
c090: 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  t = pLeaf->nn+1;
c0a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c0b0: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
c0c0: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
c0d0: 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
c0e0: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
c0f0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ],.          pIt
c100: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
c110: 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
c120: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  .  }.}../*.** Ar
c130: 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20  gument p points 
c140: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
c150: 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e 74 20  aining a varint 
c160: 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  to be interprete
c170: 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69  d as a.** positi
c180: 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on list size fie
c190: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 72  ld. Read the var
c1a0: 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  int and return t
c1b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
c1c0: 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f  es.** read. Befo
c1d0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65  re returning, se
c1e0: 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e  t *pnSz to the n
c1f0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
c200: 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a  n the position.*
c210: 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62 44  * list, and *pbD
c220: 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  el to true if th
c230: 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73  e delete flag is
c240: 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f   set, or false o
c250: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
c260: 74 69 63 20 69 6e 74 20 66 74 73 35 47 65 74 50  tic int fts5GetP
c270: 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73 74  oslistSize(const
c280: 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53   u8 *p, int *pnS
c290: 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a  z, int *pbDel){.
c2a0: 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74    int nSz;.  int
c2b0: 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35 46 61   n = 0;.  fts5Fa
c2c0: 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  stGetVarint32(p,
c2d0: 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65   n, nSz);.  asse
c2e0: 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b  rt_nc( nSz>=0 );
c2f0: 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32  .  *pnSz = nSz/2
c300: 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a  ;.  *pbDel = nSz
c310: 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74   & 0x0001;.  ret
c320: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
c330: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
c340: 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c  fOffset currentl
c350: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
c360: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a  first byte of a.
c370: 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
c380: 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61   size field. Rea
c390: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  d the value of t
c3a0: 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f  he field and sto
c3b0: 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20  re it.** in the 
c3c0: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
c3d0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  les:.**.**   Fts
c3e0: 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a  5SegIter.nPos.**
c3f0: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62     Fts5SegIter.b
c400: 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20  Del.**.** Leave 
c410: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
c420: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67  fOffset pointing
c430: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
c440: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f  te of the .** po
c450: 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
c460: 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f  ent (if any)..*/
c470: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c480: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
c490: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
c4a0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
c4b0: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
c4c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c4d0: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
c4e0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
c4f0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
c500: 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 41 53  ead at */.    AS
c510: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
c520: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
c530: 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
c540: 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
c550: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
c560: 20 20 20 20 20 69 6e 74 20 69 45 6f 64 20 3d 20       int iEod = 
c570: 4d 49 4e 28 70 49 74 65 72 2d 3e 69 45 6e 64 6f  MIN(pIter->iEndo
c580: 66 44 6f 63 6c 69 73 74 2c 20 70 49 74 65 72 2d  fDoclist, pIter-
c590: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 29 3b  >pLeaf->szLeaf);
c5a0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44  .      pIter->bD
c5b0: 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  el = 0;.      pI
c5c0: 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20  ter->nPos = 1;. 
c5d0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45       if( iOff<iE
c5e0: 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65  od && pIter->pLe
c5f0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29  af->p[iOff]==0 )
c600: 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
c610: 3e 62 44 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20  >bDel = 1;.     
c620: 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20     iOff++;.     
c630: 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45 6f 64     if( iOff<iEod
c640: 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66   && pIter->pLeaf
c650: 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a  ->p[iOff]==0 ){.
c660: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
c670: 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20  >nPos = 1;.     
c680: 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
c690: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c6a0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
c6b0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  s = 0;.        }
c6c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
c6d0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53  se{.      int nS
c6e0: 7a 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73  z;.      fts5Fas
c6f0: 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74  tGetVarint32(pIt
c700: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 69 4f  er->pLeaf->p, iO
c710: 66 66 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20  ff, nSz);.      
c720: 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e  pIter->bDel = (n
c730: 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  Sz & 0x0001);.  
c740: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
c750: 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20  = nSz>>1;.      
c760: 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72  assert_nc( pIter
c770: 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20  ->nPos>=0 );.   
c780: 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c   }.    pIter->iL
c790: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
c7a0: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
c7b0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
c7c0: 4c 6f 61 64 52 6f 77 69 64 28 46 74 73 35 49 6e  LoadRowid(Fts5In
c7d0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
c7e0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75  ter *pIter){.  u
c7f0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
c800: 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f  eaf->p;        /
c810: 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64  * Buffer to read
c820: 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20   data from */.  
c830: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
c840: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a  ->iLeafOffset;..
c850: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
c860: 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  OK(pIter->pLeaf)
c870: 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49  ;.  if( iOff>=pI
c880: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
c890: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
c8a0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
c8b0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28   pIter);.    if(
c8c0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
c8d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
c8e0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
c8f0: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
c900: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74  RRUPT;.      ret
c910: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
c920: 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d  Off = 4;.    a =
c930: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
c940: 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20  ;.  }.  iOff += 
c950: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
c960: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
c970: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
c980: 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  wid);.  pIter->i
c990: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
c9a0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35  f;.}../*.** Fts5
c9b0: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
c9c0: 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  set currently po
c9d0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
c9e0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
c9f0: 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c  * "nSuffix" fiel
ca00: 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e  d of a term. Fun
ca10: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
ca20: 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74  nKeep contains t
ca30: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
ca40: 68 65 20 22 6e 50 72 65 66 69 78 22 20 66 69 65  he "nPrefix" fie
ca50: 6c 64 20 28 69 66 20 74 68 65 72 65 20 77 61 73  ld (if there was
ca60: 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73   one - it is pas
ca70: 73 65 64 20 30 20 69 66 20 74 68 69 73 20 69 73  sed 0 if this is
ca80: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 65  .** the first te
ca90: 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
caa0: 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  t)..**.** This f
cab0: 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65  unction populate
cac0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53  s:.**.**   Fts5S
cad0: 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20  egIter.term.**  
cae0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77   Fts5SegIter.row
caf0: 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69  id.**.** accordi
cb00: 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20  ngly and leaves 
cb10: 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65  (Fts5SegIter.iLe
cb20: 61 66 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f  afOffset) set to
cb30: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
cb40: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f 73  ** the first pos
cb50: 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20  ition list. The 
cb60: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65  position list be
cb70: 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d  longing to docum
cb80: 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67  ent .** (Fts5Seg
cb90: 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f  Iter.iRowid)..*/
cba0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
cbb0: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
cbc0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
cbd0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
cbe0: 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20  r, int nKeep){. 
cbf0: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
cc00: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
cc10: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
cc20: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
cc30: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
cc40: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
cc50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
cc60: 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20  ead at */.  int 
cc70: 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cc90: 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61  ytes of new data
cca0: 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66   */..  iOff += f
ccb0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
ccc0: 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  a[iOff], nNew);.
ccd0: 20 20 69 66 28 20 69 4f 66 66 2b 6e 4e 65 77 3e    if( iOff+nNew>
cce0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
ccf0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
cd00: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
cd10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
cd20: 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20  pIter->term.n = 
cd30: 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42 75 66  nKeep;.  fts5Buf
cd40: 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
cd50: 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
cd60: 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66  rm, nNew, &a[iOf
cd70: 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e  f]);.  iOff += n
cd80: 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54  New;.  pIter->iT
cd90: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ermLeafOffset = 
cda0: 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69  iOff;.  pIter->i
cdb0: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70  TermLeafPgno = p
cdc0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
cdd0: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  .  pIter->iLeafO
cde0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20  ffset = iOff;.. 
cdf0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50 67 69   if( pIter->iPgi
ce00: 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c  dxOff>=pIter->pL
ce10: 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 70  eaf->nn ){.    p
ce20: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
ce30: 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  ist = pIter->pLe
ce40: 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73  af->nn+1;.  }els
ce50: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72  e{.    int nExtr
ce60: 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  a;.    pIter->iP
ce70: 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
ce80: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 70 49  etVarint32(&a[pI
ce90: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c  ter->iPgidxOff],
cea0: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 70 49   nExtra);.    pI
ceb0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
cec0: 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 20 20  st += nExtra;.  
ced0: 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  }..  fts5SegIter
cee0: 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74  LoadRowid(p, pIt
cef0: 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  er);.}..static v
cf00: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
cf10: 65 78 74 28 46 74 73 35 49 6e 64 65 78 2a 2c 20  ext(Fts5Index*, 
cf20: 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e  Fts5SegIter*, in
cf30: 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
cf40: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
cf50: 5f 52 65 76 65 72 73 65 28 46 74 73 35 49 6e 64  _Reverse(Fts5Ind
cf60: 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72  ex*, Fts5SegIter
cf70: 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63  *, int*);.static
cf80: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
cf90: 72 4e 65 78 74 5f 4e 6f 6e 65 28 46 74 73 35 49  rNext_None(Fts5I
cfa0: 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74  ndex*, Fts5SegIt
cfb0: 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 73 74 61  er*, int*);..sta
cfc0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
cfd0: 49 74 65 72 53 65 74 4e 65 78 74 28 46 74 73 35  IterSetNext(Fts5
cfe0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
cff0: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
d000: 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67   if( pIter->flag
d010: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
d020: 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20 20 20  _REVERSE ){.    
d030: 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66  pIter->xNext = f
d040: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52  ts5SegIterNext_R
d050: 65 76 65 72 73 65 3b 0a 20 20 7d 65 6c 73 65 20  everse;.  }else 
d060: 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  if( p->pConfig->
d070: 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
d080: 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
d090: 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20   pIter->xNext = 
d0a0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
d0b0: 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  None;.  }else{. 
d0c0: 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20     pIter->xNext 
d0d0: 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  = fts5SegIterNex
d0e0: 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t;.  }.}../*.** 
d0f0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69  Initialize the i
d100: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
d110: 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20  Iter to iterate 
d120: 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74 72  through the entr
d130: 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e  ies in.** segmen
d140: 74 20 70 53 65 67 2e 20 54 68 65 20 69 74 65 72  t pSeg. The iter
d150: 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  ator is left poi
d160: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
d170: 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20 0a 2a  st entry when .*
d180: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
d190: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
d1a0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d1b0: 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
d1c0: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
d1d0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
d1e0: 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
d1f0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
d200: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
d210: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d220: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
d230: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
d240: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
d250: 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
d260: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
d270: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
d280: 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
d290: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
d2a0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20  egment *pSeg,   
d2b0: 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
d2c0: 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20   of segment */. 
d2d0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
d2e0: 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
d2f0: 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f   /* Object to po
d300: 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  pulate */.){.  i
d310: 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  f( pSeg->pgnoFir
d320: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  st==0 ){.    /* 
d330: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
d340: 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 62  the segment is b
d350: 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e 20  eing used as an 
d360: 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63 72  input to an incr
d370: 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d  emental.    ** m
d380: 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61 74  erge and all dat
d390: 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
d3a0: 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53 65  en "trimmed". Se
d3b0: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a  e function.    *
d3c0: 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e  * fts5TrimSegmen
d3d0: 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  ts() for details
d3e0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
d3f0: 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  eave the iterato
d400: 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20  r empty..    ** 
d410: 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
d420: 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d 3e  see the (pIter->
d430: 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61 73  pLeaf==0) and as
d440: 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74 6f  sume the iterato
d450: 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20 45  r is.    ** at E
d460: 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20  OF already. */. 
d470: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
d480: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  ->pLeaf==0 );.  
d490: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
d4a0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
d4b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d  TE_OK ){.    mem
d4c0: 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
d4d0: 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
d4e0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65     fts5SegIterSe
d4f0: 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  tNext(p, pIter);
d500: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67  .    pIter->pSeg
d510: 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 70 49 74   = pSeg;.    pIt
d520: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
d530: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d  pSeg->pgnoFirst-
d540: 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  1;.    fts5SegIt
d550: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
d560: 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ter);.  }..  if(
d570: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d580: 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
d590: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34 3b  iLeafOffset = 4;
d5a0: 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20  .    assert_nc( 
d5b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
d5c0: 3e 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >4 );.    assert
d5d0: 28 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  ( fts5LeafFirstT
d5e0: 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c  ermOff(pIter->pL
d5f0: 65 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70  eaf)==4 );.    p
d600: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20  Iter->iPgidxOff 
d610: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d620: 73 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66 74  szLeaf+1;.    ft
d630: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
d640: 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  m(p, pIter, 0);.
d650: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
d660: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
d670: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
d680: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d690: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
d6a0: 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63  d on iterators c
d6b0: 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20  reated by calls 
d6c0: 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51  to.** Fts5IndexQ
d6d0: 75 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20  uery() with the 
d6e0: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
d6f0: 44 45 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a  DESC flag set..*
d700: 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
d710: 72 20 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75  r is in an unusu
d720: 61 6c 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  al state when th
d730: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d740: 61 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74  alled: the.** Ft
d750: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
d760: 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 20 69  ffset variable i
d770: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
d780: 73 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74  set of the start
d790: 20 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74   of.** the posit
d7a0: 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
d7b0: 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69 72 73  eld for the firs
d7c0: 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64  t relevant rowid
d7d0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
d7e0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77   Fts5SegIter.row
d7f0: 69 64 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e  id is set, but n
d800: 50 6f 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65  Pos and bDel are
d810: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   not..**.** This
d820: 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63   function advanc
d830: 65 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  es the iterator 
d840: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
d850: 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a  s to the last .*
d860: 2a 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64  * relevant rowid
d870: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
d880: 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
d890: 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
d8a0: 0a 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74  .** aRowidOffset
d8b0: 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66  [] and iRowidOff
d8c0: 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41  set variables. A
d8d0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
d8e0: 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   iterator.** is 
d8f0: 69 6e 20 69 74 73 20 72 65 67 75 6c 61 72 20 73  in its regular s
d900: 74 61 74 65 20 2d 20 46 74 73 35 53 65 67 49 74  tate - Fts5SegIt
d910: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
d920: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
d930: 73 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68  st.** byte of th
d940: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
d950: 63 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74  content associat
d960: 65 64 20 77 69 74 68 20 73 61 69 64 20 72 6f 77  ed with said row
d970: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  id..*/.static vo
d980: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
d990: 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 46 74  verseInitPage(Ft
d9a0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
d9b0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
d9c0: 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d  .  int eDetail =
d9d0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
d9e0: 74 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  tail;.  int n = 
d9f0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
da00: 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 20 3d 20  Leaf;.  int i = 
da10: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
da20: 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  et;.  u8 *a = pI
da30: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
da40: 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65   int iRowidOffse
da50: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e  t = 0;..  if( n>
da60: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
da70: 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20  list ){.    n = 
da80: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
da90: 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41 53 53  list;.  }..  ASS
daa0: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49  ERT_SZLEAF_OK(pI
dab0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77  ter->pLeaf);.  w
dac0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
dad0: 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 0a  64 iDelta = 0;..
dae0: 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d      if( eDetail=
daf0: 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
db00: 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f  E ){.      /* to
db10: 64 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  do */.      if( 
db20: 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29  i<n && a[i]==0 )
db30: 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  {.        i++;. 
db40: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26         if( i<n &
db50: 26 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b 2b 3b  & a[i]==0 ) i++;
db60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
db70: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50  se{.      int nP
db80: 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  os;.      int bD
db90: 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20 2b 3d  ummy;.      i +=
dba0: 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
dbb0: 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73  ize(&a[i], &nPos
dbc0: 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
dbd0: 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20    i += nPos;.   
dbe0: 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20   }.    if( i>=n 
dbf0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b  ) break;.    i +
dc00: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
dc10: 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44  &a[i], (u64*)&iD
dc20: 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72  elta);.    pIter
dc30: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
dc40: 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e  ta;..    /* If n
dc50: 65 63 65 73 73 61 72 79 2c 20 67 72 6f 77 20 74  ecessary, grow t
dc60: 68 65 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64  he pIter->aRowid
dc70: 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79 2e 20  Offset[] array. 
dc80: 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  */.    if( iRowi
dc90: 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e  dOffset>=pIter->
dca0: 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a  nRowidOffset ){.
dcb0: 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d        int nNew =
dcc0: 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66   pIter->nRowidOf
dcd0: 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20  fset + 8;.      
dce0: 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74  int *aNew = (int
dcf0: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
dd00: 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  c(pIter->aRowidO
dd10: 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a 65  ffset, nNew*size
dd20: 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
dd30: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
dd40: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
dd50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
dd60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dd70: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d    }.      pIter-
dd80: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20  >aRowidOffset = 
dd90: 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65  aNew;.      pIte
dda0: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
ddb0: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20  = nNew;.    }.. 
ddc0: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
ddd0: 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66  Offset[iRowidOff
dde0: 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e  set++] = pIter->
ddf0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
de00: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
de10: 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70  set = i;.  }.  p
de20: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
de30: 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65  et = iRowidOffse
de40: 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  t;.  fts5SegIter
de50: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
de60: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  r);.}../*.**.*/.
de70: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
de80: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
de90: 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20  wPage(Fts5Index 
dea0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
deb0: 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
dec0: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
ded0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
dee0: 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65  EVERSE );.  asse
def0: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
df00: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
df10: 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74  ONETERM );..  ft
df20: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
df30: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
df40: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
df50: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
df60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
df70: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70  ter->iLeafPgno>p
df80: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
df90: 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44  gno ){.    Fts5D
dfa0: 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ata *pNew;.    p
dfb0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
dfc0: 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74  -;.    pNew = ft
dfd0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
dfe0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
dff0: 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  (.          pIte
e000: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  r->pSeg->iSegid,
e010: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
e020: 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66  o.    ));.    if
e030: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
e040: 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  /* iTermLeafOffs
e050: 65 74 20 6d 61 79 20 62 65 20 65 71 75 61 6c 20  et may be equal 
e060: 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74 68 65  to szLeaf if the
e070: 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73   term is the las
e080: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e 67  t.      ** thing
e090: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d 20 69   on the page - i
e0a0: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 72 6f  .e. the first ro
e0b0: 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20 66 6f  wid is on the fo
e0c0: 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a 20 20  llowing page..  
e0d0: 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
e0e0: 61 73 65 20 6c 65 61 76 65 20 70 49 74 65 72 2d  ase leave pIter-
e0f0: 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69 73 20  >pLeaf==0, this 
e100: 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
e110: 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  OF. */.      if(
e120: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
e130: 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  o==pIter->iTermL
e140: 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
e150: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
e160: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  ->pLeaf==0 );.  
e170: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
e180: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
e190: 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 29 7b  <pNew->szLeaf ){
e1a0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e1b0: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
e1c0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e1d0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  >iLeafOffset = p
e1e0: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
e1f0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
e200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e210: 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
e220: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 52 6f  Off;.        iRo
e230: 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61  widOff = fts5Lea
e240: 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
e250: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
e260: 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20  ( iRowidOff ){. 
e270: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e280: 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20  pLeaf = pNew;.  
e290: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e2a0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52 6f  LeafOffset = iRo
e2b0: 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  widOff;.        
e2c0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e2d0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
e2e0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  f ){.        u8 
e2f0: 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65  *a = &pIter->pLe
e300: 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65  af->p[pIter->iLe
e310: 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20  afOffset];.     
e320: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e330: 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74  ffset += fts5Get
e340: 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29  Varint(a, (u64*)
e350: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
e360: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e370: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e380: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
e390: 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
e3a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e3b0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
e3c0: 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
e3d0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
e3e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
e3f0: 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  +1;.    fts5SegI
e400: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
e410: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
e420: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
e430: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
e440: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
e450: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e460: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a  ment currently.*
e470: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65  * points to a de
e480: 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20 64  lete marker. A d
e490: 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73 20  elete marker is 
e4a0: 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
e4b0: 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69  0 byte.** positi
e4c0: 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  on-list..*/.stat
e4d0: 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
e4e0: 49 74 65 72 49 73 45 6d 70 74 79 28 46 74 73 35  IterIsEmpty(Fts5
e4f0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74  Index *p, Fts5It
e500: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74  er *pIter){.  Ft
e510: 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
e520: 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  = &pIter->aSeg[p
e530: 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
e540: 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75 72  iFirst];.  retur
e550: 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
e560: 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c 65  _OK && pSeg->pLe
e570: 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73  af && pSeg->nPos
e580: 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ==0);.}../*.** A
e590: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
e5a0: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
e5b0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
e5c0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  his version of f
e5d0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29  ts5SegIterNext()
e5e0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
e5f0: 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f   reverse iterato
e600: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
e610: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
e620: 78 74 5f 52 65 76 65 72 73 65 28 0a 20 20 46 74  xt_Reverse(.  Ft
e630: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e650: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
e660: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
e670: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
e680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
e690: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
e6a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55 6e 75   */.  int *pbUnu
e6b0: 73 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  sed             
e6c0: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
e6d0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
e6e0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
e6f0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
e700: 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RSE );.  assert(
e710: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
e720: 66 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  f==0 );.  UNUSED
e730: 5f 50 41 52 41 4d 28 70 62 55 6e 75 73 65 64 29  _PARAM(pbUnused)
e740: 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
e750: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
e760: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49  {.    u8 *a = pI
e770: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
e780: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
e790: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
e7a0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
e7b0: 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49 74  ffset--;.    pIt
e7c0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
e7d0: 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  = pIter->aRowidO
e7e0: 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f  ffset[pIter->iRo
e7f0: 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  widOffset];.    
e800: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
e810: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
e820: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
e830: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
e840: 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
e850: 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f  ->eDetail!=FTS5_
e860: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
e870: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 49 74       iOff += pIt
e880: 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a  er->nPos;.    }.
e890: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
e8a0: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
e8b0: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
e8c0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d  pIter->iRowid -=
e8d0: 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65   iDelta;.  }else
e8e0: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
e8f0: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
e900: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
e910: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
e920: 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74  iterator pIter t
e930: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
e940: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ..**.** This ver
e950: 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49  sion of fts5SegI
e960: 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c  terNext() is onl
e970: 79 20 75 73 65 64 20 69 66 20 64 65 74 61 69 6c  y used if detail
e980: 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a 2a  =none and the.**
e990: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74   iterator is not
e9a0: 20 61 20 72 65 76 65 72 73 65 20 64 69 72 65 63   a reverse direc
e9b0: 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a 2a  tion iterator..*
e9c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
e9d0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f  s5SegIterNext_No
e9e0: 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ne(.  Fts5Index 
e9f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ea00: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
ea10: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
ea20: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
ea30: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
ea40: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
ea50: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
ea60: 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea80: 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65   OUT: Set for ne
ea90: 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69  w term */.){.  i
eaa0: 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  nt iOff;..  asse
eab0: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
eac0: 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
ead0: 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  ( (pIter->flags 
eae0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
eaf0: 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20 20  EVERSE)==0 );.  
eb00: 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
eb10: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
eb20: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
eb30: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
eb40: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
eb50: 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49 74  f);.  iOff = pIt
eb60: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
eb70: 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ..  /* Next entr
eb80: 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65 78 74  y is on the next
eb90: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
eba0: 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20 69 4f  Iter->pSeg && iO
ebb0: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
ebc0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
ebd0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
ebe0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
ebf0: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c 20     if( p->rc || 
ec00: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
ec10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 49  ) return;.    pI
ec20: 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b  ter->iRowid = 0;
ec30: 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20  .    iOff = 4;. 
ec40: 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70   }..  if( iOff<p
ec50: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
ec60: 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ist ){.    /* Ne
ec70: 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74  xt entry is on t
ec80: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
ec90: 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  */.    i64 iDelt
eca0: 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73  a;.    iOff += s
ecb0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
ecc0: 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  int(&pIter->pLea
ecd0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
ece0: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
ecf0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ed00: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 70  et = iOff;.    p
ed10: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
ed20: 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 20  iDelta;.  }else 
ed30: 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  if( (pIter->flag
ed40: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
ed50: 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29 7b 0a  _ONETERM)==0 ){.
ed60: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
ed70: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Seg ){.      int
ed80: 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
ed90: 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35    if( iOff!=fts5
eda0: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
edb0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 20 29  (pIter->pLeaf) )
edc0: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
edd0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
ede0: 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
edf0: 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  >p[iOff], nKeep)
ee00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ee10: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ee20: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
ee30: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
ee40: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e  Term(p, pIter, n
ee50: 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Keep);.    }else
ee60: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  {.      const u8
ee70: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
ee80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ee90: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
eea0: 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  int nList;.     
eeb0: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
eec0: 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73  ScanNext(p->pHas
eed0: 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
eee0: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
eef0: 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54  ry(p->pHash, &zT
ef00: 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
ef10: 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ist);.      if( 
ef20: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
ef30: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
ef40: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
ef50: 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73  f->p = (u8*)pLis
ef60: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
ef70: 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73  pLeaf->nn = nLis
ef80: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
ef90: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20  pLeaf->szLeaf = 
efa0: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74  nList;.      pIt
efb0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
efc0: 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  t = nList;.     
efd0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
efe0: 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26 70 49  erSet(&p->rc,&pI
eff0: 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29  ter->term, (int)
f000: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28  strlen(zTerm), (
f010: 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
f020: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
f030: 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
f040: 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34  rint(pList, (u64
f050: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
f060: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
f070: 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70  ( pbNewTerm ) *p
f080: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
f090: 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74 6f 20  }else{.    goto 
f0a0: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
f0b0: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
f0c0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
f0d0: 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b 0a  er);..  return;.
f0e0: 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a   next_none_eof:.
f0f0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f100: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f110: 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
f120: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
f130: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
f140: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
f150: 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
f160: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
f170: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
f180: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
f190: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
f1a0: 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20  code. It .** is 
f1b0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
f1c0: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
f1d0: 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
f1e0: 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  EOF. If an error
f1f0: 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
f200: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
f210: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
f220: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
f230: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
f240: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
f250: 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64  rNext(.  Fts5Ind
f260: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
f270: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
f280: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
f290: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
f2a0: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
f2b0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
f2c0: 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
f2d0: 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20   int *pbNewTerm 
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72   /* OUT: Set for
f300: 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a   new term */.){.
f310: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
f320: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
f330: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20  ;.  int iOff;.  
f340: 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
f350: 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20  ;.  int nKeep = 
f360: 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e  0;.  u8 *a;.  in
f370: 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t n;..  assert( 
f380: 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20  pbNewTerm==0 || 
f390: 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b  *pbNewTerm==0 );
f3a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
f3b0: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d  onfig->eDetail!=
f3c0: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
f3d0: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68   );..  /* Search
f3e0: 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
f3f0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
f400: 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  t within the cur
f410: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
f420: 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  a = pLeaf->p;.  
f430: 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  n = pLeaf->szLea
f440: 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c  f;..  ASSERT_SZL
f450: 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
f460: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
f470: 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49 74  LeafOffset + pIt
f480: 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66 28  er->nPos;..  if(
f490: 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 2f   iOff<n ){.    /
f4a0: 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79  * The next entry
f4b0: 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65   is on the curre
f4c0: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
f4d0: 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c  assert_nc( iOff<
f4e0: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
f4f0: 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69 66 28  clist );.    if(
f500: 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69 45   iOff>=pIter->iE
f510: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ndofDoclist ){. 
f520: 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20       bNewTerm = 
f530: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  1;.      if( iOf
f540: 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74  f!=fts5LeafFirst
f550: 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29  TermOff(pLeaf) )
f560: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
f570: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
f580: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
f590: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
f5a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 36 34  }else{.      u64
f5b0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
f5c0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
f5d0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
f5e0: 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a  Off], &iDelta);.
f5f0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
f600: 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  wid += iDelta;. 
f610: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
f620: 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20  iDelta>0 );.    
f630: 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  }.    pIter->iLe
f640: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
f650: 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ..  }else if( pI
f660: 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a  ter->pSeg==0 ){.
f670: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c      const u8 *pL
f680: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ist = 0;.    con
f690: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
f6a0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73   0;.    int nLis
f6b0: 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  t = 0;.    asser
f6c0: 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  t( (pIter->flags
f6d0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
f6e0: 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e 65  ONETERM) || pbNe
f6f0: 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28  wTerm );.    if(
f700: 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67   0==(pIter->flag
f710: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
f720: 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20  _ONETERM) ){.   
f730: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
f740: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48  shScanNext(p->pH
f750: 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ash);.      sqli
f760: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
f770: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
f780: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
f790: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nList);.    }.  
f7a0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f7b0: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
f7c0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
f7d0: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74  Leaf);.      pIt
f7e0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
f7f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f800: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20  pIter->pLeaf->p 
f810: 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20  = (u8*)pList;.  
f820: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
f830: 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  ->nn = nList;.  
f840: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
f850: 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74  ->szLeaf = nList
f860: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
f870: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e  EndofDoclist = n
f880: 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20 73 71  List+1;.      sq
f890: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
f8a0: 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
f8b0: 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74  r->term, (int)st
f8c0: 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20  rlen(zTerm),.   
f8d0: 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72         (u8*)zTer
f8e0: 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  m);.      pIter-
f8f0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
f900: 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69  ts5GetVarint(pLi
f910: 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  st, (u64*)&pIter
f920: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
f930: 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b   *pbNewTerm = 1;
f940: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
f950: 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20      iOff = 0;.  
f960: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
f970: 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
f980: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
f990: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30    while( iOff==0
f9a0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
f9b0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
f9c0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70   pIter);.      p
f9d0: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
f9e0: 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eaf;.      if( p
f9f0: 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
fa00: 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a  .      ASSERT_SZ
fa10: 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a  LEAF_OK(pLeaf);.
fa20: 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20        if( (iOff 
fa30: 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
fa40: 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20  owidOff(pLeaf)) 
fa50: 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73  && iOff<pLeaf->s
fa60: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
fa70: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
fa80: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
fa90: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Leaf->p[iOff], (
faa0: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
fab0: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49  wid);.        pI
fac0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
fad0: 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20   = iOff;..      
fae0: 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e    if( pLeaf->nn>
faf0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
fb00: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
fb10: 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c  ->iPgidxOff = pL
fb20: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74  eaf->szLeaf + ft
fb30: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20  s5GetVarint32(. 
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c               &pL
fb50: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
fb60: 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45  Leaf], pIter->iE
fb70: 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20  ndofDoclist.    
fb80: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
fb90: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7d 0a       }..      }.
fba0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70        else if( p
fbb0: 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e  Leaf->nn>pLeaf->
fbc0: 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
fbd0: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
fbe0: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
fbf0: 61 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69  af + fts5GetVari
fc00: 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20  nt32(.          
fc10: 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61    &pLeaf->p[pLea
fc20: 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66 66  f->szLeaf], iOff
fc30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
fc40: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
fc50: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
fc60: 66 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  f;.        pIter
fc70: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
fc80: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
fc90: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
fca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
fcb0: 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61  rt_nc( iOff<pLea
fcc0: 66 2d 3e 73 7a 4c 65 61 66 20 29 3b 0a 20 20 20  f->szLeaf );.   
fcd0: 20 20 20 69 66 28 20 69 4f 66 66 3e 70 4c 65 61     if( iOff>pLea
fce0: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
fcf0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
fd00: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
fd10: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
fd20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
fd30: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
fd40: 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20  iterator is now 
fd50: 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72  at EOF. If so, r
fd60: 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a  eturn early. */.
fd70: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
fd80: 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4e  af ){.    if( bN
fd90: 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  ewTerm ){.      
fda0: 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  if( pIter->flags
fdb0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
fdc0: 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20  ONETERM ){.     
fdd0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
fde0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
fdf0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
fe00: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
fe10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fe20: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
fe30: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e  Term(p, pIter, n
fe40: 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 66  Keep);.        f
fe50: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
fe60: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
fe70: 20 20 20 20 20 20 69 66 28 20 70 62 4e 65 77 54        if( pbNewT
fe80: 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d  erm ) *pbNewTerm
fe90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
fea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
feb0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
fec0: 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20 62 79  could be done by
fed0: 20 63 61 6c 6c 69 6e 67 20 66 74 73 35 53 65 67   calling fts5Seg
fee0: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 2e 20  IterLoadNPos(). 
fef0: 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  But.      ** thi
ff00: 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72 74 69  s block is parti
ff10: 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d 61  cularly performa
ff20: 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20 73 6f  nce critical, so
ff30: 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
ff40: 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e 6c    ** code is inl
ff50: 69 6e 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  ined. .      **.
ff60: 20 20 20 20 20 20 2a 2a 20 4c 61 74 65 72 3a 20        ** Later: 
ff70: 53 77 69 74 63 68 65 64 20 62 61 63 6b 20 74 6f  Switched back to
ff80: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
ff90: 4e 50 6f 73 28 29 20 62 65 63 61 75 73 65 20 69  NPos() because i
ffa0: 74 20 73 75 70 70 6f 72 74 73 0a 20 20 20 20 20  t supports.     
ffb0: 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20   ** detail=none 
ffc0: 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65 61 6c 2e  mode. Not ideal.
ffd0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ffe0: 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 61  int nSz;.      a
fff0: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
10000 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
10010 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
10020 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61  nt32(pIter->pLea
10030 66 2d 3e 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65  f->p, pIter->iLe
10040 61 66 4f 66 66 73 65 74 2c 20 6e 53 7a 29 3b 0a  afOffset, nSz);.
10050 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65        pIter->bDe
10060 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30  l = (nSz & 0x000
10070 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  1);.      pIter-
10080 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a  >nPos = nSz>>1;.
10090 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
100a0 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20   pIter->nPos>=0 
100b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
100c0 23 64 65 66 69 6e 65 20 53 57 41 50 56 41 4c 28  #define SWAPVAL(
100d0 54 2c 20 61 2c 20 62 29 20 7b 20 54 20 74 6d 70  T, a, b) { T tmp
100e0 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d  ; tmp=a; a=b; b=
100f0 74 6d 70 3b 20 7d 0a 0a 23 64 65 66 69 6e 65 20  tmp; }..#define 
10100 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72  fts5IndexSkipVar
10110 69 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b 20 20  int(a, iOff) {  
10120 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 6e            \.  in
10130 74 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b  t iEnd = iOff+9;
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
10160 20 20 77 68 69 6c 65 28 20 28 61 5b 69 4f 66 66    while( (a[iOff
10170 2b 2b 5d 20 26 20 30 78 38 30 29 20 26 26 20 69  ++] & 0x80) && i
10180 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20 20 20 20  Off<iEnd );     
10190 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    \.}../*.** Ite
101a0 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72  rator pIter curr
101b0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
101c0 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
101d0 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68  in a doclist. Th
101e0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  is.** function s
101f0 65 74 73 20 74 68 65 20 69 74 65 72 61 74 6f 72  ets the iterator
10200 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 65 72   up so that iter
10210 61 74 65 73 20 69 6e 20 72 65 76 65 72 73 65 20  ates in reverse 
10220 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a  order through.**
10230 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f   the doclist..*/
10240 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
10250 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
10260 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
10270 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
10280 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
10290 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74  er *pDlidx = pIt
102a0 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74  er->pDlidx;.  Ft
102b0 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20  s5Data *pLast = 
102c0 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73  0;.  int pgnoLas
102d0 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44  t = 0;..  if( pD
102e0 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  lidx ){.    int 
102f0 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e  iSegid = pIter->
10300 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
10310 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73    pgnoLast = fts
10320 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
10330 44 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73  Dlidx);.    pLas
10340 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
10350 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
10360 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 70  _ROWID(iSegid, p
10370 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c  gnoLast));.  }el
10380 73 65 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61  se{.    Fts5Data
10390 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d   *pLeaf = pIter-
103a0 3e 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  >pLeaf;         
103b0 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
103c0 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  data */..    /* 
103d0 43 75 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53  Currently, Fts5S
103e0 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
103f0 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  et points to the
10400 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 20   first byte of. 
10410 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c     ** position-l
10420 69 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  ist content for 
10430 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69  the current rowi
10440 64 2e 20 42 61 63 6b 20 69 74 20 75 70 20 73 6f  d. Back it up so
10450 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a 2a 20   that it.    ** 
10460 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74  points to the st
10470 61 72 74 20 6f 66 20 74 68 65 20 70 6f 73 69 74  art of the posit
10480 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
10490 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eld. */.    int 
104a0 69 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 69 66  iPoslist;.    if
104b0 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ( pIter->iTermLe
104c0 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
104d0 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
104e0 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 70 49 74    iPoslist = pIt
104f0 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
10500 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  set;.    }else{.
10510 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d        iPoslist =
10520 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74   4;.    }.    ft
10530 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e  s5IndexSkipVarin
10540 74 28 70 4c 65 61 66 2d 3e 70 2c 20 69 50 6f 73  t(pLeaf->p, iPos
10550 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72  list);.    pIter
10560 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
10570 69 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20 2f  iPoslist;..    /
10580 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 64 69 74  * If this condit
10590 69 6f 6e 20 69 73 20 74 72 75 65 20 74 68 65 6e  ion is true then
105a0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77   the largest row
105b0 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  id for the curre
105c0 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d  nt.    ** term m
105d0 61 79 20 6e 6f 74 20 62 65 20 73 74 6f 72 65 64  ay not be stored
105e0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
105f0 70 61 67 65 2e 20 53 6f 20 73 65 61 72 63 68 20  page. So search 
10600 66 6f 72 77 61 72 64 20 74 6f 0a 20 20 20 20 2a  forward to.    *
10610 2a 20 73 65 65 20 77 68 65 72 65 20 73 61 69 64  * see where said
10620 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 69 73   rowid really is
10630 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  .  */.    if( pI
10640 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
10650 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  st>=pLeaf->szLea
10660 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  f ){.      int p
10670 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73 35 53  gno;.      Fts5S
10680 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
10690 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70  *pSeg = pIter->p
106a0 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  Seg;..      /* T
106b0 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69 6e  he last rowid in
106c0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61 79   the doclist may
106d0 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20 63   not be on the c
106e0 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65 61  urrent page. Sea
106f0 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  rch.      ** for
10700 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68 65  ward to find the
10710 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   page containing
10720 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 2e   the last rowid.
10730 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70    */.      for(p
10740 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno=pIter->iLeaf
10750 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20 26  Pgno+1; !p->rc &
10760 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67  & pgno<=pSeg->pg
10770 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b  noLast; pgno++){
10780 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 41 62  .        i64 iAb
10790 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  s = FTS5_SEGMENT
107a0 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65  _ROWID(pSeg->iSe
107b0 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  gid, pgno);.    
107c0 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e      Fts5Data *pN
107d0 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
107e0 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20 20 20  d(p, iAbs);.    
107f0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
10800 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52            int iR
10810 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65 73 73 3b  owid, bTermless;
10820 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69  .          iRowi
10830 64 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  d = fts5LeafFirs
10840 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b  tRowidOff(pNew);
10850 0a 20 20 20 20 20 20 20 20 20 20 62 54 65 72 6d  .          bTerm
10860 6c 65 73 73 20 3d 20 66 74 73 35 4c 65 61 66 49  less = fts5LeafI
10870 73 54 65 72 6d 6c 65 73 73 28 70 4e 65 77 29 3b  sTermless(pNew);
10880 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
10890 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
108a0 20 20 20 20 20 53 57 41 50 56 41 4c 28 46 74 73       SWAPVAL(Fts
108b0 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c  5Data*, pNew, pL
108c0 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ast);.          
108d0 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e    pgnoLast = pgn
108e0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
108f0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
10900 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a  aRelease(pNew);.
10910 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62 54            if( bT
10920 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20 62 72 65  ermless==0 ) bre
10930 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
10940 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10950 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69  .  /* If pLast i
10960 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70  s NULL at this p
10970 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c  oint, then the l
10980 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68  ast rowid for th
10990 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20  is doclist.  ** 
109a0 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
109b0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63   currently indic
109c0 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
109d0 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ator. In this ca
109e0 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e  se .  ** pIter->
109f0 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73 20 61  iLeafOffset is a
10a00 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 70 6f  lready set to po
10a10 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74  int to the posit
10a20 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20  ion-list size.  
10a30 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63 69 61  ** field associa
10a40 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
10a50 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69  st relevant rowi
10a60 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  d on the page.. 
10a70 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20   **.  ** Or, if 
10a80 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  pLast is non-NUL
10a90 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  L, then it is th
10aa0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
10ab0 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20  ains the last.  
10ac0 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74 68 69  ** rowid. In thi
10ad0 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75 72 65  s case configure
10ae0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
10af0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
10b00 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  to the.  ** firs
10b10 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69 73 20  t rowid on this 
10b20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
10b30 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e   pLast ){.    in
10b40 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35  t iOff;.    fts5
10b50 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
10b60 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70  r->pLeaf);.    p
10b70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c  Iter->pLeaf = pL
10b80 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ast;.    pIter->
10b90 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f  iLeafPgno = pgno
10ba0 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66 66 20 3d  Last;.    iOff =
10bb0 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
10bc0 77 69 64 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20  widOff(pLast);. 
10bd0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
10be0 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74 2d  etVarint(&pLast-
10bf0 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
10c00 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
10c10 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
10c20 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
10c30 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61  .    if( fts5Lea
10c40 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 61 73  fIsTermless(pLas
10c50 74 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  t) ){.      pIte
10c60 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
10c70 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b 0a   = pLast->nn+1;.
10c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10c90 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
10ca0 63 6c 69 73 74 20 3d 20 66 74 73 35 4c 65 61 66  clist = fts5Leaf
10cb0 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 61  FirstTermOff(pLa
10cc0 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a  st);.    }..  }.
10cd0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65  .  fts5SegIterRe
10ce0 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
10cf0 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pIter);.}../*.*
10d00 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
10d10 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
10d20 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
10d30 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73  owid of a doclis
10d40 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  t..** There is a
10d50 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61   doclist-index a
10d60 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10d70 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e  he final term on
10d80 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a   the current .**
10d90 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 63 75   page. If the cu
10da0 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74 68  rrent term is th
10db0 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 74  e last term on t
10dc0 68 65 20 70 61 67 65 2c 20 6c 6f 61 64 20 74 68  he page, load th
10dd0 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e  e .** doclist-in
10de0 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e  dex from disk an
10df0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20  d initialize an 
10e00 69 74 65 72 61 74 6f 72 20 61 74 20 28 70 49 74  iterator at (pIt
10e10 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a  er->pDlidx)..*/.
10e20 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
10e30 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78  SegIterLoadDlidx
10e40 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
10e50 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
10e60 72 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 20 3d  r){.  int iSeg =
10e70 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
10e80 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76  egid;.  int bRev
10e90 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73   = (pIter->flags
10ea0 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
10eb0 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35  REVERSE);.  Fts5
10ec0 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
10ed0 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43  ter->pLeaf; /* C
10ee0 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61  urrent leaf data
10ef0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
10f00 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
10f10 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
10f20 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RM );.  assert( 
10f30 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30  pIter->pDlidx==0
10f40 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
10f50 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  if the current d
10f60 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74  oclist ends on t
10f70 68 69 73 20 70 61 67 65 2e 20 49 66 20 69 74 20  his page. If it 
10f80 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a  does, return.  *
10f90 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20  * early without 
10fa0 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c  loading the docl
10fb0 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74  ist-index (as it
10fc0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69   belongs to a di
10fd0 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72  fferent.  ** ter
10fe0 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65  m. */.  if( pIte
10ff0 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
11000 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ==pIter->iLeafPg
11010 6e 6f 20 0a 20 20 20 26 26 20 70 49 74 65 72 2d  no .   && pIter-
11020 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70  >iEndofDoclist<p
11030 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20  Leaf->szLeaf .  
11040 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
11050 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 6c   }..  pIter->pDl
11060 69 64 78 20 3d 20 66 74 73 35 44 6c 69 64 78 49  idx = fts5DlidxI
11070 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c  terInit(p, bRev,
11080 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e 69 54   iSeg, pIter->iT
11090 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a  ermLeafPgno);.}.
110a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  ./*.** The itera
110b0 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
110c0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
110d0 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74  argument current
110e0 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e  ly contains.** n
110f0 6f 20 76 61 6c 69 64 20 76 61 6c 75 65 73 20 65  o valid values e
11100 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 46 74  xcept for the Ft
11110 73 35 53 65 67 49 74 65 72 2e 70 4c 65 61 66 20  s5SegIter.pLeaf 
11120 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 2e  member variable.
11130 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
11140 6e 20 73 65 61 72 63 68 65 73 20 74 68 65 20 6c  n searches the l
11150 65 61 66 20 70 61 67 65 20 66 6f 72 20 61 20 74  eaf page for a t
11160 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 28 70 54  erm matching (pT
11170 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a 0a 2a  erm/nTerm)..**.*
11180 2a 20 49 66 20 74 68 65 20 73 70 65 63 69 66 69  * If the specifi
11190 65 64 20 74 65 72 6d 20 69 73 20 66 6f 75 6e 64  ed term is found
111a0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
111b0 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  en the iterator 
111c0 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74  is left.** point
111d0 69 6e 67 20 74 6f 20 69 74 2e 20 49 66 20 61 72  ing to it. If ar
111e0 67 75 6d 65 6e 74 20 62 47 65 20 69 73 20 7a 65  gument bGe is ze
111f0 72 6f 20 61 6e 64 20 74 68 65 20 74 65 72 6d 20  ro and the term 
11200 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a 2a 2a  is not found,.**
11210 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
11220 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
11230 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t EOF..**.** If 
11240 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  bGe is non-zero 
11250 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
11260 64 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f  d term is not fo
11270 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  und, then the.**
11280 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
11290 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
112a0 65 20 73 6d 61 6c 6c 65 73 74 20 74 65 72 6d 20  e smallest term 
112b0 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 74  in the segment t
112c0 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72  hat.** is larger
112d0 20 74 68 61 6e 20 74 68 65 20 73 70 65 63 69 66   than the specif
112e0 69 65 64 20 74 65 72 6d 2c 20 65 76 65 6e 20 69  ied term, even i
112f0 66 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 6e  f this term is n
11300 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72  ot on the.** cur
11310 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  rent page..*/.st
11320 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4c 65  atic void fts5Le
11330 61 66 53 65 65 6b 28 0a 20 20 46 74 73 35 49 6e  afSeek(.  Fts5In
11340 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
11350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
11360 76 65 20 61 6e 79 20 65 72 72 6f 72 20 63 6f 64  ve any error cod
11370 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
11380 62 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  bGe,            
11390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
113a0 72 75 65 20 66 6f 72 20 61 20 3e 3d 20 73 65 61  rue for a >= sea
113b0 72 63 68 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  rch */.  Fts5Seg
113c0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
113d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
113e0 61 74 6f 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a  ator to seek */.
113f0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
11400 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20  m, int nTerm    
11410 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 61    /* Term to sea
11420 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20  rch for */.){.  
11430 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63 6f 6e 73  int iOff;.  cons
11440 74 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d  t u8 *a = pIter-
11450 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74  >pLeaf->p;.  int
11460 20 73 7a 4c 65 61 66 20 3d 20 70 49 74 65 72 2d   szLeaf = pIter-
11470 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a  >pLeaf->szLeaf;.
11480 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d    int n = pIter-
11490 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 69  >pLeaf->nn;..  i
114a0 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 20  nt nMatch = 0;. 
114b0 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a   int nKeep = 0;.
114c0 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 0a    int nNew = 0;.
114d0 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a    int iTermOff;.
114e0 20 20 69 6e 74 20 69 50 67 69 64 78 3b 20 20 20    int iPgidx;   
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
11510 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a  set in pgidx */.
11520 20 20 69 6e 74 20 62 45 6e 64 4f 66 50 61 67 65    int bEndOfPage
11530 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
11540 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11550 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64 78 20 3d  K );..  iPgidx =
11560 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50 67 69 64   szLeaf;.  iPgid
11570 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  x += fts5GetVari
11580 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c  nt32(&a[iPgidx],
11590 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 69 4f   iTermOff);.  iO
115a0 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20  ff = iTermOff;. 
115b0 20 69 66 28 20 69 4f 66 66 3e 6e 20 29 7b 0a 20   if( iOff>n ){. 
115c0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
115d0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74  CORRUPT;.    ret
115e0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  urn;.  }..  whil
115f0 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
11600 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
11610 61 6e 79 20 6e 65 77 20 62 79 74 65 73 20 61 72  any new bytes ar
11620 65 20 69 6e 20 74 68 69 73 20 74 65 72 6d 20 2a  e in this term *
11630 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74 47 65  /.    fts5FastGe
11640 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66  tVarint32(a, iOf
11650 66 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66  f, nNew);.    if
11660 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29  ( nKeep<nMatch )
11670 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61  {.      goto sea
11680 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  rch_failed;.    
11690 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  }..    assert( n
116a0 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a  Keep>=nMatch );.
116b0 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3d 3d 6e      if( nKeep==n
116c0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 69  Match ){.      i
116d0 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 20 20 69  nt nCmp;.      i
116e0 6e 74 20 69 3b 0a 20 20 20 20 20 20 6e 43 6d 70  nt i;.      nCmp
116f0 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20 6e 54 65   = MIN(nNew, nTe
11700 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20 20 20  rm-nMatch);.    
11710 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6d    for(i=0; i<nCm
11720 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
11730 20 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d 21 3d   if( a[iOff+i]!=
11740 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20  pTerm[nMatch+i] 
11750 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
11760 0a 20 20 20 20 20 20 6e 4d 61 74 63 68 20 2b 3d  .      nMatch +=
11770 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e   i;..      if( n
11780 54 65 72 6d 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a  Term==nMatch ){.
11790 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e          if( i==n
117a0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
117b0 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 73 75 63   goto search_suc
117c0 63 65 73 73 3b 0a 20 20 20 20 20 20 20 20 7d 65  cess;.        }e
117d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
117e0 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65  oto search_faile
117f0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
11800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3c 6e     }else if( i<n
11810 4e 65 77 20 26 26 20 61 5b 69 4f 66 66 2b 69 5d  New && a[iOff+i]
11820 3e 70 54 65 72 6d 5b 6e 4d 61 74 63 68 5d 20 29  >pTerm[nMatch] )
11830 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
11840 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20  earch_failed;.  
11850 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11860 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29   if( iPgidx>=n )
11870 7b 0a 20 20 20 20 20 20 62 45 6e 64 4f 66 50 61  {.      bEndOfPa
11880 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  ge = 1;.      br
11890 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
118a0 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
118b0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
118c0 69 64 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  idx], nKeep);.  
118d0 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b    iTermOff += nK
118e0 65 65 70 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20  eep;.    iOff = 
118f0 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 2f  iTermOff;..    /
11900 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65 65 70  * Read the nKeep
11910 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65   field of the ne
11920 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  xt term. */.    
11930 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
11940 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4b 65  t32(a, iOff, nKe
11950 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  ep);.  }.. searc
11960 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  h_failed:.  if( 
11970 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  bGe==0 ){.    ft
11980 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
11990 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
119a0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
119b0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  0;.    return;. 
119c0 20 7d 65 6c 73 65 20 69 66 28 20 62 45 6e 64 4f   }else if( bEndO
119d0 66 50 61 67 65 20 29 7b 0a 20 20 20 20 64 6f 20  fPage ){.    do 
119e0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
119f0 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
11a00 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Iter);.      if(
11a10 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
11a20 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
11a30 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   a = pIter->pLea
11a40 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66 28 20  f->p;.      if( 
11a50 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
11a60 73 73 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ss(pIter->pLeaf)
11a70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
11a80 50 67 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Pgidx = pIter->p
11a90 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
11aa0 20 20 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20        iPgidx += 
11ab0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11ac0 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
11ad0 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66 66 29 3b  [iPgidx], iOff);
11ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
11af0 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70 49 74  f<4 || iOff>=pIt
11b00 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
11b10 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
11b20 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
11b30 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  UPT;.        }el
11b40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4b  se{.          nK
11b50 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eep = 0;.       
11b60 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 69 4f     iTermOff = iO
11b70 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20  ff;.          n 
11b80 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
11b90 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  nn;.          iO
11ba0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
11bb0 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
11bc0 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  nNew);.         
11bd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11be0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
11bf0 68 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a  hile( 1 );.  }..
11c00 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73 3a   search_success:
11c10 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ..  pIter->iLeaf
11c20 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20 2b 20  Offset = iOff + 
11c30 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69  nNew;.  pIter->i
11c40 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d  TermLeafOffset =
11c50 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
11c60 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54  set;.  pIter->iT
11c70 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49  ermLeafPgno = pI
11c80 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  ter->iLeafPgno;.
11c90 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74  .  fts5BufferSet
11ca0 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
11cb0 3e 74 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54  >term, nKeep, pT
11cc0 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66  erm);.  fts5Buff
11cd0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
11ce0 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
11cf0 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66  m, nNew, &a[iOff
11d00 5d 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 69 64  ]);..  if( iPgid
11d10 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  x>=n ){.    pIte
11d20 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
11d30 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
11d40 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >nn+1;.  }else{.
11d50 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a      int nExtra;.
11d60 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74      iPgidx += ft
11d70 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
11d80 5b 69 50 67 69 64 78 5d 2c 20 6e 45 78 74 72 61  [iPgidx], nExtra
11d90 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45  );.    pIter->iE
11da0 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 54  ndofDoclist = iT
11db0 65 72 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61 3b  ermOff + nExtra;
11dc0 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 50  .  }.  pIter->iP
11dd0 67 69 64 78 4f 66 66 20 3d 20 69 50 67 69 64 78  gidxOff = iPgidx
11de0 3b 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  ;..  fts5SegIter
11df0 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74  LoadRowid(p, pIt
11e00 65 72 29 3b 0a 20 20 66 74 73 35 53 65 67 49 74  er);.  fts5SegIt
11e10 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
11e20 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ter);.}../*.** I
11e30 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62  nitialize the ob
11e40 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f  ject pIter to po
11e50 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72  int to term pTer
11e60 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73  m/nTerm within s
11e70 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20  egment.** pSeg. 
11e80 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
11e90 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
11ea0 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72 61  index, the itera
11eb0 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f  tor is set to EO
11ec0 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  F..**.** If an e
11ed0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
11ee0 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
11ef0 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
11f00 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
11f10 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
11f20 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
11f30 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
11f40 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11f50 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
11f60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11f70 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
11f80 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
11f90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11fa0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
11fb0 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  ackend */.  cons
11fc0 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
11fd0 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
11fe0 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a  erm to seek to *
11ff0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
12020 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61  TS5INDEX_XXX fla
12030 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  gs */.  Fts5Stru
12040 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
12050 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  eg,     /* Descr
12060 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e  iption of segmen
12070 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
12080 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
12090 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
120a0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
120b0 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20 31  ){.  int iPg = 1
120c0 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28 66  ;.  int bGe = (f
120d0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
120e0 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20  _QUERY_SCAN);.  
120f0 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b 20  int bDlidx = 0; 
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12110 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
12120 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
12130 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dex */..  assert
12140 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61  ( bGe==0 || (fla
12150 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
12160 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b  UERY_DESC)==0 );
12170 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d  .  assert( pTerm
12180 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d   && nTerm );.  m
12190 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
121a0 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
121b0 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d  .  pIter->pSeg =
121c0 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54 68 69   pSeg;..  /* Thi
121d0 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74 61  s block sets sta
121e0 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67 20  ck variable iPg 
121f0 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  to the leaf page
12200 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 79   number that may
12210 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65  .  ** contain te
12220 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  rm (pTerm/nTerm)
12230 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
12240 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  nt in the segmen
12250 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
12260 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  IdxSelect==0 ){.
12270 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
12280 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
12290 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e  nfig;.    fts5In
122a0 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
122b0 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  , &p->pIdxSelect
122c0 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
122d0 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  f(.          "SE
122e0 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 27  LECT pgno FROM '
122f0 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45  %q'.'%q_idx' WHE
12300 52 45 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  RE ".          "
12310 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65 72 6d  segid=? AND term
12320 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74 65 72  <=? ORDER BY ter
12330 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c  m DESC LIMIT 1",
12340 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
12350 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
12360 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
12370 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 20    }.  if( p->rc 
12380 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
12390 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
123a0 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20 70  pIdxSelect, 1, p
123b0 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20  Seg->iSegid);.  
123c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
123d0 62 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c  b(p->pIdxSelect,
123e0 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d   2, pTerm, nTerm
123f0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12400 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52  ;.  if( SQLITE_R
12410 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
12420 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 20  (p->pIdxSelect) 
12430 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 20 3d  ){.    i64 val =
12440 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
12450 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  int(p->pIdxSelec
12460 74 2c 20 30 29 3b 0a 20 20 20 20 69 50 67 20 3d  t, 0);.    iPg =
12470 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29 3b 0a   (int)(val>>1);.
12480 20 20 20 20 62 44 6c 69 64 78 20 3d 20 28 76 61      bDlidx = (va
12490 6c 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 7d  l & 0x0001);.  }
124a0 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
124b0 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78  e3_reset(p->pIdx
124c0 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66 28 20  Select);..  if( 
124d0 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  iPg<pSeg->pgnoFi
124e0 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d  rst ){.    iPg =
124f0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
12500 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30  ;.    bDlidx = 0
12510 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  ;.  }..  pIter->
12520 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20  iLeafPgno = iPg 
12530 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74  - 1;.  fts5SegIt
12540 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
12550 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74  ter);..  if( pIt
12560 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
12570 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70 2c   fts5LeafSeek(p,
12580 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54 65   bGe, pIter, pTe
12590 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a  rm, nTerm);.  }.
125a0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
125b0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d  LITE_OK && bGe==
125c0 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  0 ){.    pIter->
125d0 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
125e0 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
125f0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
12600 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28  eaf ){.      if(
12610 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
12620 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
12630 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
12640 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
12650 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
12660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12670 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20   bDlidx ){.     
12680 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
12690 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65 72  adDlidx(p, pIter
126a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
126b0 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
126c0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
126d0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  C ){.        fts
126e0 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
126f0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
12700 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12710 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
12720 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  xt(p, pIter);.. 
12730 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a   /* Either:.  **
12740 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72  .  **   1) an er
12750 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
12760 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74  , or.  **   2) t
12770 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
12780 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20  ts to EOF, or.  
12790 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72  **   3) the iter
127a0 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ator points to a
127b0 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72  n entry with ter
127c0 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
127d0 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68   or.  **   4) th
127e0 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
127f0 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20  Y_SCAN flag was 
12800 73 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72  set and the iter
12810 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  ator points.  **
12820 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72        to an entr
12830 79 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72  y with a term gr
12840 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
12850 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54  ual to (pTerm/nT
12860 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  erm)..  */.  ass
12870 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
12880 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  TE_OK           
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
128b0 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74  * 1 */.   || pIt
128c0 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20  er->pLeaf==0    
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20             /* 2 
12900 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66  */.   || fts5Buf
12910 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
12920 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
12930 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20  rm, nTerm)==0   
12940 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20         /* 3 */. 
12950 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73    || (bGe && fts
12960 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
12970 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
12980 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30   pTerm, nTerm)>0
12990 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a  )  /* 4 */.  );.
129a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
129b0 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
129c0 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
129d0 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
129e0 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
129f0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
12a00 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  able. If there i
12a10 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
12a20 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
12a30 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
12a40 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
12a50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
12a60 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
12a70 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
12a80 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
12a90 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
12aa0 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
12ab0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
12ac0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
12ad0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
12ae0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
12af0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12b00 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
12b10 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
12b20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12b30 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
12b40 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ckend */.  const
12b50 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
12b60 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
12b70 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
12b80 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ba0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
12bb0 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
12bc0 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
12bd0 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
12be0 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
12bf0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
12c00 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  ){.  const u8 *p
12c10 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  List = 0;.  int 
12c20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  nList = 0;.  con
12c30 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20  st u8 *z = 0;.  
12c40 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73  int n = 0;..  as
12c50 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29  sert( p->pHash )
12c60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
12c70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
12c80 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
12c90 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
12ca0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
12cb0 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
12cc0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
12cd0 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73  ScanInit(p->pHas
12ce0 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
12cf0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
12d00 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
12d10 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
12d20 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
12d30 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
12d40 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
12d50 20 28 7a 20 3f 20 28 69 6e 74 29 73 74 72 6c 65   (z ? (int)strle
12d60 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  n((const char*)z
12d70 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ) : 0);.  }else{
12d80 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
12d90 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
12da0 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73  R_ONETERM;.    s
12db0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75  qlite3Fts5HashQu
12dc0 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63  ery(p->pHash, (c
12dd0 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d  onst char*)pTerm
12de0 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c  , nTerm, &pList,
12df0 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20   &nList);.    z 
12e00 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d  = pTerm;.    n =
12e10 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69   nTerm;.  }..  i
12e20 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
12e30 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
12e40 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
12e50 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
12e60 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
12e70 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66  n, z);.    pLeaf
12e80 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63   = fts5IdxMalloc
12e90 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
12ea0 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ata));.    if( p
12eb0 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
12ec0 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d  ;.    pLeaf->p =
12ed0 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
12ee0 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65   pLeaf->nn = pLe
12ef0 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
12f00 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  st;.    pIter->p
12f10 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20  Leaf = pLeaf;.  
12f20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
12f30 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
12f40 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28  rint(pLeaf->p, (
12f50 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
12f60 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  wid);.    pIter-
12f70 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
12f80 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 20   pLeaf->nn;..   
12f90 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
12fa0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
12fb0 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  C ){.      pIter
12fc0 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
12fd0 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b  SEGITER_REVERSE;
12fe0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
12ff0 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
13000 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
13010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
13020 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
13030 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
13040 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65   }.  }..  fts5Se
13050 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
13060 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
13070 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61 74   Zero the iterat
13080 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
13090 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
130a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
130b0 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
130c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
130d0 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  er){.  fts5Buffe
130e0 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65  rFree(&pIter->te
130f0 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52  rm);.  fts5DataR
13100 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
13110 65 61 66 29 3b 0a 20 20 66 74 73 35 44 61 74 61  eaf);.  fts5Data
13120 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
13130 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 66 74 73  NextLeaf);.  fts
13140 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
13150 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20  Iter->pDlidx);. 
13160 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
13170 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
13180 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  t);.  memset(pIt
13190 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
131a0 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a  s5SegIter));.}..
131b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
131c0 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BUG../*.** This 
131d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
131e0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
131f0 62 69 67 20 61 73 73 65 72 74 28 29 20 70 72 6f  big assert() pro
13200 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74  cedure implement
13210 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41 73 73  ed by.** fts5Ass
13220 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
13230 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65 73 20  p(). It ensures 
13240 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
13250 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
13260 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69 73 20  .** in *pRes is 
13270 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
13280 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
13290 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
132a0 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tions of the.** 
132b0 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  two iterators..*
132c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
132d0 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73  s5AssertComparis
132e0 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74 73 35  onResult(.  Fts5
132f0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
13300 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 2c  Fts5SegIter *p1,
13310 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
13320 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73 75 6c  p2,.  Fts5CResul
13330 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74  t *pRes.){.  int
13340 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74 65 72   i1 = p1 - pIter
13350 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20 69 32  ->aSeg;.  int i2
13360 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d 3e 61   = p2 - pIter->a
13370 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e  Seg;..  if( p1->
13380 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65  pLeaf || p2->pLe
13390 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31  af ){.    if( p1
133a0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
133b0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
133c0 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
133d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32      }else if( p2
133e0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
133f0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
13400 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a  ->iFirst==i1 );.
13410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13420 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28   int nMin = MIN(
13430 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e  p1->term.n, p2->
13440 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69  term.n);.      i
13450 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
13460 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e  p1->term.p, p2->
13470 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20  term.p, nMin);. 
13480 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
13490 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d  ) res = p1->term
134a0 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b  .n - p2->term.n;
134b0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ..      if( res=
134c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
134d0 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
134e0 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  mEq==1 );.      
134f0 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e 69 52    assert( p1->iR
13500 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64  owid!=p2->iRowid
13510 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20   );.        res 
13520 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e  = ((p1->iRowid >
13530 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49   p2->iRowid)==pI
13540 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20  ter->bRev) ? -1 
13550 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : 1;.      }else
13560 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
13570 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
13580 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
13590 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
135a0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
135b0 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d  ( pRes->iFirst==
135c0 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  i1 );.      }els
135d0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
135e0 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
135f0 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  =i2 );.      }. 
13600 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13610 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13620 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
13630 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  s SQLITE_DEBUG i
13640 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74  s defined when t
13650 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73  his module.** is
13660 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68   compiled. In th
13670 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 66 75  at case, this fu
13680 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65 6e 74  nction is essent
13690 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72 74 28  ially an assert(
136a0 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ) .** statement 
136b0 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  used to verify t
136c0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
136d0 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
136e0 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a  First[] array.**
136f0 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f   are correct..*/
13700 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
13710 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
13720 53 65 74 75 70 28 46 74 73 35 49 6e 64 65 78 20  Setup(Fts5Index 
13730 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
13740 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
13750 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13760 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13770 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74 65 72  *pFirst = &pIter
13780 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
13790 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
137a0 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ];.    int i;.. 
137b0 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
137c0 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70  st->pLeaf==0)==p
137d0 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20  Iter->base.bEof 
137e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
137f0 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69 53 77   that pIter->iSw
13800 69 74 63 68 52 6f 77 69 64 20 69 73 20 73 65 74  itchRowid is set
13810 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
13820 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
13830 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
13840 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13850 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13860 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20  >aSeg[i];.      
13870 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46 69 72  assert( p1==pFir
13880 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  st .           |
13890 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a  | p1->pLeaf==0 .
138a0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 74             || ft
138b0 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
138c0 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26  &pFirst->term, &
138d0 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20 20  p1->term) .     
138e0 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f        || p1->iRo
138f0 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69  wid==pIter->iSwi
13900 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20 20 20  tchRowid.       
13910 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77      || (p1->iRow
13920 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63  id<pIter->iSwitc
13930 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  hRowid)==pIter->
13940 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a 20 20  bRev.      );.  
13950 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
13960 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
13970 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74   i+=2){.      Ft
13980 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
13990 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
139a0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
139b0 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d  er *p2 = &pIter-
139c0 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20  >aSeg[i+1];.    
139d0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
139e0 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
139f0 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65  irst[(pIter->nSe
13a00 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20  g + i) / 2];.   
13a10 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d     fts5AssertCom
13a20 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49  parisonResult(pI
13a30 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65  ter, p1, p2, pRe
13a40 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  s);.    }..    f
13a50 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74 65 72  or(i=1; i<(pIter
13a60 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d  ->nSeg / 2); i+=
13a70 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
13a80 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
13a90 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13aa0 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69  >aFirst[i*2].iFi
13ab0 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73  rst ];.      Fts
13ac0 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26  5SegIter *p2 = &
13ad0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
13ae0 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31  er->aFirst[i*2+1
13af0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
13b00 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
13b10 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
13b20 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66  irst[i];.      f
13b30 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
13b40 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
13b50 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
13b60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
13b70 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 41  e.# define fts5A
13b80 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
13b90 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  tup(x,y).#endif.
13ba0 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f  ./*.** Do the co
13bb0 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61  mparison necessa
13bc0 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70  ry to populate p
13bd0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
13be0 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  t]..**.** If the
13bf0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
13c00 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
13c10 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65  n it is the inde
13c20 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  x of an entry.**
13c30 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
13c40 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74  Seg[] array that
13c50 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45   is (a) not at E
13c60 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e  OF, and (b) poin
13c70 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79  ting.** to a key
13c80 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69   that is a dupli
13c90 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c  cate of another,
13ca0 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79   higher priority
13cb0 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74  , .** segment-it
13cc0 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53  erator in the pS
13cd0 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  eg->aSeg[] array
13ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13cf0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
13d00 6f 6d 70 61 72 65 28 46 74 73 35 49 74 65 72 20  ompare(Fts5Iter 
13d10 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74  *pIter, int iOut
13d20 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20  ){.  int i1;    
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d40 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13d50 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   left-hand Fts5S
13d60 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
13d70 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i2;             
13d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13d90 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61  ndex of right-ha
13da0 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
13db0 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20  /.  int iRes;.  
13dc0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b  Fts5SegIter *p1;
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73  /* Left-hand Fts
13df0 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
13e00 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20  s5SegIter *p2;  
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13e20 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   Right-hand Fts5
13e30 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73  SegIter */.  Fts
13e40 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
13e50 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
13e60 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iOut];..  assert
13e70 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53  ( iOut<pIter->nS
13e80 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a  eg && iOut>0 );.
13e90 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
13ea0 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65  >bRev==0 || pIte
13eb0 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20  r->bRev==1 );.. 
13ec0 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65   if( iOut>=(pIte
13ed0 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20  r->nSeg/2) ){.  
13ee0 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70    i1 = (iOut - p
13ef0 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20  Iter->nSeg/2) * 
13f00 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b  2;.    i2 = i1 +
13f10 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
13f20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69   i1 = pIter->aFi
13f30 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72  rst[iOut*2].iFir
13f40 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74  st;.    i2 = pIt
13f50 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
13f60 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d  2+1].iFirst;.  }
13f70 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  .  p1 = &pIter->
13f80 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d  aSeg[i1];.  p2 =
13f90 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32   &pIter->aSeg[i2
13fa0 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72  ];..  pRes->bTer
13fb0 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  mEq = 0;.  if( p
13fc0 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  1->pLeaf==0 ){  
13fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
13fe0 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  1 is at EOF */. 
13ff0 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
14000 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
14010 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a  eaf==0 ){     /*
14020 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f 46   If p2 is at EOF
14030 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
14040 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
14050 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42 75  int res = fts5Bu
14060 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d  fferCompare(&p1-
14070 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d  >term, &p2->term
14080 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  );.    if( res==
14090 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
140a0 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20  t( i2>i1 );.    
140b0 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30 20    assert( i2!=0 
140c0 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62  );.      pRes->b
140d0 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20  TermEq = 1;.    
140e0 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64    if( p1->iRowid
140f0 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ==p2->iRowid ){.
14100 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c          p1->bDel
14110 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20   = p2->bDel;.   
14120 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a       return i2;.
14130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
14140 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
14150 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
14160 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
14170 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  1 : +1;.    }.  
14180 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30    assert( res!=0
14190 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c   );.    if( res<
141a0 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20  0 ){.      iRes 
141b0 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = i1;.    }else{
141c0 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 32  .      iRes = i2
141d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
141e0 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75  Res->iFirst = (u
141f0 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74 75 72  16)iRes;.  retur
14200 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  n 0;.}../*.** Mo
14210 76 65 20 74 68 65 20 73 65 67 2d 69 74 65 72 20  ve the seg-iter 
14220 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
14230 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
14240 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c 65  owid on page iLe
14250 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73  afPgno..** It is
14260 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65 61   an error if lea
14270 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73  f iLeafPgno does
14280 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
14290 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73  ntains no rowids
142a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
142b0 20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f   fts5SegIterGoto
142c0 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
142d0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
142e0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
142f0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
14300 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
14310 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
14320 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
14330 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
14340 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b  int iLeafPgno.){
14350 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66  .  assert( iLeaf
14360 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
14370 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20  fPgno );..  if( 
14380 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
14390 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  >pSeg->pgnoLast 
143a0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
143b0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  TS5_CORRUPT;.  }
143c0 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44 61  else{.    fts5Da
143d0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
143e0 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20  >pNextLeaf);.   
143f0 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
14400 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72  f = 0;.    pIter
14410 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c  ->iLeafPgno = iL
14420 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66  eafPgno-1;.    f
14430 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
14440 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
14450 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
14460 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49  =SQLITE_OK || pI
14470 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d  ter->iLeafPgno==
14480 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
14490 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
144a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
144b0 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
144c0 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
144d0 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
144e0 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
144f0 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20  eaf->szLeaf;..  
14500 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c      iOff = fts5L
14510 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
14520 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
14530 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34        if( iOff<4
14540 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20   || iOff>=n ){. 
14550 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
14560 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
14570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14580 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
14590 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
145a0 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
145b0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
145c0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
145d0 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
145e0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
145f0 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
14600 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14610 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
14620 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
14630 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
14640 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14650 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20   until it is at 
14660 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69  or .** past rowi
14670 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c  d iFrom. Regardl
14680 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
14690 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69   of iFrom, the i
146a0 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c  terator is.** al
146b0 77 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74  ways advanced at
146c0 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a   least once..*/.
146d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
146e0 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
146f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
14720 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
14730 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
14740 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
14750 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
14760 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69  vance */.  i64 i
14770 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20  Match           
14780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
14790 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61  vance iterator a
147a0 74 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72  t least this far
147b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65   */.){.  int bRe
147c0 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  v = (pIter->flag
147d0 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
147e0 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73  _REVERSE);.  Fts
147f0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
14800 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69  dx = pIter->pDli
14810 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50  dx;.  int iLeafP
14820 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
14830 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d  afPgno;.  int bM
14840 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  ove = 1;..  asse
14850 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
14860 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
14870 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
14880 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
14890 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dx );.  assert( 
148a0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a  pIter->pLeaf );.
148b0 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29  .  if( bRev==0 )
148c0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74  {.    while( !ft
148d0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
148e0 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61  , pDlidx) && iMa
148f0 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65  tch>fts5DlidxIte
14900 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
14910 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e  {.      iLeafPgn
14920 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
14930 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
14940 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
14950 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78  erNext(p, pDlidx
14960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
14970 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e  ert_nc( iLeafPgn
14980 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o>=pIter->iLeafP
14990 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a  gno || p->rc );.
149a0 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
149b0 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o>pIter->iLeafPg
149c0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  no ){.      fts5
149d0 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28  SegIterGotoPage(
149e0 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50  p, pIter, iLeafP
149f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76  gno);.      bMov
14a00 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
14a10 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
14a20 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
14a30 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  af==0 );.    ass
14a40 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65  ert( iMatch<pIte
14a50 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  r->iRowid );.   
14a60 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69   while( !fts5Dli
14a70 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
14a80 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66  idx) && iMatch<f
14a90 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
14aa0 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20  d(pDlidx) ){.   
14ab0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
14ac0 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b  Prev(p, pDlidx);
14ad0 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66  .    }.    iLeaf
14ae0 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  Pgno = fts5Dlidx
14af0 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
14b00 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  ;..    assert( f
14b10 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
14b20 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c  p, pDlidx) || iL
14b30 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e  eafPgno<=pIter->
14b40 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
14b50 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c    if( iLeafPgno<
14b60 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14b70 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
14b80 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
14b90 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20  afPgno+1;.      
14ba0 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
14bb0 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
14bc0 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  er);.      bMove
14bd0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
14be0 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 62  .  do{.    if( b
14bf0 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53  Move && p->rc==S
14c00 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49 74 65 72  QLITE_OK ) pIter
14c10 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49 74 65 72  ->xNext(p, pIter
14c20 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49  , 0);.    if( pI
14c30 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  ter->pLeaf==0 ) 
14c40 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
14c50 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d  Rev==0 && pIter-
14c60 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20  >iRowid>=iMatch 
14c70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
14c80 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74 65   bRev!=0 && pIte
14c90 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63  r->iRowid<=iMatc
14ca0 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62  h ) break;.    b
14cb0 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69  Move = 1;.  }whi
14cc0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
14cd0 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  E_OK );.}.../*.*
14ce0 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72 61  * Free the itera
14cf0 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
14d00 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
14d10 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
14d20 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
14d30 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35 49  tiIterFree(Fts5I
14d40 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
14d50 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
14d60 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
14d70 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
14d80 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  g; i++){.      f
14d90 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
14da0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29  &pIter->aSeg[i])
14db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
14dc0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
14dd0 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29  (pIter->pStruct)
14de0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
14df0 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73  Free(&pIter->pos
14e00 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
14e10 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
14e20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
14e30 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
14e40 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35  Advanced(.  Fts5
14e50 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
14e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14e70 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
14e80 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
14e90 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
14ea0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
14eb0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
14ec0 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
14ed0 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
14ee0 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20   int iChanged,  
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
14f10 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
14f20 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  dvanced */.  int
14f30 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20   iMinset        
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f50 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e  Minimum entry in
14f60 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74   aFirst[] to set
14f70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
14f80 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e    for(i=(pIter->
14f90 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32  nSeg+iChanged)/2
14fa0 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20  ; i>=iMinset && 
14fb0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14fc0 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e  ; i=i/2){.    in
14fd0 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28  t iEq;.    if( (
14fe0 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  iEq = fts5MultiI
14ff0 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74  terDoCompare(pIt
15000 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20  er, i)) ){.     
15010 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
15020 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
15030 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 61 73  g[iEq];.      as
15040 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
15050 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
15060 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70  pSeg->xNext(p, p
15070 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Seg, 0);.      i
15080 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b   = pIter->nSeg +
15090 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iEq;.    }.  }.
150a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65  }../*.** Sub-ite
150b0 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64 20 6f  rator iChanged o
150c0 66 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  f iterator pIter
150d0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
150e0 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74 69 6c  dvanced. It stil
150f0 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  l.** points to t
15100 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74 68 6f  he same term tho
15110 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64 69 66  ugh - just a dif
15120 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20 54 68  ferent rowid. Th
15130 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
15140 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64 61 74  ttempts to updat
15150 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
15160 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69  f the pIter->aFi
15170 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c  rst[] accordingl
15180 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  y..** If it does
15190 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79   so successfully
151a0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
151b0 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a   Otherwise 1..**
151c0 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  .** If non-zero 
151d0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
151e0 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63   caller should c
151f0 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  all fts5MultiIte
15200 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f  rAdvanced().** o
15210 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  n the iterator i
15220 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66 75 6e  nstead. That fun
15230 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73  ction does the s
15240 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e 65 2c  ame as this one,
15250 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
15260 69 74 20 64 65 61 6c 73 20 77 69 74 68 20 6d 6f  it deals with mo
15270 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 63  re complicated c
15280 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ases as well..*/
15290 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73   .static int fts
152a0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
152b0 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 74  eRowid(.  Fts5It
152c0 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
152d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
152e0 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20  rator to update 
152f0 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66  aFirst[] array f
15300 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61  or */.  int iCha
15310 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  nged,           
15320 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15330 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72   of sub-iterator
15340 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a   just advanced *
15350 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
15360 2a 2a 70 70 46 69 72 73 74 0a 29 7b 0a 20 20 46  **ppFirst.){.  F
15370 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77  ts5SegIter *pNew
15380 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
15390 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66  iChanged];..  if
153a0 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
153b0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
153c0 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d  wid.   || (pNew-
153d0 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69  >iRowid<pIter->i
153e0 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49  SwitchRowid)==pI
153f0 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20  ter->bRev.  ){. 
15400 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74     int i;.    Ft
15410 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65  s5SegIter *pOthe
15420 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
15430 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30  [iChanged ^ 0x00
15440 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  01];.    pIter->
15450 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15460 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41  Iter->bRev ? SMA
15470 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41  LLEST_INT64 : LA
15480 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20  RGEST_INT64;.   
15490 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
154a0 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
154b0 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20   1; i=i/2){.    
154c0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
154d0 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
154e0 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20  irst[i];..      
154f0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c  assert( pNew->pL
15500 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eaf );.      ass
15510 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d  ert( pRes->bTerm
15520 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d  Eq==0 || pOther-
15530 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20  >pLeaf );..     
15540 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d   if( pRes->bTerm
15550 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Eq ){.        if
15560 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
15570 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29  pOther->iRowid )
15580 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
15590 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  rn 1;.        }e
155a0 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
155b0 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52  >iRowid>pNew->iR
155c0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
155d0 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
155e0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
155f0 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
15600 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
15610 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20  pNew = pOther;. 
15620 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
15630 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
15640 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  >pIter->iSwitchR
15650 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
15660 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
15670 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
15680 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
15690 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
156a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
156b0 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31  es->iFirst = (u1
156c0 36 29 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d  6)(pNew - pIter-
156d0 3e 61 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66  >aSeg);.      if
156e0 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a  ( i==1 ) break;.
156f0 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20  .      pOther = 
15700 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
15710 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20  ter->aFirst[i ^ 
15720 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74 20 5d  0x0001].iFirst ]
15730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
15740 70 70 46 69 72 73 74 20 3d 20 70 4e 65 77 3b 0a  ppFirst = pNew;.
15750 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
15760 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 49 74  *.** Set the pIt
15770 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61 62 6c  er->bEof variabl
15780 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  e based on the s
15790 74 61 74 65 20 6f 66 20 74 68 65 20 73 75 62 2d  tate of the sub-
157a0 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
157b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
157c0 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 46 74  ltiIterSetEof(Ft
157d0 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
157e0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
157f0 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
15800 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
15810 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
15820 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f   pIter->base.bEo
15830 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  f = pSeg->pLeaf=
15840 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69 53 77  =0;.  pIter->iSw
15850 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53 65 67  itchRowid = pSeg
15860 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  ->iRowid;.}../*.
15870 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
15880 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
15890 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49   entry. .**.** I
158a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
158b0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
158c0 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35   is left in Fts5
158d0 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73 20  Index.rc. It is 
158e0 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  not .** consider
158f0 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
15900 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
15910 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20 69  hes EOF, or if i
15920 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  t is already at 
15930 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68 69  .** EOF when thi
15940 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15950 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
15960 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
15970 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e  erNext(.  Fts5In
15980 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
15990 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e  ter *pIter,.  in
159a0 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t bFrom,        
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
159c0 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e   True if argumen
159d0 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64  t iFrom is valid
159e0 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20   */.  i64 iFrom 
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a00 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
15a10 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72   at least as far
15a20 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20   as this */.){. 
15a30 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d 20   int bUseFrom = 
15a40 62 46 72 6f 6d 3b 0a 20 20 77 68 69 6c 65 28 20  bFrom;.  while( 
15a50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15a60 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 69 72   ){.    int iFir
15a70 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  st = pIter->aFir
15a80 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  st[1].iFirst;.  
15a90 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
15aa0 20 30 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49   0;.    Fts5SegI
15ab0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
15ac0 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d  er->aSeg[iFirst]
15ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15ae0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15af0 3b 0a 20 20 20 20 69 66 28 20 62 55 73 65 46 72  ;.    if( bUseFr
15b00 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69  om && pSeg->pDli
15b10 64 78 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  dx ){.      fts5
15b20 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
15b30 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b  p, pSeg, iFrom);
15b40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15b50 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c    pSeg->xNext(p,
15b60 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d   pSeg, &bNewTerm
15b70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
15b80 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
15b90 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20   || bNewTerm .  
15ba0 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49     || fts5MultiI
15bb0 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
15bc0 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 26  pIter, iFirst, &
15bd0 70 53 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20  pSeg).    ){.   
15be0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
15bf0 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65  Advanced(p, pIte
15c00 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20  r, iFirst, 1);. 
15c10 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
15c20 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b  erSetEof(pIter);
15c30 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70  .      pSeg = &p
15c40 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
15c50 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
15c60 73 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st];.      if( p
15c70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  Seg->pLeaf==0 ) 
15c80 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
15c90 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c     fts5AssertMul
15ca0 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70  tiIterSetup(p, p
15cb0 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Iter);.    asser
15cc0 74 28 20 70 53 65 67 3d 3d 26 70 49 74 65 72 2d  t( pSeg==&pIter-
15cd0 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69  >aSeg[pIter->aFi
15ce0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 20 26  rst[1].iFirst] &
15cf0 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 3b  & pSeg->pLeaf );
15d00 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
15d10 62 53 6b 69 70 45 6d 70 74 79 3d 3d 30 20 7c 7c  bSkipEmpty==0 ||
15d20 20 70 53 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20   pSeg->nPos ){. 
15d30 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
15d40 4f 75 74 70 75 74 73 28 70 49 74 65 72 2c 20 70  Outputs(pIter, p
15d50 53 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Seg);.      retu
15d60 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 55  rn;.    }.    bU
15d70 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 7d 0a  seFrom = 0;.  }.
15d80 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
15d90 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
15da0 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  2(.  Fts5Index *
15db0 70 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a  p, .  Fts5Iter *
15dc0 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62  pIter,.  int *pb
15dd0 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20  NewTerm         
15de0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15df0 20 54 72 75 65 20 69 66 20 2a 6d 69 67 68 74 2a   True if *might*
15e00 20 62 65 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a   be new term */.
15e10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
15e20 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 29  er->bSkipEmpty )
15e30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
15e40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15e50 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  do {.      int i
15e60 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61  First = pIter->a
15e70 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b  First[1].iFirst;
15e80 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
15e90 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
15ea0 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b  r->aSeg[iFirst];
15eb0 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
15ec0 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  erm = 0;..      
15ed0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
15ee0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
15ef0 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c    pSeg->xNext(p,
15f00 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d   pSeg, &bNewTerm
15f10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
15f20 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62  g->pLeaf==0 || b
15f30 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20  NewTerm .       
15f40 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  || fts5MultiIter
15f50 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 49 74  AdvanceRowid(pIt
15f60 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70 53 65  er, iFirst, &pSe
15f70 67 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  g).      ){.    
15f80 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
15f90 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74  rAdvanced(p, pIt
15fa0 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a  er, iFirst, 1);.
15fb0 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
15fc0 69 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65  iIterSetEof(pIte
15fd0 72 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e  r);.        *pbN
15fe0 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
15ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16000 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b   *pbNewTerm = 0;
16010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
16020 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
16030 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65 72  erSetup(p, pIter
16040 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  );..    }while( 
16050 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
16060 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29  mpty(p, pIter) )
16070 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
16080 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
16090 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28 46 74 73  Outputs_Noop(Fts
160a0 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64 31 2c  5Iter *pUnused1,
160b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 55   Fts5SegIter *pU
160c0 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  nused2){.  UNUSE
160d0 44 5f 50 41 52 41 4d 32 28 70 55 6e 75 73 65 64  D_PARAM2(pUnused
160e0 31 2c 20 70 55 6e 75 73 65 64 32 29 3b 0a 7d 0a  1, pUnused2);.}.
160f0 0a 73 74 61 74 69 63 20 46 74 73 35 49 74 65 72  .static Fts5Iter
16100 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41   *fts5MultiIterA
16110 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e 64 65  lloc(.  Fts5Inde
16120 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
16130 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
16140 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
16150 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
16160 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46 74 73  nt nSeg.){.  Fts
16170 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69  5Iter *pNew;.  i
16180 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
161a0 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e  * Power of two >
161b0 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72  = nSeg */..  for
161c0 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c  (nSlot=2; nSlot<
161d0 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f  nSeg; nSlot=nSlo
161e0 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66  t*2);.  pNew = f
161f0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
16200 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
16210 73 35 49 74 65 72 29 20 2b 20 20 20 20 20 20 20  s5Iter) +       
16220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
16230 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  ew */.      size
16240 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29 20  of(Fts5SegIter) 
16250 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20  * (nSlot-1) +   
16260 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20  /* pNew->aSeg[] 
16270 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
16280 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e  Fts5CResult) * n
16290 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20  Slot         /* 
162a0 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a  pNew->aFirst[] *
162b0 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  /.  );.  if( pNe
162c0 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  w ){.    pNew->n
162d0 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20  Seg = nSlot;.   
162e0 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d 20   pNew->aFirst = 
162f0 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26 70  (Fts5CResult*)&p
16300 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d  New->aSeg[nSlot]
16310 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64  ;.    pNew->pInd
16320 65 78 20 3d 20 70 3b 0a 20 20 20 20 70 4e 65 77  ex = p;.    pNew
16330 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
16340 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
16350 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 20 20 72  ts_Noop;.  }.  r
16360 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 73  eturn pNew;.}..s
16370 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
16380 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a  oslistCallback(.
16390 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e    Fts5Index *pUn
163a0 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70  used, .  void *p
163b0 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73  Context, .  cons
163c0 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
163d0 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 55 4e  t nChunk.){.  UN
163e0 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73  USED_PARAM(pUnus
163f0 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  ed);.  assert_nc
16400 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
16410 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
16420 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
16430 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 28 46  afeAppendBlob((F
16440 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e 74  ts5Buffer*)pCont
16450 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  ext, pChunk, nCh
16460 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70  unk);.  }.}..typ
16470 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c  edef struct Posl
16480 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 50  istCallbackCtx P
16490 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
164a0 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73  x;.struct Poslis
164b0 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20  tCallbackCtx {. 
164c0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
164d0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
164e0 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
164f0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46  is buffer */.  F
16500 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
16510 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
16520 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68  * Restrict match
16530 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d  es to this colum
16540 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 74  n */.  int eStat
16550 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
16560 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
16570 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64  ove */.};..typed
16580 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73  ef struct Poslis
16590 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f 73 6c  tOffsetsCtx Posl
165a0 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b 0a 73  istOffsetsCtx;.s
165b0 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66  truct PoslistOff
165c0 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74 73 35  setsCtx {.  Fts5
165d0 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
165e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
165f0 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75  ppend to this bu
16600 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f  ffer */.  Fts5Co
16610 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20  lset *pColset;  
16620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16630 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f  trict matches to
16640 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   this column */.
16650 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 69    int iRead;.  i
16660 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f  nt iWrite;.};../
16670 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65 20  *.** TODO: Make 
16680 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69  this more effici
16690 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent!.*/.static i
166a0 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73  nt fts5IndexCols
166b0 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c 73 65  etTest(Fts5Colse
166c0 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74 20  t *pColset, int 
166d0 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iCol){.  int i;.
166e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
166f0 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  lset->nCol; i++)
16700 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  {.    if( pColse
16710 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f  t->aiCol[i]==iCo
16720 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  l ) return 1;.  
16730 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
16740 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16750 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43  5PoslistOffsetsC
16760 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
16770 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a  ndex *pUnused, .
16780 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
16790 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
167a0 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
167b0 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 4f 66  k.){.  PoslistOf
167c0 66 73 65 74 73 43 74 78 20 2a 70 43 74 78 20 3d  fsetsCtx *pCtx =
167d0 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73   (PoslistOffsets
167e0 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20  Ctx*)pContext;. 
167f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
16800 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  nused);.  assert
16810 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29  _nc( nChunk>=0 )
16820 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30  ;.  if( nChunk>0
16830 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
16840 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3c  0;.    while( i<
16850 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
16860 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  int iVal;.      
16870 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
16880 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69 5d 2c  nt32(&pChunk[i],
16890 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 56   iVal);.      iV
168a0 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52 65 61  al += pCtx->iRea
168b0 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70 43 74  d - 2;.      pCt
168c0 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61 6c 3b  x->iRead = iVal;
168d0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49  .      if( fts5I
168e0 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
168f0 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 56  Ctx->pColset, iV
16900 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  al) ){.        f
16910 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
16920 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e  endVarint(pCtx->
16930 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32 20 2d  pBuf, iVal + 2 -
16940 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29 3b 0a   pCtx->iWrite);.
16950 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69 57          pCtx->iW
16960 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20 20 20  rite = iVal;.   
16970 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
16980 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16990 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
169a0 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
169b0 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 0a 20  ndex *pUnused,. 
169c0 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
169d0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
169e0 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
169f0 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43 61 6c  .){.  PoslistCal
16a00 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78 20 3d  lbackCtx *pCtx =
16a10 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63   (PoslistCallbac
16a20 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  kCtx*)pContext;.
16a30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
16a40 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72  Unused);.  asser
16a50 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20  t_nc( nChunk>=0 
16a60 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e  );.  if( nChunk>
16a70 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  0 ){.    /* Sear
16a80 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20 66 69  ch through to fi
16a90 6e 64 20 74 68 65 20 66 69 72 73 74 20 76 61 72  nd the first var
16aa0 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65 20 31  int with value 1
16ab0 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a 20 20  . This is the.  
16ac0 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68    ** start of th
16ad0 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73 20 68  e next columns h
16ae0 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  its. */.    int 
16af0 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
16b00 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20  Start = 0;..    
16b10 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65  if( pCtx->eState
16b20 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==2 ){.      int
16b30 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66 74 73   iCol;.      fts
16b40 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
16b50 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c  (pChunk, i, iCol
16b60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  );.      if( fts
16b70 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74  5IndexColsetTest
16b80 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20  (pCtx->pColset, 
16b90 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  iCol) ){.       
16ba0 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
16bb0 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  1;.        fts5B
16bc0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
16bd0 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75 66  arint(pCtx->pBuf
16be0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
16bf0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  e{.        pCtx-
16c00 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20  >eState = 0;.   
16c10 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
16c20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  do {.      while
16c30 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20 70 43  ( i<nChunk && pC
16c40 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20 29 7b  hunk[i]!=0x01 ){
16c50 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
16c60 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78 38 30  pChunk[i] & 0x80
16c70 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) i++;.        
16c80 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
16c90 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
16ca0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ate ){.        f
16cb0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
16cc0 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42  endBlob(pCtx->pB
16cd0 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61  uf, &pChunk[iSta
16ce0 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a  rt], i-iStart);.
16cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16d00 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20  ( i<nChunk ){.  
16d10 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
16d20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
16d30 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b   i;.        i++;
16d40 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
16d50 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
16d60 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
16d70 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 2;.        }e
16d80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
16d90 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
16da0 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43  32(pChunk, i, iC
16db0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ol);.          p
16dc0 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 66 74  Ctx->eState = ft
16dd0 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
16de0 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c  t(pCtx->pColset,
16df0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
16e00 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61    if( pCtx->eSta
16e10 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
16e20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
16e30 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d  AppendBlob(pCtx-
16e40 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69  >pBuf, &pChunk[i
16e50 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74  Start], i-iStart
16e60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
16e70 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  Start = i;.     
16e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
16ea0 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 3b  ile( i<nChunk );
16eb0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
16ec0 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65  oid fts5ChunkIte
16ed0 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rate(.  Fts5Inde
16ee0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
16ef0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16f00 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
16f10 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20  5SegIter *pSeg, 
16f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16f30 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73 20  Poslist of this 
16f40 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f  iterator */.  vo
16f50 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f70 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72   Context pointer
16f80 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c   for xChunk call
16f90 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28  back */.  void (
16fa0 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e 64  *xChunk)(Fts5Ind
16fb0 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73  ex*, void*, cons
16fc0 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20  t u8*, int).){. 
16fd0 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65 67   int nRem = pSeg
16fe0 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20  ->nPos;         
16ff0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
17000 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d  tes still to com
17010 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  e */.  Fts5Data 
17020 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75 38  *pData = 0;.  u8
17030 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65 67   *pChunk = &pSeg
17040 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
17050 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
17060 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49   int nChunk = MI
17070 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c  N(nRem, pSeg->pL
17080 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  eaf->szLeaf - pS
17090 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 29  eg->iLeafOffset)
170a0 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70  ;.  int pgno = p
170b0 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  Seg->iLeafPgno;.
170c0 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d    int pgnoSave =
170d0 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
170e0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
170f0 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74 61 69  mwork with detai
17100 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73 65 73  l=none databases
17110 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
17120 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
17130 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
17140 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20 28  NONE );..  if( (
17150 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46 54  pSeg->flags & FT
17160 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
17170 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 67  SE)==0 ){.    pg
17180 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31 3b  noSave = pgno+1;
17190 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
171a0 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28 70   ){.    xChunk(p
171b0 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c 20  , pCtx, pChunk, 
171c0 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52 65  nChunk);.    nRe
171d0 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20  m -= nChunk;.   
171e0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
171f0 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  (pData);.    if(
17200 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20 20   nRem<=0 ){.    
17210 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
17220 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b 2b  se{.      pgno++
17230 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
17240 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
17250 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
17260 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69  ID(pSeg->pSeg->i
17270 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b 0a 20  Segid, pgno));. 
17280 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d       if( pData==
17290 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
172a0 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74 61   pChunk = &pData
172b0 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43  ->p[4];.      nC
172c0 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c  hunk = MIN(nRem,
172d0 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d   pData->szLeaf -
172e0 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   4);.      if( p
172f0 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b  gno==pgnoSave ){
17300 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17310 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66   pSeg->pNextLeaf
17320 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
17330 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  Seg->pNextLeaf =
17340 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20   pData;.        
17350 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  pData = 0;.     
17360 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
17370 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
17380 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
17390 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64  oints to a valid
173a0 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29   entry (not EOF)
173b0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
173c0 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20 70  on appends the p
173d0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
173e0 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  a for the curren
173f0 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75  t entry to.** bu
17400 66 66 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f  ffer pBuf. It do
17410 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f  es not make a co
17420 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  py of the positi
17430 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20  on-list size.** 
17440 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
17450 20 76 6f 69 64 20 66 74 73 35 53 65 67 69 74 65   void fts5Segite
17460 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
17470 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
17480 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20  SegIter *pSeg,. 
17490 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
174a0 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66  lset,.  Fts5Buff
174b0 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66  er *pBuf.){.  if
174c0 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47  ( 0==fts5BufferG
174d0 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  row(&p->rc, pBuf
174e0 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29 7b  , pSeg->nPos) ){
174f0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74  .    if( pColset
17500 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
17510 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c  5ChunkIterate(p,
17520 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70 42   pSeg, (void*)pB
17530 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 43  uf, fts5PoslistC
17540 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65  allback);.    }e
17550 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
17560 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
17570 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
17580 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  FULL ){.        
17590 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
175a0 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20  tx sCtx;.       
175b0 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75   sCtx.pBuf = pBu
175c0 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  f;.        sCtx.
175d0 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65  pColset = pColse
175e0 74 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  t;.        sCtx.
175f0 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64  eState = fts5Ind
17600 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f  exColsetTest(pCo
17610 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lset, 0);.      
17620 20 20 61 73 73 65 72 74 28 20 73 43 74 78 2e 65    assert( sCtx.e
17630 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78  State==0 || sCtx
17640 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20  .eState==1 );.  
17650 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
17660 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
17670 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74  (void*)&sCtx, ft
17680 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
17690 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
176a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
176b0 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
176c0 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20 6d   sCtx;.        m
176d0 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20  emset(&sCtx, 0, 
176e0 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20  sizeof(sCtx));. 
176f0 20 20 20 20 20 20 20 73 43 74 78 2e 70 42 75 66         sCtx.pBuf
17700 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20   = pBuf;.       
17710 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20   sCtx.pColset = 
17720 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20  pColset;.       
17730 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
17740 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64  e(p, pSeg, (void
17750 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73  *)&sCtx, fts5Pos
17760 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62  listOffsetsCallb
17770 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ack);.      }.  
17780 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
17790 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65   IN/OUT paramete
177a0 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73 20 74  r (*pa) points t
177b0 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  o a position lis
177c0 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  t n bytes in siz
177d0 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73  e. If.** the pos
177e0 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ition list conta
177f0 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
17800 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65  column iCol, the
17810 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74 0a 2a  n (*pa) is set.*
17820 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  * to point to th
17830 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c  e sub-position-l
17840 69 73 74 20 66 6f 72 20 74 68 61 74 20 63 6f 6c  ist for that col
17850 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  umn and the numb
17860 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69  er of.** bytes i
17870 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e 20 4f  n it returned. O
17880 72 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  r, if the argume
17890 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
178a0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e   does not.** con
178b0 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69 65 73  tain any entries
178c0 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c   for column iCol
178d0 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
178e0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
178f0 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 0a 20  dexExtractCol(. 
17900 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20   const u8 **pa, 
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e   /* IN/OUT: Poin
17930 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a  ter to poslist *
17940 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17960 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65 20      /* IN: Size 
17970 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79  of poslist in by
17980 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  tes */.  int iCo
17990 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
179a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
179b0 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 66 72  mn to extract fr
179c0 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b  om poslist */.){
179d0 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
179e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
179f0 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62     /* Anything b
17a00 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
17a10 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f  0x01 is col 0 */
17a20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d  .  const u8 *p =
17a30 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38   *pa;.  const u8
17a40 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20   *pEnd = &p[n]; 
17a50 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
17a60 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
17a70 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
17a80 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e  ..  while( iCol>
17a90 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  iCurrent ){.    
17aa0 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74  /* Advance point
17ab0 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f  er p until it po
17ac0 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20  ints to pEnd or 
17ad0 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68 61  an 0x01 byte tha
17ae0 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  t is.    ** not 
17af0 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74  part of a varint
17b00 2e 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  . Note that it i
17b10 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
17b20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 0a 20 20  or a negative.  
17b30 20 20 2a 2a 20 6f 72 20 65 78 74 72 65 6d 65 6c    ** or extremel
17b40 79 20 6c 61 72 67 65 20 76 61 72 69 6e 74 20 74  y large varint t
17b50 6f 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20 61  o occur within a
17b60 6e 20 75 6e 63 6f 72 72 75 70 74 65 64 20 70 6f  n uncorrupted po
17b70 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6c  sition .    ** l
17b80 69 73 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74  ist. So the last
17b90 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 76 61   byte of each va
17ba0 72 69 6e 74 20 6d 61 79 20 62 65 20 61 73 73 75  rint may be assu
17bb0 6d 65 64 20 74 6f 20 68 61 76 65 20 61 20 63 6c  med to have a cl
17bc0 65 61 72 0a 20 20 20 20 2a 2a 20 30 78 38 30 20  ear.    ** 0x80 
17bd0 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69  bit.  */.    whi
17be0 6c 65 28 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a  le( *p!=0x01 ){.
17bf0 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b        while( *p+
17c00 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 20 20  + & 0x80 );.    
17c10 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 20    if( p>=pEnd ) 
17c20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
17c30 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20      *pa = p++;. 
17c40 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 2a 70     iCurrent = *p
17c50 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 75 72  ++;.    if( iCur
17c60 72 65 6e 74 20 26 20 30 78 38 30 20 29 7b 0a 20  rent & 0x80 ){. 
17c70 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20 20 20 20       p--;.      
17c80 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  p += fts5GetVari
17c90 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e 74  nt32(p, iCurrent
17ca0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
17cb0 66 28 20 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e  f( iCol!=iCurren
17cc0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
17cd0 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e   /* Advance poin
17ce0 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70  ter p until it p
17cf0 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72  oints to pEnd or
17d00 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68   an 0x01 byte th
17d10 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70  at is.  ** not p
17d20 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20  art of a varint 
17d30 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45  */.  while( p<pE
17d40 6e 64 20 26 26 20 2a 70 21 3d 30 78 30 31 20 29  nd && *p!=0x01 )
17d50 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b  {.    while( *p+
17d60 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 7d 0a  + & 0x80 );.  }.
17d70 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20 28 2a  .  return p - (*
17d80 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  pa);.}..static i
17d90 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72  nt fts5IndexExtr
17da0 61 63 74 43 6f 6c 73 65 74 20 28 0a 20 20 46 74  actColset (.  Ft
17db0 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
17dc0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
17dd0 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65   Colset to filte
17de0 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  r on */.  const 
17df0 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50  u8 *pPos, int nP
17e00 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  os,       /* Pos
17e10 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
17e20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
17e50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
17e60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
17e70 6e 74 20 69 3b 0a 0a 20 20 66 74 73 35 42 75 66  nt i;..  fts5Buf
17e80 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
17e90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
17ea0 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  set->nCol; i++){
17eb0 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
17ec0 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20  Sub = pPos;.    
17ed0 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35 49  int nSub = fts5I
17ee0 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26  ndexExtractCol(&
17ef0 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c  pSub, nPos, pCol
17f00 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a  set->aiCol[i]);.
17f10 20 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b 0a      if( nSub ){.
17f20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
17f30 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20  AppendBlob(&rc, 
17f40 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62  pBuf, nSub, pSub
17f50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
17f60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17f70 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
17f80 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
17f90 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c  detail=none tabl
17fa0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
17fb0 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
17fc0 74 70 75 74 73 5f 4e 6f 6e 65 28 46 74 73 35 49  tputs_None(Fts5I
17fd0 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
17fe0 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
17ff0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
18000 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
18010 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
18020 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20  DETAIL_NONE );. 
18030 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f   pIter->base.iRo
18040 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
18050 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  id;.  pIter->bas
18060 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d 3e  e.nData = pSeg->
18070 6e 50 6f 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  nPos;.}../*.** x
18080 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
18090 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
180a0 69 6c 3d 66 75 6c 6c 20 61 6e 64 20 64 65 74 61  il=full and deta
180b0 69 6c 3d 63 6f 6c 20 74 61 62 6c 65 73 20 77 68  il=col tables wh
180c0 65 6e 20 6e 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  en no.** column 
180d0 66 69 6c 74 65 72 73 20 61 72 65 20 73 70 65 63  filters are spec
180e0 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
180f0 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
18100 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c 73 65  tOutputs_Nocolse
18110 74 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  t(Fts5Iter *pIte
18120 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
18130 70 53 65 67 29 7b 0a 20 20 70 49 74 65 72 2d 3e  pSeg){.  pIter->
18140 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53  base.iRowid = pS
18150 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49  eg->iRowid;.  pI
18160 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
18170 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 0a 20  = pSeg->nPos;.. 
18180 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
18190 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
181a0 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
181b0 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20  ETAIL_NONE );.  
181c0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
181d0 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 0a 20 20  Colset==0 );..  
181e0 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  if( pSeg->iLeafO
181f0 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73  ffset+pSeg->nPos
18200 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  <=pSeg->pLeaf->s
18210 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  zLeaf ){.    /* 
18220 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72  All data is stor
18230 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
18240 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61 74 65  t page. Populate
18250 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20 20 20   the output .   
18260 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f   ** variables to
18270 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20   point into the 
18280 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61 67 65  body of the page
18290 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
182a0 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
182b0 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  a = &pSeg->pLeaf
182c0 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
182d0 66 66 73 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  ffset];.  }else{
182e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  .    /* The data
182f0 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
18300 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65  over two or more
18310 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74 20   pages. Copy it 
18320 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
18330 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73 74  Fts5Iter.poslist
18340 20 62 75 66 66 65 72 20 61 6e 64 20 74 68 65 6e   buffer and then
18350 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
18360 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
18370 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  .    ** to this 
18380 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20  buffer.  */.    
18390 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
183a0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
183b0 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72  .    fts5Segiter
183c0 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70  Poslist(pIter->p
183d0 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 30 2c 20  Index, pSeg, 0, 
183e0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
183f0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ;.    pIter->bas
18400 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.pData = pIter-
18410 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a  >poslist.p;.  }.
18420 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
18430 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
18440 65 64 20 62 79 20 64 65 74 61 69 6c 3d 63 6f 6c  ed by detail=col
18450 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
18460 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 0a 2a   column filter.*
18470 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
18480 31 30 30 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  100 or more colu
18490 6d 6e 73 2e 20 41 6c 73 6f 20 63 61 6c 6c 65 64  mns. Also called
184a0 20 61 73 20 61 20 66 61 6c 6c 62 61 63 6b 20 66   as a fallback f
184b0 72 6f 6d 0a 2a 2a 20 66 74 73 35 49 74 65 72 53  rom.** fts5IterS
184c0 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30  etOutputs_Col100
184d0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c   if the column-l
184e0 69 73 74 20 73 70 61 6e 73 20 6d 6f 72 65 20 74  ist spans more t
184f0 68 61 6e 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  han one page..*/
18500 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18510 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18520 43 6f 6c 28 46 74 73 35 49 74 65 72 20 2a 70 49  Col(Fts5Iter *pI
18530 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
18540 20 2a 70 53 65 67 29 7b 0a 20 20 66 74 73 35 42   *pSeg){.  fts5B
18550 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
18560 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 66 74  ->poslist);.  ft
18570 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
18580 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
18590 70 53 65 67 2c 20 70 49 74 65 72 2d 3e 70 43 6f  pSeg, pIter->pCo
185a0 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f  lset, &pIter->po
185b0 73 6c 69 73 74 29 3b 0a 20 20 70 49 74 65 72 2d  slist);.  pIter-
185c0 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
185d0 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70  Seg->iRowid;.  p
185e0 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
185f0 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
18600 74 2e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  t.p;.  pIter->ba
18610 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
18620 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a  ->poslist.n;.}..
18630 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74  /*.** xSetOutput
18640 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  s callback used 
18650 77 68 65 6e 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  when: .**.**   *
18660 20 64 65 74 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20   detail=col,.** 
18670 20 20 2a 20 74 68 65 72 65 20 69 73 20 61 20 63    * there is a c
18680 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2c 20 61 6e  olumn filter, an
18690 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 74 61 62  d.**   * the tab
186a0 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 30 30 20  le contains 100 
186b0 6f 72 20 66 65 77 65 72 20 63 6f 6c 75 6d 6e 73  or fewer columns
186c0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73  . .**.** The las
186d0 74 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 65 6e  t point is to en
186e0 73 75 72 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  sure all column 
186f0 6e 75 6d 62 65 72 73 20 61 72 65 20 73 74 6f 72  numbers are stor
18700 65 64 20 61 73 20 0a 2a 2a 20 73 69 6e 67 6c 65  ed as .** single
18710 2d 62 79 74 65 20 76 61 72 69 6e 74 73 2e 0a 2a  -byte varints..*
18720 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18730 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18740 5f 43 6f 6c 31 30 30 28 46 74 73 35 49 74 65 72  _Col100(Fts5Iter
18750 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67   *pIter, Fts5Seg
18760 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 0a 20 20  Iter *pSeg){..  
18770 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
18780 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Index->pConfig->
18790 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
187a0 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a  TAIL_COLUMNS );.
187b0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
187c0 3e 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69  >pColset );..  i
187d0 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
187e0 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3e  fset+pSeg->nPos>
187f0 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
18800 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 49  eaf ){.    fts5I
18810 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
18820 6c 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a  l(pIter, pSeg);.
18830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
18840 2a 61 20 3d 20 28 75 38 2a 29 26 70 53 65 67 2d  *a = (u8*)&pSeg-
18850 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e  >pLeaf->p[pSeg->
18860 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
18870 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 28 75 38    u8 *pEnd = (u8
18880 2a 29 26 61 5b 70 53 65 67 2d 3e 6e 50 6f 73 5d  *)&a[pSeg->nPos]
18890 3b 20 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76  ; .    int iPrev
188a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61   = 0;.    int *a
188b0 69 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 70 43  iCol = pIter->pC
188c0 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20  olset->aiCol;.  
188d0 20 20 69 6e 74 20 2a 61 69 43 6f 6c 45 6e 64 20    int *aiColEnd 
188e0 3d 20 26 61 69 43 6f 6c 5b 70 49 74 65 72 2d 3e  = &aiCol[pIter->
188f0 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a  pColset->nCol];.
18900 0a 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20  .    u8 *aOut = 
18910 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
18920 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76 4f  ;.    int iPrevO
18930 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 70 49 74  ut = 0;..    pIt
18940 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
18950 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
18960 0a 20 20 20 20 77 68 69 6c 65 28 20 61 3c 70 45  .    while( a<pE
18970 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 50 72 65  nd ){.      iPre
18980 76 20 2b 3d 20 28 69 6e 74 29 61 2b 2b 5b 30 5d  v += (int)a++[0]
18990 20 2d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c   - 2;.      whil
189a0 65 28 20 2a 61 69 43 6f 6c 3c 69 50 72 65 76 20  e( *aiCol<iPrev 
189b0 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c  ){.        aiCol
189c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
189d0 61 69 43 6f 6c 3d 3d 61 69 43 6f 6c 45 6e 64 20  aiCol==aiColEnd 
189e0 29 20 67 6f 74 6f 20 73 65 74 6f 75 74 70 75 74  ) goto setoutput
189f0 73 5f 63 6f 6c 5f 6f 75 74 3b 0a 20 20 20 20 20  s_col_out;.     
18a00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 61 69   }.      if( *ai
18a10 43 6f 6c 3d 3d 69 50 72 65 76 20 29 7b 0a 20 20  Col==iPrev ){.  
18a20 20 20 20 20 20 20 2a 61 4f 75 74 2b 2b 20 3d 20        *aOut++ = 
18a30 28 69 50 72 65 76 20 2d 20 69 50 72 65 76 4f 75  (iPrev - iPrevOu
18a40 74 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 20 20  t) + 2;.        
18a50 69 50 72 65 76 4f 75 74 20 3d 20 69 50 72 65 76  iPrevOut = iPrev
18a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18a70 0a 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f  .setoutputs_col_
18a80 6f 75 74 3a 0a 20 20 20 20 70 49 74 65 72 2d 3e  out:.    pIter->
18a90 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74  base.pData = pIt
18aa0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
18ab0 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e     pIter->base.n
18ac0 44 61 74 61 20 3d 20 61 4f 75 74 20 2d 20 70 49  Data = aOut - pI
18ad0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
18ae0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65    }.}../*.** xSe
18af0 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
18b00 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  k used by detail
18b10 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68 65 72 65  =full when there
18b20 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c   is a column fil
18b30 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
18b40 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f  oid fts5IterSetO
18b50 75 74 70 75 74 73 5f 46 75 6c 6c 28 46 74 73 35  utputs_Full(Fts5
18b60 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
18b70 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
18b80 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
18b90 43 6f 6c 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Colset = pIter->
18ba0 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65 72  pColset;.  pIter
18bb0 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
18bc0 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20  pSeg->iRowid;.. 
18bd0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
18be0 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
18bf0 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
18c00 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20 20  ETAIL_FULL );.  
18c10 61 73 73 65 72 74 28 20 70 43 6f 6c 73 65 74 20  assert( pColset 
18c20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  );..  if( pSeg->
18c30 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67  iLeafOffset+pSeg
18c40 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c  ->nPos<=pSeg->pL
18c50 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
18c60 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20 69     /* All data i
18c70 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  s stored on the 
18c80 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50 6f  current page. Po
18c90 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75  pulate the outpu
18ca0 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  t .    ** variab
18cb0 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e 74  les to point int
18cc0 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
18cd0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20 2a  e page object. *
18ce0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  /.    const u8 *
18cf0 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  a = &pSeg->pLeaf
18d00 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
18d10 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28 20  ffset];.    if( 
18d20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31  pColset->nCol==1
18d30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
18d40 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 66 74  >base.nData = ft
18d50 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
18d60 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  l(&a, pSeg->nPos
18d70 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b  ,pColset->aiCol[
18d80 30 5d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  0]);.      pIter
18d90 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 61  ->base.pData = a
18da0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18db0 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
18dc0 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  o(&pIter->poslis
18dd0 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e  t);.      fts5In
18de0 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74  dexExtractColset
18df0 28 70 43 6f 6c 73 65 74 2c 20 61 2c 20 70 53 65  (pColset, a, pSe
18e00 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d  g->nPos, &pIter-
18e10 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  >poslist);.     
18e20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61   pIter->base.pDa
18e30 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
18e40 69 73 74 2e 70 3b 0a 20 20 20 20 20 20 70 49 74  ist.p;.      pIt
18e50 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
18e60 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18e70 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
18e80 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74  {.    /* The dat
18e90 61 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  a is distributed
18ea0 20 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72   over two or mor
18eb0 65 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74  e pages. Copy it
18ec0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
18ed0 20 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73   Fts5Iter.poslis
18ee0 74 20 62 75 66 66 65 72 20 61 6e 64 20 74 68 65  t buffer and the
18ef0 6e 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  n set the output
18f00 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
18f10 74 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73  t.    ** to this
18f20 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20   buffer.  */.   
18f30 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
18f40 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
18f50 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65  ;.    fts5Segite
18f60 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e  rPoslist(pIter->
18f70 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 43  pIndex, pSeg, pC
18f80 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70  olset, &pIter->p
18f90 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
18fa0 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
18fb0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18fc0 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  p;.    pIter->ba
18fd0 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
18fe0 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d  ->poslist.n;.  }
18ff0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
19000 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
19010 74 43 62 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  tCb(int *pRc, Ft
19020 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
19030 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
19040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
19050 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
19060 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
19070 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69  ->pConfig;.    i
19080 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  f( pConfig->eDet
19090 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
190a0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
190b0 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
190c0 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
190d0 75 74 70 75 74 73 5f 4e 6f 6e 65 3b 0a 20 20 20  utputs_None;.   
190e0 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28   }..    else if(
190f0 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d   pIter->pColset=
19100 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  =0 ){.      pIte
19110 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
19120 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
19130 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 3b 0a 20 20  uts_Nocolset;.  
19140 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66    }..    else if
19150 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ( pConfig->eDeta
19160 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
19170 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 49  FULL ){.      pI
19180 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
19190 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
191a0 74 70 75 74 73 5f 46 75 6c 6c 3b 0a 20 20 20 20  tputs_Full;.    
191b0 7d 0a 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  }..    else{.   
191c0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6e 66     assert( pConf
191d0 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
191e0 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53  5_DETAIL_COLUMNS
191f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
19200 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31 30 30  onfig->nCol<=100
19210 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
19220 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
19230 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
19240 75 74 73 5f 43 6f 6c 31 30 30 3b 0a 20 20 20 20  uts_Col100;.    
19250 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
19260 75 66 66 65 72 53 69 7a 65 28 70 52 63 2c 20 26  ufferSize(pRc, &
19270 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2c 20  pIter->poslist, 
19280 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a  pConfig->nCol);.
19290 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
192a0 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
192b0 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
192c0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c  erSetOutputs_Col
192d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
192e0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c    }.}.../*.** Al
192f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74 73  locate a new Fts
19300 35 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  5Iter object..**
19310 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
19320 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ct will be used 
19330 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
19340 67 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63  gh data in struc
19350 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a  ture pStruct..**
19360 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76   If iLevel is -v
19370 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61  e, then all data
19380 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73   in all segments
19390 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20   is merged. Or, 
193a0 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  if iLevel.** is 
193b0 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c  zero or greater,
193c0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66   data from the f
193d0 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65  irst nSegment se
193e0 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20  gments on level 
193f0 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72  iLevel.** is mer
19400 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ged..**.** The i
19410 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c  terator initiall
19420 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
19430 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64  first term/rowid
19440 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a   entry in the .*
19450 2a 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e  * iterated data.
19460 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19470 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
19480 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
19490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
194a0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
194b0 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
194c0 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53  ithin */.  Fts5S
194d0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
194e0 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  t,         /* St
194f0 72 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69  ructure of speci
19500 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  fic index */.  i
19510 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19530 2a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  * FTS5INDEX_QUER
19540 59 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  Y_XXX flags */. 
19550 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
19560 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
19570 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69   /* Colset to fi
19580 6c 74 65 72 20 6f 6e 20 28 6f 72 20 4e 55 4c 4c  lter on (or NULL
19590 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  ) */.  const u8 
195a0 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
195b0 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
195c0 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55  o seek to (or NU
195d0 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69  LL/0) */.  int i
195e0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
195f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
19600 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28  vel to iterate (
19610 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20  -1 for all) */. 
19620 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20   int nSegment,  
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19640 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
19650 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20  gments to merge 
19660 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20  (iLevel>=0) */. 
19670 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75   Fts5Iter **ppOu
19680 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
19690 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
196a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 20  /.){.  int nSeg 
196b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
196c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
196d0 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65 72   of segment-iter
196e0 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  s in use */.  in
196f0 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20  t iIter = 0;    
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19710 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20   */.  int iSeg; 
19720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19730 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
19740 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
19750 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
19760 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
19770 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49  l *pLvl;.  Fts5I
19780 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73  ter *pNew;..  as
19790 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20  sert( (pTerm==0 
197a0 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20  && nTerm==0) || 
197b0 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f  iLevel<0 );..  /
197c0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
197d0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c   for the new mul
197e0 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e  ti-seg-iterator.
197f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
19800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19810 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29    if( iLevel<0 )
19820 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19830 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
19840 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65  t==fts5Structure
19850 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
19860 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20  truct) );.      
19870 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
19880 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20  nSegment;.      
19890 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73  nSeg += (p->pHas
198a0 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  h ? 1 : 0);.    
198b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65  }else{.      nSe
198c0 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d  g = MIN(pStruct-
198d0 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e  >aLevel[iLevel].
198e0 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  nSeg, nSegment);
198f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
19900 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
19910 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
19920 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66 28 20  p, nSeg);.  if( 
19930 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
19940 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d  ;.  pNew->bRev =
19950 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54   (0!=(flags & FT
19960 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
19970 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53  SC));.  pNew->bS
19980 6b 69 70 45 6d 70 74 79 20 3d 20 28 30 21 3d 28  kipEmpty = (0!=(
19990 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
199a0 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54  X_QUERY_SKIPEMPT
199b0 59 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 74  Y));.  pNew->pSt
199c0 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
199d0 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 73 65 74 20    pNew->pColset 
199e0 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 66 74 73  = pColset;.  fts
199f0 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 53  5StructureRef(pS
19a00 74 72 75 63 74 29 3b 0a 20 20 69 66 28 20 28 66  truct);.  if( (f
19a10 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
19a20 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 29  _QUERY_NOOUTPUT)
19a30 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 49  ==0 ){.    fts5I
19a40 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 26  terSetOutputCb(&
19a50 70 2d 3e 72 63 2c 20 70 4e 65 77 29 3b 0a 20 20  p->rc, pNew);.  
19a60 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
19a70 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  ze each of the c
19a80 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74  omponent segment
19a90 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20   iterators. */. 
19aa0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
19ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
19ac0 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
19ad0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
19ae0 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70  Level *pEnd = &p
19af0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70  Struct->aLevel[p
19b00 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b  Struct->nLevel];
19b10 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48  .      if( p->pH
19b20 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ash ){.        /
19b30 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20  * Add a segment 
19b40 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  iterator for the
19b50 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
19b60 73 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61  s of the hash ta
19b70 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ble. */.        
19b80 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
19b90 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
19ba0 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
19bb0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 48 61     fts5SegIterHa
19bc0 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c  shInit(p, pTerm,
19bd0 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70   nTerm, flags, p
19be0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
19bf0 20 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70       for(pLvl=&p
19c00 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
19c10 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c  ]; pLvl<pEnd; pL
19c20 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  vl++){.        f
19c30 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53  or(iSeg=pLvl->nS
19c40 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
19c50 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Seg--){.        
19c60 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
19c70 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
19c80 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
19c90 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35  ;.          Fts5
19ca0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
19cb0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
19cc0 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 20  er++];.         
19cd0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
19ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
19cf0 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
19d00 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20  pSeg, pIter);.  
19d10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
19d20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
19d30 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70  egIterSeekInit(p
19d40 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , pTerm, nTerm, 
19d50 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74  flags, pSeg, pIt
19d60 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
19d70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19d80 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
19d90 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72      pLvl = &pStr
19da0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
19db0 65 6c 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  el];.      for(i
19dc0 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67  Seg=nSeg-1; iSeg
19dd0 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20  >=0; iSeg--){.  
19de0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
19df0 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e  rInit(p, &pLvl->
19e00 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65  aSeg[iSeg], &pNe
19e10 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
19e20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19e30 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 49 74  .    assert( iIt
19e40 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 20 20 7d 0a  er==nSeg );.  }.
19e50 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
19e60 76 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ve was successfu
19e70 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  l, each componen
19e80 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20  t iterators now 
19e90 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20  points .  ** to 
19ea0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
19eb0 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20  in its segment. 
19ec0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 69  In this case ini
19ed0 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a  tialize the .  *
19ee0 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  * aFirst[] array
19ef0 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
19f00 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
19f10 66 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f  free the iterato
19f20 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e  r.  ** object an
19f30 64 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  d set the output
19f40 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
19f50 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  L.  */.  if( p->
19f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19f70 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72 3d 70  .    for(iIter=p
19f80 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74  New->nSeg-1; iIt
19f90 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a  er>0; iIter--){.
19fa0 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20        int iEq;. 
19fb0 20 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20       if( (iEq = 
19fc0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
19fd0 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74  ompare(pNew, iIt
19fe0 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  er)) ){.        
19ff0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
1a000 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  g = &pNew->aSeg[
1a010 69 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  iEq];.        if
1a020 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1a030 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e 65 78 74  OK ) pSeg->xNext
1a040 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20  (p, pSeg, 0);.  
1a050 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1a060 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
1a070 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29  New, iEq, iIter)
1a080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a090 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1a0a0 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20  rSetEof(pNew);. 
1a0b0 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c     fts5AssertMul
1a0c0 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70  tiIterSetup(p, p
1a0d0 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
1a0e0 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
1a0f0 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  && fts5MultiIter
1a100 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29  IsEmpty(p, pNew)
1a110 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75   ){.      fts5Mu
1a120 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
1a130 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  New, 0, 0);.    
1a140 7d 65 6c 73 65 20 69 66 28 20 70 4e 65 77 2d 3e  }else if( pNew->
1a150 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a  base.bEof==0 ){.
1a160 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
1a170 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77 2d  r *pSeg = &pNew-
1a180 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69 72  >aSeg[pNew->aFir
1a190 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
1a1a0 20 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f       pNew->xSetO
1a1b0 75 74 70 75 74 73 28 70 4e 65 77 2c 20 70 53 65  utputs(pNew, pSe
1a1c0 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  g);.    }..  }el
1a1d0 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  se{.    fts5Mult
1a1e0 69 49 74 65 72 46 72 65 65 28 70 4e 65 77 29 3b  iIterFree(pNew);
1a1f0 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b  .    *ppOut = 0;
1a200 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
1a210 65 61 74 65 20 61 6e 20 46 74 73 35 49 74 65 72  eate an Fts5Iter
1a220 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 74   that iterates t
1a230 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69  hrough the docli
1a240 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61  st provided.** a
1a250 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1a260 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
1a270 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
1a280 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49  terNew2(.  Fts5I
1a290 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1a2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1a2b0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
1a2c0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
1a2d0 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
1a2e0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
1a2f0 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20    /* Doclist to 
1a300 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1a310 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20  */.  int bDesc, 
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a330 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1a340 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
1a350 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73  d order */.  Fts
1a360 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  5Iter **ppOut   
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a380 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  New object */.){
1a390 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65  .  Fts5Iter *pNe
1a3a0 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35  w;.  pNew = fts5
1a3b0 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70  MultiIterAlloc(p
1a3c0 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 2);.  if( pNew
1a3d0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
1a3e0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
1a3f0 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20  ew->aSeg[1];..  
1a400 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d    pIter->flags =
1a410 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
1a420 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70  ETERM;.    if( p
1a430 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29  Data->szLeaf>0 )
1a440 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  {.      pIter->p
1a450 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20  Leaf = pData;.  
1a460 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
1a470 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
1a480 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c  Varint(pData->p,
1a490 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
1a4a0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49  Rowid);.      pI
1a4b0 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
1a4c0 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a  st = pData->nn;.
1a4d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72        pNew->aFir
1a4e0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31  st[1].iFirst = 1
1a4f0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 73  ;.      if( bDes
1a500 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  c ){.        pNe
1a510 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20  w->bRev = 1;.   
1a520 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
1a530 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
1a540 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
1a550 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
1a560 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
1a570 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
1a580 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
1a590 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
1a5a0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
1a5b0 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61     }.      pData
1a5c0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1a5d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73  .      pNew->bas
1a5e0 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  e.bEof = 1;.    
1a5f0 7d 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  }.    fts5SegIte
1a600 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65  rSetNext(p, pIte
1a610 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20  r);..    *ppOut 
1a620 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66  = pNew;.  }..  f
1a630 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
1a640 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
1a650 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1a660 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 61  he iterator is a
1a670 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65  t EOF or if an e
1a680 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
1a690 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68  d. .** False oth
1a6a0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1a6b0 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
1a6c0 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
1a6d0 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70   *p, Fts5Iter *p
1a6e0 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
1a6f0 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c   p->rc .      ||
1a700 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   (pIter->aSeg[ p
1a710 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
1a720 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d  iFirst ].pLeaf==
1a730 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e  0)==pIter->base.
1a740 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65 74  bEof .  );.  ret
1a750 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49  urn (p->rc || pI
1a760 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 29 3b  ter->base.bEof);
1a770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a780 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
1a790 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
1a7a0 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
1a7b0 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  tly points.** to
1a7c0 2e 20 49 66 20 74 68 65 20 69 74 65 72 61 74 6f  . If the iterato
1a7d0 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20  r points to EOF 
1a7e0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1a7f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
1a800 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20  .** results are 
1a810 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
1a820 61 74 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c  atic i64 fts5Mul
1a830 74 69 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  tiIterRowid(Fts5
1a840 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1a850 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61  assert( pIter->a
1a860 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1a870 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70  st[1].iFirst ].p
1a880 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75 72 6e  Leaf );.  return
1a890 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
1a8a0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1a8b0 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a  First ].iRowid;.
1a8c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1a8d0 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
1a8e0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74 20  e next entry at 
1a8f0 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61  or following iMa
1a900 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tch..*/.static v
1a910 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
1a920 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73  rNextFrom(.  Fts
1a930 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1a940 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  s5Iter *pIter, .
1a950 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a    i64 iMatch.){.
1a960 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1a970 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
1a980 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
1a990 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c  ext(p, pIter, 1,
1a9a0 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66   iMatch);.    if
1a9b0 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
1a9c0 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 20 62  of(p, pIter) ) b
1a9d0 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64  reak;.    iRowid
1a9e0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1a9f0 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
1aa00 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65    if( pIter->bRe
1aa10 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d  v==0 && iRowid>=
1aa20 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
1aa30 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
1aa40 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev!=0 && iRowid
1aa50 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  <=iMatch ) break
1aa60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1aa70 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1aa80 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1aa90 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20  aining the term 
1aaa0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1aab0 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68  the .** entry th
1aac0 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  at the iterator 
1aad0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1aae0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63   to..*/.static c
1aaf0 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c  onst u8 *fts5Mul
1ab00 74 69 49 74 65 72 54 65 72 6d 28 46 74 73 35 49  tiIterTerm(Fts5I
1ab10 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
1ab20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67 49  *pn){.  Fts5SegI
1ab30 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72 2d  ter *p = &pIter-
1ab40 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
1ab50 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
1ab60 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72  ;.  *pn = p->ter
1ab70 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  m.n;.  return p-
1ab80 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  >term.p;.}../*.*
1ab90 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1aba0 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20   segment-id for 
1abb0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 53  the structure pS
1abc0 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73  truct. The new s
1abd0 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73  egment.** id mus
1abe0 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  t be between 1 a
1abf0 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69  nd 65335 inclusi
1ac00 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74  ve, and must not
1ac10 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   be used by .** 
1ac20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78  any currently ex
1ac30 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20  isting segment. 
1ac40 49 66 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e  If a free segmen
1ac50 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66  t id cannot be f
1ac60 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
1ac70 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  FULL is returned
1ac80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1ac90 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
1aca0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
1acb0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1acc0 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74  op. 0 is .** ret
1acd0 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
1ace0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1acf0 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  t fts5AllocateSe
1ad00 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  gid(Fts5Index *p
1ad10 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
1ad20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
1ad30 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20   iSegid = 0;..  
1ad40 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1ad50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1ad60 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1ad70 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  t>=FTS5_MAX_SEGM
1ad80 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ENT ){.      p->
1ad90 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
1ada0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1adb0 20 20 20 77 68 69 6c 65 28 20 69 53 65 67 69 64     while( iSegid
1adc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
1add0 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
1ade0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
1adf0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
1ae00 28 75 33 32 29 2c 20 28 76 6f 69 64 2a 29 26 69  (u32), (void*)&i
1ae10 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
1ae20 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 20  iSegid = iSegid 
1ae30 26 20 28 28 31 20 3c 3c 20 46 54 53 35 5f 44 41  & ((1 << FTS5_DA
1ae40 54 41 5f 49 44 5f 42 29 2d 31 29 3b 0a 20 20 20  TA_ID_B)-1);.   
1ae50 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
1ae60 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1ae70 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1ae80 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 53            for(iS
1ae90 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
1aea0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1aeb0 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1aed0 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74 2d  iSegid==pStruct-
1aee0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
1aef0 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20  eg[iSeg].iSegid 
1af00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1af10 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 20 20 20   iSegid = 0;.   
1af20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1af30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1af40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1af50 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 53 65   }..  return iSe
1af60 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  gid;.}../*.** Di
1af70 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63  scard all data c
1af80 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
1af90 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c  in the hash-tabl
1afa0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1afb0 69 64 20 66 74 73 35 49 6e 64 65 78 44 69 73 63  id fts5IndexDisc
1afc0 61 72 64 44 61 74 61 28 46 74 73 35 49 6e 64 65  ardData(Fts5Inde
1afd0 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  x *p){.  assert(
1afe0 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e   p->pHash || p->
1aff0 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
1b000 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73  );.  if( p->pHas
1b010 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
1b020 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d  Fts5HashClear(p-
1b030 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e  >pHash);.    p->
1b040 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30  nPendingData = 0
1b050 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1b060 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1b070 66 20 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e  f the prefix, in
1b080 20 62 79 74 65 73 2c 20 74 68 61 74 20 62 75 66   bytes, that buf
1b090 66 65 72 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c  fer .** (pNew/<l
1b0a0 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20  ength-unknown>) 
1b0b0 73 68 61 72 65 73 20 77 69 74 68 20 62 75 66 66  shares with buff
1b0c0 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a  er (pOld/nOld)..
1b0d0 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 4e  **.** Buffer (pN
1b0e0 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f  ew/<length-unkno
1b0f0 77 6e 3e 29 20 69 73 20 67 75 61 72 61 6e 74 65  wn>) is guarante
1b100 65 64 20 74 6f 20 62 65 20 67 72 65 61 74 65 72  ed to be greater
1b110 20 0a 2a 2a 20 74 68 61 6e 20 62 75 66 66 65 72   .** than buffer
1b120 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f   (pOld/nOld)..*/
1b130 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1b140 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 69  PrefixCompress(i
1b150 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75  nt nOld, const u
1b160 38 20 2a 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75  8 *pOld, const u
1b170 38 20 2a 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20  8 *pNew){.  int 
1b180 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1b190 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
1b1a0 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65  if( pOld[i]!=pNe
1b1b0 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  w[i] ) break;.  
1b1c0 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
1b1d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b1e0 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
1b1f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1b200 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
1b210 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
1b220 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20 20 20  nt bFlush       
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b240 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69 74 65  * If true, write
1b250 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b 20 2a   dlidx to disk *
1b260 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1b270 61 73 73 65 72 74 28 20 62 46 6c 75 73 68 3d 3d  assert( bFlush==
1b280 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e  0 || (pWriter->n
1b290 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74  Dlidx>0 && pWrit
1b2a0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
1b2b0 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28  f.n>0) );.  for(
1b2c0 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
1b2d0 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20  nDlidx; i++){.  
1b2e0 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
1b2f0 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72  r *pDlidx = &pWr
1b300 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
1b310 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
1b320 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61  >buf.n==0 ) brea
1b330 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c 75 73  k;.    if( bFlus
1b340 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
1b350 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21  t( pDlidx->pgno!
1b360 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  =0 );.      fts5
1b370 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20  DataWrite(p, .  
1b380 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
1b390 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  DX_ROWID(pWriter
1b3a0 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c  ->iSegid, i, pDl
1b3b0 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20  idx->pgno),.    
1b3c0 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75        pDlidx->bu
1b3d0 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66  f.p, pDlidx->buf
1b3e0 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .n.      );.    
1b3f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
1b400 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c  5BufferZero(&pDl
1b410 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70  idx->buf);.    p
1b420 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1b430 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 0;.  }.}../*
1b440 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70 57 72  .** Grow the pWr
1b450 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61  iter->aDlidx[] a
1b460 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61 73 74  rray to at least
1b470 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69   nLvl elements i
1b480 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e  n size..** Any n
1b490 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74  ew array element
1b4a0 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62 65 66  s are zeroed bef
1b4b0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1b4c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1b4d0 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
1b4e0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1b4f0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1b500 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74   *pWriter,.  int
1b510 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70   nLvl.){.  if( p
1b520 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1b530 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72  && nLvl>=pWriter
1b540 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ->nDlidx ){.    
1b550 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
1b560 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73 35 44  *aDlidx = (Fts5D
1b570 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71 6c 69  lidxWriter*)sqli
1b580 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
1b590 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44       pWriter->aD
1b5a0 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46 74 73  lidx, sizeof(Fts
1b5b0 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20  5DlidxWriter) * 
1b5c0 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  nLvl.    );.    
1b5d0 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b  if( aDlidx==0 ){
1b5e0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
1b5f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1b600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1b610 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
1b620 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
1b630 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69  ) * (nLvl - pWri
1b640 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20  ter->nDlidx);.  
1b650 20 20 20 20 6d 65 6d 73 65 74 28 26 61 44 6c 69      memset(&aDli
1b660 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  dx[pWriter->nDli
1b670 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  dx], 0, nByte);.
1b680 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61        pWriter->a
1b690 44 6c 69 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a  Dlidx = aDlidx;.
1b6a0 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e        pWriter->n
1b6b0 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20  Dlidx = nLvl;.  
1b6c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1b6d0 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
1b6e0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1b6f0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 63  doclist-index ac
1b700 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e 20 70 57  cumulating in pW
1b710 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20  riter->aDlidx[] 
1b720 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  is large.** enou
1b730 67 68 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20  gh, flush it to 
1b740 64 69 73 6b 20 61 6e 64 20 72 65 74 75 72 6e 20  disk and return 
1b750 31 2e 20 4f 74 68 65 72 77 69 73 65 20 64 69 73  1. Otherwise dis
1b760 63 61 72 64 20 69 74 20 61 6e 64 20 72 65 74 75  card it and retu
1b770 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rn.** zero..*/.s
1b780 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72  tatic int fts5Wr
1b790 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 46 74  iteFlushDlidx(Ft
1b7a0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1b7b0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1b7c0 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67  er){.  int bFlag
1b7d0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 0;..  /* If t
1b7e0 68 65 72 65 20 77 65 72 65 20 46 54 53 35 5f 4d  here were FTS5_M
1b7f0 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72  IN_DLIDX_SIZE or
1b800 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65 61 66   more empty leaf
1b810 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 20   pages written. 
1b820 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
1b830 61 73 65 2c 20 61 6c 73 6f 20 77 72 69 74 65 20  ase, also write 
1b840 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
1b850 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20  x to disk.  */. 
1b860 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 61 44   if( pWriter->aD
1b870 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20  lidx[0].buf.n>0 
1b880 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  && pWriter->nEmp
1b890 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ty>=FTS5_MIN_DLI
1b8a0 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 62  DX_SIZE ){.    b
1b8b0 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Flag = 1;.  }.  
1b8c0 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c  fts5WriteDlidxCl
1b8d0 65 61 72 28 70 2c 20 70 57 72 69 74 65 72 2c 20  ear(p, pWriter, 
1b8e0 62 46 6c 61 67 29 3b 0a 20 20 70 57 72 69 74 65  bFlag);.  pWrite
1b8f0 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20  r->nEmpty = 0;. 
1b900 20 72 65 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d   return bFlag;.}
1b910 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1b920 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1b930 77 68 65 6e 65 76 65 72 20 70 72 6f 63 65 73 73  whenever process
1b940 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  ing of the docli
1b950 73 74 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c  st for the .** l
1b960 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66  ast term on leaf
1b970 20 70 61 67 65 20 28 70 57 72 69 74 65 72 2d 3e   page (pWriter->
1b980 69 42 74 50 61 67 65 29 20 69 73 20 63 6f 6d 70  iBtPage) is comp
1b990 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  leted. .**.** Th
1b9a0 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
1b9b0 66 6f 72 20 74 68 61 74 20 74 65 72 6d 20 69 73  for that term is
1b9c0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1b9d0 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68  d in-memory with
1b9e0 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65  in the.** Fts5Se
1b9f0 67 57 72 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d  gWriter.aDlidx[]
1ba00 20 61 72 72 61 79 2e 20 49 66 20 69 74 20 69 73   array. If it is
1ba10 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20 74   large enough, t
1ba20 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1ba30 77 72 69 74 65 73 20 69 74 20 6f 75 74 20 74 6f  writes it out to
1ba40 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74   disk. Or, if it
1ba50 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f   is too small to
1ba60 20 62 6f 74 68 65 72 20 77 69 74 68 2c 20 64 69   bother with, di
1ba70 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a  scards.** it..**
1ba80 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74 65  .** Fts5SegWrite
1ba90 72 2e 62 74 74 65 72 6d 20 63 75 72 72 65 6e 74  r.btterm current
1baa0 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ly contains the 
1bab0 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61  first term on pa
1bac0 67 65 20 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73  ge iBtPage..*/.s
1bad0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1bae0 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 46  riteFlushBtree(F
1baf0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
1bb00 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1bb10 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61  ter){.  int bFla
1bb20 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  g;..  assert( pW
1bb30 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 7c  riter->iBtPage |
1bb40 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74  | pWriter->nEmpt
1bb50 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 57  y==0 );.  if( pW
1bb60 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d  riter->iBtPage==
1bb70 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 62 46  0 ) return;.  bF
1bb80 6c 61 67 20 3d 20 66 74 73 35 57 72 69 74 65 46  lag = fts5WriteF
1bb90 6c 75 73 68 44 6c 69 64 78 28 70 2c 20 70 57 72  lushDlidx(p, pWr
1bba0 69 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d  iter);..  if( p-
1bbb0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1bbc0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1bbd0 20 2a 7a 20 3d 20 28 70 57 72 69 74 65 72 2d 3e   *z = (pWriter->
1bbe0 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73  btterm.n>0?(cons
1bbf0 74 20 63 68 61 72 2a 29 70 57 72 69 74 65 72 2d  t char*)pWriter-
1bc00 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20  >btterm.p:"");. 
1bc10 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
1bc20 69 6e 67 20 77 61 73 20 61 6c 72 65 61 64 79 20  ing was already 
1bc30 64 6f 6e 65 20 69 6e 20 66 74 73 35 57 72 69 74  done in fts5Writ
1bc40 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20  eInit(): */.    
1bc50 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  /* sqlite3_bind_
1bc60 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65  int(p->pIdxWrite
1bc70 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69  r, 1, pWriter->i
1bc80 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73  Segid); */.    s
1bc90 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
1bca0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1bcb0 32 2c 20 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62  2, z, pWriter->b
1bcc0 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f  tterm.n, SQLITE_
1bcd0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
1bce0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
1bcf0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 33  p->pIdxWriter, 3
1bd00 2c 20 62 46 6c 61 67 20 2b 20 28 28 69 36 34 29  , bFlag + ((i64)
1bd10 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1bd20 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  <<1));.    sqlit
1bd30 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 57  e3_step(p->pIdxW
1bd40 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  riter);.    p->r
1bd50 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
1bd60 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29  t(p->pIdxWriter)
1bd70 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d  ;.  }.  pWriter-
1bd80 3e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a  >iBtPage = 0;.}.
1bd90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
1bda0 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
1bdb0 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 65 78  ach leaf page ex
1bdc0 63 65 70 74 20 74 68 65 20 66 69 72 73 74 20 74  cept the first t
1bdd0 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
1bde0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72  at least one ter
1bdf0 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65  m. Argument (nTe
1be00 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65  rm/pTerm) is the
1be10 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74   split-key - a t
1be20 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c  erm that.** is l
1be30 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74  arger than all t
1be40 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20  erms written to 
1be50 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20  earlier leaves, 
1be60 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a  and equal to or.
1be70 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ** smaller than 
1be80 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
1be90 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a  n the new leaf..
1bea0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1beb0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1bec0 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
1bed0 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e  in Fts5Index.rc.
1bee0 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   If an error.** 
1bef0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
1bf00 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
1bf10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1bf20 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
1bf30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1bf40 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54   fts5WriteBtreeT
1bf50 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
1bf60 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1bf70 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1bf80 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1bf90 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1bfa0 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
1bfb0 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
1bfc0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ect */.  int nTe
1bfd0 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  rm, const u8 *pT
1bfe0 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73  erm      /* Firs
1bff0 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61  t term on new pa
1c000 67 65 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57  ge */.){.  fts5W
1c010 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 70  riteFlushBtree(p
1c020 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 66 74  , pWriter);.  ft
1c030 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
1c040 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 62 74  rc, &pWriter->bt
1c050 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
1c060 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  rm);.  pWriter->
1c070 69 42 74 50 61 67 65 20 3d 20 70 57 72 69 74 65  iBtPage = pWrite
1c080 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a  r->writer.pgno;.
1c090 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1c0a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1c0b0 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 61   when flushing a
1c0c0 20 6c 65 61 66 20 70 61 67 65 20 74 68 61 74 20   leaf page that 
1c0d0 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74  contains no.** t
1c0e0 65 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20 64  erms at all to d
1c0f0 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  isk..*/.static v
1c100 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
1c110 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35  eeNoTerm(.  Fts5
1c120 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1c130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c140 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1c150 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ct */.  Fts5SegW
1c160 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20  riter *pWriter  
1c170 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1c180 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
1c190 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72   /* If there wer
1c1a0 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74  e no rowids on t
1c1b0 68 65 20 6c 65 61 66 20 70 61 67 65 20 65 69 74  he leaf page eit
1c1c0 68 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63 6c  her and the docl
1c1d0 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68  ist-index.  ** h
1c1e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1c1f0 73 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64 20  started, append 
1c200 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20  an 0x00 byte to 
1c210 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  it.  */.  if( pW
1c220 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1c230 69 64 49 6e 50 61 67 65 20 26 26 20 70 57 72 69  idInPage && pWri
1c240 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
1c250 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74  uf.n>0 ){.    Ft
1c260 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
1c270 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1c280 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20  ->aDlidx[0];.   
1c290 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
1c2a0 3e 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20  >bPrevValid );. 
1c2b0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1c2c0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1c2d0 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1c2e0 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ->buf, 0);.  }..
1c2f0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1c300 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65  he "number of se
1c310 71 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73 20  quential leaves 
1c320 77 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22 20  without a term" 
1c330 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57  counter. */.  pW
1c340 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b  riter->nEmpty++;
1c350 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66  .}..static i64 f
1c360 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46  ts5DlidxExtractF
1c370 69 72 73 74 52 6f 77 69 64 28 46 74 73 35 42 75  irstRowid(Fts5Bu
1c380 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 69  ffer *pBuf){.  i
1c390 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74  64 iRowid;.  int
1c3a0 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d   iOff;..  iOff =
1c3b0 20 31 20 2b 20 66 74 73 35 47 65 74 56 61 72 69   1 + fts5GetVari
1c3c0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20  nt(&pBuf->p[1], 
1c3d0 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
1c3e0 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
1c3f0 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  &pBuf->p[iOff], 
1c400 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
1c410 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64 3b    return iRowid;
1c420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20  .}../*.** Rowid 
1c430 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20  iRowid has just 
1c440 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f  been appended to
1c450 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1c460 66 20 70 61 67 65 2e 20 49 74 20 69 73 20 74 68  f page. It is th
1c470 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74 68  e.** first on th
1c480 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
1c490 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e  ction appends an
1c4a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
1c4b0 72 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ry to the curren
1c4c0 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64  t.** doclist-ind
1c4d0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
1c4e0 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  id fts5WriteDlid
1c4f0 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49  xAppend(.  Fts5I
1c500 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1c510 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1c520 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  er, .  i64 iRowi
1c530 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  d.){.  int i;.  
1c540 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a  int bDone = 0;..
1c550 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
1c560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
1c570 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  Done==0; i++){. 
1c580 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
1c590 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
1c5a0 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69   *pDlidx = &pWri
1c5b0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
1c5c0 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
1c5d0 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
1c5e0 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
1c5f0 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
1c600 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70   doclist-index p
1c610 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69  age is full. Wri
1c620 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e  te it to disk an
1c630 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a 20  d push.      ** 
1c640 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69 64  a copy of iRowid
1c650 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63   (which will bec
1c660 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20 72 6f  ome the first ro
1c670 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a  wid on the next.
1c680 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74        ** doclist
1c690 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67 65  -index leaf page
1c6a0 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e 65  ) up into the ne
1c6b0 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  xt level of the 
1c6c0 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a  b-tree .      **
1c6d0 20 68 69 65 72 61 72 63 68 79 2e 20 49 66 20 74   hierarchy. If t
1c6e0 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c  he node being fl
1c6f0 75 73 68 65 64 20 69 73 20 63 75 72 72 65 6e 74  ushed is current
1c700 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ly the root node
1c710 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ,.      ** also 
1c720 70 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72  push its first r
1c730 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a 2f  owid upwards. */
1c740 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  .      pDlidx->b
1c750 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20  uf.p[0] = 0x01; 
1c760 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f     /* Not the ro
1c770 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20  ot node */.     
1c780 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
1c790 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53  , .          FTS
1c7a0 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57  5_DLIDX_ROWID(pW
1c7b0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
1c7c0 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c  , pDlidx->pgno),
1c7d0 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64  .          pDlid
1c7e0 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78  x->buf.p, pDlidx
1c7f0 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b  ->buf.n.      );
1c800 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1c810 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72  DlidxGrow(p, pWr
1c820 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20  iter, i+2);.    
1c830 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69    pDlidx = &pWri
1c840 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
1c850 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1c860 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
1c870 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30  lidx[1].buf.n==0
1c880 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
1c890 69 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c 69  iFirst = fts5Dli
1c8a0 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
1c8b0 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75 66  wid(&pDlidx->buf
1c8c0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
1c8d0 68 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f 74  his was the root
1c8e0 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73 20   node. Push its 
1c8f0 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 20 74  first rowid up t
1c900 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20  o the new root. 
1c910 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  */.        pDlid
1c920 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69  x[1].pgno = pDli
1c930 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  dx->pgno;.      
1c940 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1c950 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1c960 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
1c970 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20  1].buf, 0);.    
1c980 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1c990 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1c9a0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1c9b0 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78  x[1].buf, pDlidx
1c9c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1c9d0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1c9e0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1c9f0 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
1ca00 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b 0a  ].buf, iFirst);.
1ca10 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
1ca20 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31  ].bPrevValid = 1
1ca30 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  ;.        pDlidx
1ca40 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69 72  [1].iPrev = iFir
1ca50 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  st;.      }..   
1ca60 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1ca70 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
1ca80 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70 44  ->buf);.      pD
1ca90 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
1caa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c 69   = 0;.      pDli
1cab0 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20  dx->pgno++;.    
1cac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44 6f  }else{.      bDo
1cad0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ne = 1;.    }.. 
1cae0 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62     if( pDlidx->b
1caf0 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20  PrevValid ){.   
1cb00 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
1cb10 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76   - pDlidx->iPrev
1cb20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cb30 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20 28     i64 iPgno = (
1cb40 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e  i==0 ? pWriter->
1cb50 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44  writer.pgno : pD
1cb60 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a  lidx[-1].pgno);.
1cb70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
1cb80 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29  lidx->buf.n==0 )
1cb90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
1cba0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1cbb0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1cbc0 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f  Dlidx->buf, !bDo
1cbd0 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ne);.      sqlit
1cbe0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1cbf0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1cc00 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69   &pDlidx->buf, i
1cc10 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56 61  Pgno);.      iVa
1cc20 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  l = iRowid;.    
1cc30 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  }..    sqlite3Ft
1cc40 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1cc50 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1cc60 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29  lidx->buf, iVal)
1cc70 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50  ;.    pDlidx->bP
1cc80 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  revValid = 1;.  
1cc90 20 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 20    pDlidx->iPrev 
1cca0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a  = iRowid;.  }.}.
1ccb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1ccc0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1ccd0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1cce0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1ccf0 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  iter){.  static 
1cd00 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20  const u8 zero[] 
1cd10 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20  = { 0x00, 0x00, 
1cd20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x00, 0x00 };.  
1cd30 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1cd40 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1cd50 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34 20  ->writer;.  i64 
1cd60 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72  iRowid;..  asser
1cd70 74 28 20 28 70 50 61 67 65 2d 3e 70 67 69 64 78  t( (pPage->pgidx
1cd80 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65 72  .n==0)==(pWriter
1cd90 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1cda0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  ge) );..  /* Set
1cdb0 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64   the szLeaf head
1cdc0 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61  er field. */.  a
1cdd0 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65  ssert( 0==fts5Ge
1cde0 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
1cdf0 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73 35  .p[2]) );.  fts5
1ce00 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  PutU16(&pPage->b
1ce10 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 70 50  uf.p[2], (u16)pP
1ce20 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20  age->buf.n);..  
1ce30 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1ce40 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
1ce50 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20  .    /* No term 
1ce60 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  was written to t
1ce70 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  his page. */.   
1ce80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1ce90 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20  pgidx.n==0 );.  
1cea0 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
1ceb0 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65  NoTerm(p, pWrite
1cec0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1ced0 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70   /* Append the p
1cee0 67 69 64 78 20 74 6f 20 74 68 65 20 70 61 67 65  gidx to the page
1cef0 20 62 75 66 66 65 72 2e 20 53 65 74 20 74 68 65   buffer. Set the
1cf00 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66   szLeaf header f
1cf10 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73  ield. */.    fts
1cf20 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1cf30 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1cf40 2d 3e 62 75 66 2c 20 70 50 61 67 65 2d 3e 70 67  ->buf, pPage->pg
1cf50 69 64 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67  idx.n, pPage->pg
1cf60 69 64 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  idx.p);.  }..  /
1cf70 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
1cf80 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a   out to disk */.
1cf90 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
1cfa0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
1cfb0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70  riter->iSegid, p
1cfc0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66  Page->pgno);.  f
1cfd0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
1cfe0 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62  iRowid, pPage->b
1cff0 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66  uf.p, pPage->buf
1d000 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .n);..  /* Initi
1d010 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70  alize the next p
1d020 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
1d030 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d  fferZero(&pPage-
1d040 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66  >buf);.  fts5Buf
1d050 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e  ferZero(&pPage->
1d060 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75  pgidx);.  fts5Bu
1d070 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1d080 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1d090 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20  uf, 4, zero);.  
1d0a0 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
1d0b0 78 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  x = 0;.  pPage->
1d0c0 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e  pgno++;..  /* In
1d0d0 63 72 65 61 73 65 20 74 68 65 20 6c 65 61 76 65  crease the leave
1d0e0 73 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65  s written counte
1d0f0 72 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  r */.  pWriter->
1d100 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a  nLeafWritten++;.
1d110 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65  .  /* The new le
1d120 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d  af holds no term
1d130 73 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20  s or rowids */. 
1d140 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1d150 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a  TermInPage = 1;.
1d160 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1d170 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31  tRowidInPage = 1
1d180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1d190 64 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65  d term pTerm/nTe
1d1a0 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e  rm to the segmen
1d1b0 74 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  t being written 
1d1c0 62 79 20 74 68 65 20 77 72 69 74 65 72 20 70 61  by the writer pa
1d1d0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73  ssed.** as the s
1d1e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
1d1f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1d200 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68  r occurs, set th
1d210 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
1d220 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e  rror code. If an
1d230 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
1d240 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1d250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1d260 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1d270 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1d280 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  iteAppendTerm(. 
1d290 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1d2a0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1d2b0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
1d2c0 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20  nTerm, const u8 
1d2d0 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74  *pTerm .){.  int
1d2e0 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d300 42 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20  Bytes of prefix 
1d310 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20  compression for 
1d320 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61  term */.  Fts5Pa
1d330 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1d340 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1d350 65 72 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  er;.  Fts5Buffer
1d360 20 2a 70 50 67 69 64 78 20 3d 20 26 70 57 72 69   *pPgidx = &pWri
1d370 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64  ter->writer.pgid
1d380 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  x;..  assert( p-
1d390 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1d3a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1d3b0 65 2d 3e 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20  e->buf.n>=4 );. 
1d3c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1d3d0 62 75 66 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74  buf.n>4 || pWrit
1d3e0 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1d3f0 50 61 67 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Page );..  /* If
1d400 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1d410 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20  f page is full, 
1d420 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b  flush it to disk
1d430 2e 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 67  . */.  if( (pPag
1d440 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 67 69 64  e->buf.n + pPgid
1d450 78 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32  x->n + nTerm + 2
1d460 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  )>=p->pConfig->p
1d470 67 73 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  gsz ){.    if( p
1d480 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b  Page->buf.n>4 ){
1d490 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1d4a0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1d4b0 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  iter);.    }.   
1d4c0 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28   fts5BufferGrow(
1d4d0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1d4e0 62 75 66 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f  buf, nTerm+FTS5_
1d4f0 44 41 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20  DATA_PADDING);. 
1d500 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31   }.  .  /* TODO1
1d510 3a 20 55 70 64 61 74 69 6e 67 20 70 67 69 64 78  : Updating pgidx
1d520 20 68 65 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69   here. */.  pPgi
1d530 64 78 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  dx->n += sqlite3
1d540 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 0a 20  Fts5PutVarint(. 
1d550 20 20 20 20 20 26 70 50 67 69 64 78 2d 3e 70 5b       &pPgidx->p[
1d560 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67  pPgidx->n], pPag
1d570 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67 65  e->buf.n - pPage
1d580 2d 3e 69 50 72 65 76 50 67 69 64 78 0a 20 20 29  ->iPrevPgidx.  )
1d590 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76  ;.  pPage->iPrev
1d5a0 50 67 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 62  Pgidx = pPage->b
1d5b0 75 66 2e 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74  uf.n;.#if 0.  ft
1d5c0 73 35 50 75 74 55 31 36 28 26 70 50 67 69 64 78  s5PutU16(&pPgidx
1d5d0 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20  ->p[pPgidx->n], 
1d5e0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
1d5f0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b   pPgidx->n += 2;
1d600 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
1d610 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1d620 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  rmInPage ){.    
1d630 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20  nPrefix = 0;.   
1d640 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f   if( pPage->pgno
1d650 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=1 ){.      /* 
1d660 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  This is the firs
1d670 74 20 74 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66  t term on a leaf
1d680 20 74 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65   that is not the
1d690 20 6c 65 66 74 6d 6f 73 74 20 6c 65 61 66 20 69   leftmost leaf i
1d6a0 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  n.      ** the s
1d6b0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 49  egment b-tree. I
1d6c0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
1d6d0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
1d6e0 64 64 20 61 20 74 65 72 6d 20 74 6f 0a 20 20 20  dd a term to.   
1d6f0 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65     ** the b-tree
1d700 20 68 69 65 72 61 72 63 68 79 20 74 68 61 74 20   hierarchy that 
1d710 69 73 20 28 61 29 20 6c 61 72 67 65 72 20 74 68  is (a) larger th
1d720 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 74  an the largest t
1d730 65 72 6d 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c  erm .      ** al
1d740 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
1d750 20 74 68 65 20 73 65 67 6d 65 6e 74 20 61 6e 64   the segment and
1d760 20 28 62 29 20 73 6d 61 6c 6c 65 72 20 74 68 61   (b) smaller tha
1d770 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20  n or equal to.  
1d780 20 20 20 20 2a 2a 20 74 68 69 73 20 74 65 72 6d      ** this term
1d790 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
1d7a0 2c 20 61 20 70 72 65 66 69 78 20 6f 66 20 28 70  , a prefix of (p
1d7b0 54 65 72 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74  Term/nTerm) that
1d7c0 20 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   is one.      **
1d7d0 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61   byte longer tha
1d7e0 6e 20 74 68 65 20 6c 6f 6e 67 65 73 74 20 70 72  n the longest pr
1d7f0 65 66 69 78 20 28 70 54 65 72 6d 2f 6e 54 65 72  efix (pTerm/nTer
1d800 6d 29 20 73 68 61 72 65 73 20 77 69 74 68 20 74  m) shares with t
1d810 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 76  he.      ** prev
1d820 69 6f 75 73 20 74 65 72 6d 2e 20 0a 20 20 20 20  ious term. .    
1d830 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73    **.      ** Us
1d840 75 61 6c 6c 79 2c 20 74 68 65 20 70 72 65 76 69  ually, the previ
1d850 6f 75 73 20 74 65 72 6d 20 69 73 20 61 76 61 69  ous term is avai
1d860 6c 61 62 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e  lable in pPage->
1d870 74 65 72 6d 2e 20 54 68 65 20 65 78 63 65 70 74  term. The except
1d880 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ion.      ** is 
1d890 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1d8a0 69 72 73 74 20 74 65 72 6d 20 77 72 69 74 74 65  irst term writte
1d8b0 6e 20 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e  n in an incremen
1d8c0 74 61 6c 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a  tal-merge step..
1d8d0 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
1d8e0 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
1d8f0 75 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61  us term is not a
1d900 76 61 69 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73  vailable, so jus
1d910 74 20 77 72 69 74 65 20 61 0a 20 20 20 20 20 20  t write a.      
1d920 2a 2a 20 63 6f 70 79 20 6f 66 20 28 70 54 65 72  ** copy of (pTer
1d930 6d 2f 6e 54 65 72 6d 29 20 69 6e 74 6f 20 74 68  m/nTerm) into th
1d940 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54  e parent node. T
1d950 68 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a  his is slightly.
1d960 20 20 20 20 20 20 2a 2a 20 69 6e 65 66 66 69 63        ** ineffic
1d970 69 65 6e 74 2c 20 62 75 74 20 73 74 69 6c 6c 20  ient, but still 
1d980 63 6f 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20  correct.  */.   
1d990 20 20 20 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d     int n = nTerm
1d9a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
1d9b0 65 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20  e->term.n ){.   
1d9c0 20 20 20 20 20 6e 20 3d 20 31 20 2b 20 66 74 73       n = 1 + fts
1d9d0 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
1d9e0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70  pPage->term.n, p
1d9f0 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54  Page->term.p, pT
1da00 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  erm);.      }.  
1da10 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
1da20 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65  eeTerm(p, pWrite
1da30 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20  r, n, pTerm);.  
1da40 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72      pPage = &pWr
1da50 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
1da60 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1da70 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35 50   nPrefix = fts5P
1da80 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
1da90 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61  age->term.n, pPa
1daa0 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72  ge->term.p, pTer
1dab0 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  m);.    fts5Buff
1dac0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1dad0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1dae0 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  uf, nPrefix);.  
1daf0 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
1db00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1db10 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20  es of new data, 
1db20 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61  then the term da
1db30 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74  ta itself.  ** t
1db40 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  o the page. */. 
1db50 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1db60 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1db70 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
1db80 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20  rm - nPrefix);. 
1db90 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1dba0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1dbb0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
1dbc0 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65   - nPrefix, &pTe
1dbd0 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20  rm[nPrefix]);.. 
1dbe0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46   /* Update the F
1dbf0 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65  ts5PageWriter.te
1dc00 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66  rm field. */.  f
1dc10 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
1dc20 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72  >rc, &pPage->ter
1dc30 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
1dc40 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
1dc50 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1dc60 30 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62  0;..  pWriter->b
1dc70 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1dc80 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 0;.  pWriter-
1dc90 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
1dca0 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73  clist = 1;..  as
1dcb0 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28  sert( p->rc || (
1dcc0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e  pWriter->nDlidx>
1dcd0 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44  0 && pWriter->aD
1dce0 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30  lidx[0].buf.n==0
1dcf0 29 20 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ) );.  pWriter->
1dd00 61 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d  aDlidx[0].pgno =
1dd10 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a   pPage->pgno;.}.
1dd20 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1dd30 72 6f 77 69 64 20 61 6e 64 20 70 6f 73 69 74 69  rowid and positi
1dd40 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
1dd50 6c 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 72  ld to the writer
1dd60 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74  s output. .*/.st
1dd70 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1dd80 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a  iteAppendRowid(.
1dd90 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1dda0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1ddb0 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34   *pWriter,.  i64
1ddc0 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28   iRowid.){.  if(
1ddd0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1dde0 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  K ){.    Fts5Pag
1ddf0 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
1de00 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1de10 72 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50 61  r;..    if( (pPa
1de20 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67  ge->buf.n + pPag
1de30 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e  e->pgidx.n)>=p->
1de40 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
1de50 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1de60 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1de70 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  iter);.    }..  
1de80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1de90 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
1dea0 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f  rowid written to
1deb0 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
1dec0 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  he .    ** rowid
1ded0 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
1dee0 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
1def0 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
1df00 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
1df10 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20    ** buffer, in 
1df20 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  case a doclist-i
1df30 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64  ndex is required
1df40 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  .  */.    if( pW
1df50 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1df60 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
1df70 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61    fts5PutU16(pPa
1df80 67 65 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36 29  ge->buf.p, (u16)
1df90 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
1dfa0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
1dfb0 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72  idxAppend(p, pWr
1dfc0 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
1dfd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69     }..    /* Wri
1dfe0 74 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f  te the rowid. */
1dff0 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
1e000 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
1e010 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65  oclist || pWrite
1e020 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1e030 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
1e040 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1e050 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1e060 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  age->buf, iRowid
1e070 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e080 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
1e090 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72 69  c || iRowid>pWri
1e0a0 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20  ter->iPrevRowid 
1e0b0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
1e0c0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1e0d0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1e0e0 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 70 57  buf, iRowid - pW
1e0f0 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1e100 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
1e110 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1e120 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  d = iRowid;.    
1e130 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1e140 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
1e150 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  0;.    pWriter->
1e160 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1e170 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  e = 0;.  }.}..st
1e180 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1e190 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
1e1a0 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65  Data(.  Fts5Inde
1e1b0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1e1c0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1e1d0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44   .  const u8 *aD
1e1e0 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74  ata, .  int nDat
1e1f0 61 0a 29 7b 0a 20 20 46 74 73 35 50 61 67 65 57  a.){.  Fts5PageW
1e200 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
1e210 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1e220 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d  .  const u8 *a =
1e230 20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20   aData;.  int n 
1e240 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20 61 73  = nData;.  .  as
1e250 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67  sert( p->pConfig
1e260 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68  ->pgsz>0 );.  wh
1e270 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1e280 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 28  TE_OK .     && (
1e290 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70  pPage->buf.n + p
1e2a0 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 20 2b 20  Page->pgidx.n + 
1e2b0 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  n)>=p->pConfig->
1e2c0 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20 20 20 69  pgsz .  ){.    i
1e2d0 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f  nt nReq = p->pCo
1e2e0 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61  nfig->pgsz - pPa
1e2f0 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67  ge->buf.n - pPag
1e300 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20 20 20 20  e->pgidx.n;.    
1e310 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20  int nCopy = 0;. 
1e320 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c     while( nCopy<
1e330 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20 69 36  nReq ){.      i6
1e340 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e  4 dummy;.      n
1e350 43 6f 70 79 20 2b 3d 20 66 74 73 35 47 65 74 56  Copy += fts5GetV
1e360 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c  arint(&a[nCopy],
1e370 20 28 75 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a   (u64*)&dummy);.
1e380 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
1e390 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1e3a0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1e3b0 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20  uf, nCopy, a);. 
1e3c0 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20     a += nCopy;. 
1e3d0 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20     n -= nCopy;. 
1e3e0 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1e3f0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
1e400 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  );.  }.  if( n>0
1e410 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
1e420 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1e430 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1e440 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  , n, a);.  }.}..
1e450 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
1e460 64 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74  data cached by t
1e470 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74  he writer object
1e480 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1e490 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c  . Free any.** al
1e4a0 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
1e4b0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72  ated with the wr
1e4c0 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iter..*/.static 
1e4d0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69  void fts5WriteFi
1e4e0 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  nish(.  Fts5Inde
1e4f0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1e500 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1e510 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1e520 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1e530 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20  nt *pnLeaf      
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e550 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
1e560 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e 20 62   leaf pages in b
1e570 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  -tree */.){.  in
1e580 74 20 69 3b 0a 20 20 46 74 73 35 50 61 67 65 57  t i;.  Fts5PageW
1e590 72 69 74 65 72 20 2a 70 4c 65 61 66 20 3d 20 26  riter *pLeaf = &
1e5a0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1e5b0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1e5c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1e5d0 73 73 65 72 74 28 20 70 4c 65 61 66 2d 3e 70 67  ssert( pLeaf->pg
1e5e0 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  no>=1 );.    if(
1e5f0 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e 34 20   pLeaf->buf.n>4 
1e600 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
1e610 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
1e620 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Writer);.    }. 
1e630 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65     *pnLeaf = pLe
1e640 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20  af->pgno-1;.    
1e650 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74  fts5WriteFlushBt
1e660 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b  ree(p, pWriter);
1e670 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
1e680 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 74 65  rFree(&pLeaf->te
1e690 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  rm);.  fts5Buffe
1e6a0 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 62 75  rFree(&pLeaf->bu
1e6b0 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  f);.  fts5Buffer
1e6c0 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 70 67 69  Free(&pLeaf->pgi
1e6d0 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  dx);.  fts5Buffe
1e6e0 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e  rFree(&pWriter->
1e6f0 62 74 74 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28  btterm);..  for(
1e700 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
1e710 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20  nDlidx; i++){.  
1e720 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1e730 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72  ferFree(&pWriter
1e740 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66 29  ->aDlidx[i].buf)
1e750 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1e760 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44  free(pWriter->aD
1e770 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  lidx);.}..static
1e780 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49   void fts5WriteI
1e790 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
1e7a0 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1e7b0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
1e7c0 0a 20 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b  .  int iSegid.){
1e7d0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
1e7e0 66 66 65 72 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  ffer = p->pConfi
1e7f0 67 2d 3e 70 67 73 7a 20 2b 20 46 54 53 35 5f 44  g->pgsz + FTS5_D
1e800 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 0a 20 20  ATA_PADDING;..  
1e810 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
1e820 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
1e830 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72  gWriter));.  pWr
1e840 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69  iter->iSegid = i
1e850 53 65 67 69 64 3b 0a 0a 20 20 66 74 73 35 57 72  Segid;..  fts5Wr
1e860 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20  iteDlidxGrow(p, 
1e870 70 57 72 69 74 65 72 2c 20 31 29 3b 0a 20 20 70  pWriter, 1);.  p
1e880 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1e890 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  gno = 1;.  pWrit
1e8a0 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1e8b0 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69  Page = 1;.  pWri
1e8c0 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 31  ter->iBtPage = 1
1e8d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 72  ;..  assert( pWr
1e8e0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1e8f0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  .n==0 );.  asser
1e900 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74  t( pWriter->writ
1e910 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b  er.pgidx.n==0 );
1e920 0a 0a 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20  ..  /* Grow the 
1e930 74 77 6f 20 62 75 66 66 65 72 73 20 74 6f 20 70  two buffers to p
1e940 67 73 7a 20 2b 20 70 61 64 64 69 6e 67 20 62 79  gsz + padding by
1e950 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a  tes in size. */.
1e960 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1e970 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
1e980 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1e990 2e 70 67 69 64 78 2c 20 6e 42 75 66 66 65 72 29  .pgidx, nBuffer)
1e9a0 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  ;.  sqlite3Fts5B
1e9b0 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
1e9c0 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  , &pWriter->writ
1e9d0 65 72 2e 62 75 66 2c 20 6e 42 75 66 66 65 72 29  er.buf, nBuffer)
1e9e0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78  ;..  if( p->pIdx
1e9f0 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  Writer==0 ){.   
1ea00 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
1ea10 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
1ea20 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
1ea30 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
1ea40 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 73  p->pIdxWriter, s
1ea50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
1ea60 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
1ea70 54 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f  T INTO '%q'.'%q_
1ea80 69 64 78 27 28 73 65 67 69 64 2c 74 65 72 6d 2c  idx'(segid,term,
1ea90 70 67 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c 3f  pgno) VALUES(?,?
1eaa0 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ,?)", .         
1eab0 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
1eac0 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
1ead0 20 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28    ));.  }..  if(
1eae0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1eaf0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  K ){.    /* Init
1eb00 69 61 6c 69 7a 65 20 74 68 65 20 34 2d 62 79 74  ialize the 4-byt
1eb10 65 20 6c 65 61 66 2d 70 61 67 65 20 68 65 61 64  e leaf-page head
1eb20 65 72 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a 20  er to 0x00. */. 
1eb30 20 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65     memset(pWrite
1eb40 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 70 2c  r->writer.buf.p,
1eb50 20 30 2c 20 34 29 3b 0a 20 20 20 20 70 57 72 69   0, 4);.    pWri
1eb60 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e  ter->writer.buf.
1eb70 6e 20 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20 42  n = 4;..    /* B
1eb80 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
1eb90 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69  output segment i
1eba0 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2d 77  d to the index-w
1ebb0 72 69 74 65 72 2e 20 54 68 69 73 20 69 73 20 61  riter. This is a
1ebc0 6e 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a  n.    ** optimiz
1ebd0 61 74 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64 69  ation over bindi
1ebe0 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  ng the same valu
1ebf0 65 20 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 20  e over and over 
1ec00 61 73 20 72 6f 77 73 20 61 72 65 0a 20 20 20 20  as rows are.    
1ec10 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
1ec20 20 25 5f 69 64 78 20 62 79 20 74 68 65 20 63 75   %_idx by the cu
1ec30 72 72 65 6e 74 20 77 72 69 74 65 72 2e 20 20 2a  rrent writer.  *
1ec40 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  /.    sqlite3_bi
1ec50 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72  nd_int(p->pIdxWr
1ec60 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72  iter, 1, pWriter
1ec70 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d  ->iSegid);.  }.}
1ec80 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
1ec90 20 70 49 74 65 72 20 77 61 73 20 75 73 65 64 20   pIter was used 
1eca0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1ecb0 67 68 20 74 68 65 20 69 6e 70 75 74 20 73 65 67  gh the input seg
1ecc0 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a  ments of on an.*
1ecd0 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * incremental me
1ece0 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  rge operation. T
1ecf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ed00 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e  called if the in
1ed10 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72  cremental.** mer
1ed20 67 65 20 73 74 65 70 20 68 61 73 20 66 69 6e 69  ge step has fini
1ed30 73 68 65 64 20 62 75 74 20 74 68 65 20 69 6e 70  shed but the inp
1ed40 75 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ut has not been 
1ed50 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75  completely exhau
1ed60 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
1ed70 76 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65 67  void fts5TrimSeg
1ed80 6d 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20  ments(Fts5Index 
1ed90 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
1eda0 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ter){.  int i;. 
1edb0 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
1edc0 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20  .  memset(&buf, 
1edd0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
1ede0 66 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d  ffer));.  for(i=
1edf0 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
1ee00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
1ee10 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
1ee20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
1ee30 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
1ee40 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Seg==0 ){.      
1ee50 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
1ee60 7d 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e  }else if( pSeg->
1ee70 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
1ee80 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72    /* All keys fr
1ee90 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 65  om this input se
1eea0 67 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20  gment have been 
1eeb0 74 72 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68  transfered to th
1eec0 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  e output..      
1eed0 2a 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65 20  ** Set both the 
1eee0 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70  first and last p
1eef0 61 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30  age-numbers to 0
1ef00 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1ef10 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  t the.      ** s
1ef20 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d  egment is now em
1ef30 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53  pty. */.      pS
1ef40 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  eg->pSeg->pgnoLa
1ef50 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  st = 0;.      pS
1ef60 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eg->pSeg->pgnoFi
1ef70 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rst = 0;.    }el
1ef80 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f  se{.      int iO
1ef90 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d  ff = pSeg->iTerm
1efa0 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20  LeafOffset;     
1efb0 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77  /* Offset on new
1efc0 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65   first leaf page
1efd0 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c   */.      i64 iL
1efe0 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  eafRowid;.      
1eff0 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
1f000 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d  .      int iId =
1f010 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65   pSeg->pSeg->iSe
1f020 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48  gid;.      u8 aH
1f030 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30  dr[4] = {0x00, 0
1f040 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d  x00, 0x00, 0x00}
1f050 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f  ;..      iLeafRo
1f060 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
1f070 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53  NT_ROWID(iId, pS
1f080 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  eg->iTermLeafPgn
1f090 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20  o);.      pData 
1f0a0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
1f0b0 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  , iLeafRowid);. 
1f0c0 20 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29       if( pData )
1f0d0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
1f0e0 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a  fferZero(&buf);.
1f0f0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f100 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26  erGrow(&p->rc, &
1f110 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b  buf, pData->nn);
1f120 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f130 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1f140 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65  ->rc, &buf, size
1f150 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b  of(aHdr), aHdr);
1f160 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f170 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1f180 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
1f190 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  eg->term.n);.   
1f1a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f1b0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1f1c0 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
1f1d0 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d  rm.n, pSeg->term
1f1e0 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .p);.        fts
1f1f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1f200 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
1f210 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f  pData->szLeaf-iO
1f220 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f  ff, &pData->p[iO
1f230 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ff]);.        if
1f240 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1f250 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1f260 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  /* Set the szLea
1f270 66 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20  f field */.     
1f280 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28       fts5PutU16(
1f290 26 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29  &buf.p[2], (u16)
1f2a0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  buf.n);.        
1f2b0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  }..        /* Se
1f2c0 74 20 75 70 20 74 68 65 20 6e 65 77 20 70 61 67  t up the new pag
1f2d0 65 2d 69 6e 64 65 78 20 61 72 72 61 79 20 2a 2f  e-index array */
1f2e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f2f0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1f300 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29  &p->rc, &buf, 4)
1f310 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
1f320 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70  eg->iLeafPgno==p
1f330 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
1f340 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  no .         && 
1f350 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  pSeg->iEndofDocl
1f360 69 73 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61  ist<pData->szLea
1f370 66 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  f .        ){.  
1f380 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 69 66          int nDif
1f390 66 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61  f = pData->szLea
1f3a0 66 20 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66  f - pSeg->iEndof
1f3b0 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20  Doclist;.       
1f3c0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f3d0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1f3e0 2c 20 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20  , &buf, buf.n - 
1f3f0 31 20 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a  1 - nDiff - 4);.
1f400 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1f410 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1f420 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20 20  p->rc, &buf, .  
1f430 20 20 20 20 20 20 20 20 20 20 20 20 70 44 61 74              pDat
1f440 61 2d 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50  a->nn - pSeg->iP
1f450 67 69 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d  gidxOff, &pData-
1f460 3e 70 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f  >p[pSeg->iPgidxO
1f470 66 66 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ff].          );
1f480 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1f490 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
1f4a0 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
1f4b0 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
1f4c0 70 67 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67  pgnoFirst = pSeg
1f4d0 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  ->iTermLeafPgno;
1f4e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
1f4f0 61 44 65 6c 65 74 65 28 70 2c 20 46 54 53 35 5f  aDelete(p, FTS5_
1f500 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1f510 64 2c 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69  d, 1), iLeafRowi
1f520 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
1f530 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65  DataWrite(p, iLe
1f540 61 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20  afRowid, buf.p, 
1f550 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  buf.n);.      }.
1f560 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35      }.  }.  fts5
1f570 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
1f580 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1f590 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43   fts5MergeChunkC
1f5a0 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
1f5b0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64  ndex *p, .  void
1f5c0 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74   *pCtx, .  const
1f5d0 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74   u8 *pChunk, int
1f5e0 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73   nChunk.){.  Fts
1f5f0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1f600 74 65 72 20 3d 20 28 46 74 73 35 53 65 67 57 72  ter = (Fts5SegWr
1f610 69 74 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74  iter*)pCtx;.  ft
1f620 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
1f630 6c 69 73 74 44 61 74 61 28 70 2c 20 70 57 72 69  listData(p, pWri
1f640 74 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  ter, pChunk, nCh
1f650 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  unk);.}../*.**.*
1f660 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1f670 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
1f680 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  l(.  Fts5Index *
1f690 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1f6a0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1f6b0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1f6c0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1f6d0 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
1f6e0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63   /* IN/OUT: Stuc
1f6f0 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
1f700 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20  .  int iLvl,    
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72     /* Level to r
1f730 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a  ead input from *
1f740 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20  /.  int *pnRem  
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f760 20 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20      /* Write up 
1f770 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74  to this many out
1f780 70 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b  put leaves */.){
1f790 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1f7a0 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
1f7b0 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72  truct;.  Fts5Str
1f7c0 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
1f7d0 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
1f7e0 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74  evel[iLvl];.  Ft
1f7f0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
1f800 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73   *pLvlOut;.  Fts
1f810 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30  5Iter *pIter = 0
1f820 3b 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61  ;       /* Itera
1f830 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75  tor to read inpu
1f840 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  t data */.  int 
1f850 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a  nRem = pnRem ? *
1f860 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f  pnRem : 0;  /* O
1f870 75 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73  utput leaf pages
1f880 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a   left to write *
1f890 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20  /.  int nInput; 
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f8c0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1f8d0 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
1f8e0 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20  er writer;      
1f8f0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
1f900 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1f910 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
1f920 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75  *pSeg;     /* Ou
1f930 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  tput segment */.
1f940 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
1f950 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74  m;.  int bOldest
1f960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f970 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f980 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
1f990 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74  nt is the oldest
1f9a0 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 74 61 69   */.  int eDetai
1f9b0 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
1f9c0 65 44 65 74 61 69 6c 3b 0a 20 20 63 6f 6e 73 74  eDetail;.  const
1f9d0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
1f9e0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f  5INDEX_QUERY_NOO
1f9f0 55 54 50 55 54 3b 0a 0a 20 20 61 73 73 65 72 74  UTPUT;..  assert
1fa00 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ( iLvl<pStruct->
1fa10 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65  nLevel );.  asse
1fa20 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
1fa30 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
1fa40 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65  .  memset(&write
1fa50 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
1fa60 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
1fa70 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c  memset(&term, 0,
1fa80 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
1fa90 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c  er));.  if( pLvl
1faa0 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
1fab0 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75  pLvlOut = &pStru
1fac0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b  ct->aLevel[iLvl+
1fad0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1fae0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20  pLvlOut->nSeg>0 
1faf0 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20  );.    nInput = 
1fb00 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20  pLvl->nMerge;.  
1fb10 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
1fb20 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
1fb30 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66  >nSeg-1];..    f
1fb40 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1fb50 26 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69  &writer, pSeg->i
1fb60 53 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74  Segid);.    writ
1fb70 65 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d  er.writer.pgno =
1fb80 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b   pSeg->pgnoLast+
1fb90 31 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42  1;.    writer.iB
1fba0 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  tPage = 0;.  }el
1fbb0 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  se{.    int iSeg
1fbc0 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74  id = fts5Allocat
1fbd0 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63  eSegid(p, pStruc
1fbe0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65  t);..    /* Exte
1fbf0 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63  nd the Fts5Struc
1fc00 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72  ture object as r
1fc10 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72  equired to ensur
1fc20 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  e the output.   
1fc30 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73   ** segment exis
1fc40 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ts. */.    if( i
1fc50 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c  Lvl==pStruct->nL
1fc60 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  evel-1 ){.      
1fc70 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
1fc80 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70  Level(&p->rc, pp
1fc90 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
1fca0 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1fcb0 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ct;.    }.    ft
1fcc0 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
1fcd0 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
1fce0 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20  Struct, iLvl+1, 
1fcf0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
1fd00 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
1fd10 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75     pLvl = &pStru
1fd20 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1fd30 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20  ;.    pLvlOut = 
1fd40 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1fd50 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66  [iLvl+1];..    f
1fd60 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1fd70 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
1fd80 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
1fd90 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f  e new segment to
1fda0 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65   the output leve
1fdb0 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20  l */.    pSeg = 
1fdc0 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
1fdd0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20  LvlOut->nSeg];. 
1fde0 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
1fdf0 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67  ++;.    pSeg->pg
1fe00 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
1fe10 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
1fe20 69 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72  iSegid;.    pStr
1fe30 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b  uct->nSegment++;
1fe40 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e  ..    /* Read in
1fe50 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67  put from all seg
1fe60 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70  ments in the inp
1fe70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
1fe80 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e  nInput = pLvl->n
1fe90 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65  Seg;.  }.  bOlde
1fea0 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e  st = (pLvlOut->n
1feb0 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63  Seg==1 && pStruc
1fec0 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b  t->nLevel==iLvl+
1fed0 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  2);..  assert( i
1fee0 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28  Lvl>=0 );.  for(
1fef0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
1ff00 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61  (p, pStruct, fla
1ff10 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76  gs, 0, 0, 0, iLv
1ff20 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65  l, nInput, &pIte
1ff30 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
1ff40 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
1ff50 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
1ff60 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
1ff70 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
1ff80 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  .  ){.    Fts5Se
1ff90 67 49 74 65 72 20 2a 70 53 65 67 49 74 65 72 20  gIter *pSegIter 
1ffa0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
1ffb0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
1ffc0 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69  .iFirst ];.    i
1ffd0 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fff0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
20000 7a 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20 2a  ze field value *
20010 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b  /.    int nTerm;
20020 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
20030 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  Term;..    /* Ch
20040 65 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69  eck for key anni
20050 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  hilation. */.   
20060 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e   if( pSegIter->n
20070 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65  Pos==0 && (bOlde
20080 73 74 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e  st || pSegIter->
20090 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69  bDel==0) ) conti
200a0 6e 75 65 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20  nue;..    pTerm 
200b0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
200c0 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72  erm(pIter, &nTer
200d0 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72  m);.    if( nTer
200e0 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d  m!=term.n || mem
200f0 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e  cmp(pTerm, term.
20100 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20  p, nTerm) ){.   
20110 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26 26 20     if( pnRem && 
20120 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74  writer.nLeafWrit
20130 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20  ten>nRem ){.    
20140 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20150 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   }..      /* Thi
20160 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e  s is a new term.
20170 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74   Append a term t
20180 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  o the output seg
20190 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66  ment. */.      f
201a0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65  ts5WriteAppendTe
201b0 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e  rm(p, &writer, n
201c0 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
201d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
201e0 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c  t(&p->rc, &term,
201f0 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
20200 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70      }..    /* Ap
20210 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74  pend the rowid t
20220 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
20230 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
20240 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 66  ISTSIZE */.    f
20250 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f  ts5WriteAppendRo
20260 77 69 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  wid(p, &writer, 
20270 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
20280 69 64 28 70 49 74 65 72 29 29 3b 0a 0a 20 20 20  id(pIter));..   
20290 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54   if( eDetail==FT
202a0 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
202b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67  {.      if( pSeg
202c0 49 74 65 72 2d 3e 62 44 65 6c 20 29 7b 0a 20 20  Iter->bDel ){.  
202d0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
202e0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
202f0 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69  >rc, &writer.wri
20300 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20  ter.buf, 0);.   
20310 20 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65       if( pSegIte
20320 72 2d 3e 6e 50 6f 73 3e 30 20 29 7b 0a 20 20 20  r->nPos>0 ){.   
20330 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
20340 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
20350 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72  ->rc, &writer.wr
20360 69 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20  iter.buf, 0);.  
20370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20390 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70   /* Append the p
203a0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74  osition-list dat
203b0 61 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  a to the output 
203c0 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20  */.      nPos = 
203d0 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32  pSegIter->nPos*2
203e0 20 2b 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65   + pSegIter->bDe
203f0 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  l;.      fts5Buf
20400 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
20410 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e  &p->rc, &writer.
20420 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 50 6f 73  writer.buf, nPos
20430 29 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75  );.      fts5Chu
20440 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
20450 67 49 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77  gIter, (void*)&w
20460 72 69 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65  riter, fts5Merge
20470 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a  ChunkCallback);.
20480 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20490 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74 20 6c  Flush the last l
204a0 65 61 66 20 70 61 67 65 20 74 6f 20 64 69 73 6b  eaf page to disk
204b0 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  . Set the output
204c0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
204d0 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20  height.  ** and 
204e0 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  last leaf page n
204f0 75 6d 62 65 72 20 61 74 20 74 68 65 20 73 61 6d  umber at the sam
20500 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74  e time.  */.  ft
20510 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
20520 20 26 77 72 69 74 65 72 2c 20 26 70 53 65 67 2d   &writer, &pSeg-
20530 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69  >pgnoLast);..  i
20540 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  f( fts5MultiIter
20550 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 7b  Eof(p, pIter) ){
20560 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
20570 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
20580 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
20590 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  s from the %_dat
205a0 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66  a table */.    f
205b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74  or(i=0; i<nInput
205c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
205d0 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
205e0 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53 65  ent(p, pLvl->aSe
205f0 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  g[i].iSegid);.  
20600 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
20610 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
20620 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
20630 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a  he input level *
20640 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  /.    if( pLvl->
20650 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a  nSeg!=nInput ){.
20660 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20        int nMove 
20670 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20  = (pLvl->nSeg - 
20680 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66  nInput) * sizeof
20690 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
206a0 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65  gment);.      me
206b0 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67  mmove(pLvl->aSeg
206c0 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49  , &pLvl->aSeg[nI
206d0 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20  nput], nMove);. 
206e0 20 20 20 7d 0a 20 20 20 20 70 53 74 72 75 63 74     }.    pStruct
206f0 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49  ->nSegment -= nI
20700 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  nput;.    pLvl->
20710 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a  nSeg -= nInput;.
20720 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
20730 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53   = 0;.    if( pS
20740 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20  eg->pgnoLast==0 
20750 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74  ){.      pLvlOut
20760 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20  ->nSeg--;.      
20770 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
20780 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  t--;.    }.  }el
20790 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
207a0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30  pSeg->pgnoLast>0
207b0 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69 6d   );.    fts5Trim
207c0 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74 65  Segments(p, pIte
207d0 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d  r);.    pLvl->nM
207e0 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20  erge = nInput;. 
207f0 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49   }..  fts5MultiI
20800 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a  terFree(pIter);.
20810 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
20820 28 26 74 65 72 6d 29 3b 0a 20 20 69 66 28 20 70  (&term);.  if( p
20830 6e 52 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d  nRem ) *pnRem -=
20840 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69   writer.nLeafWri
20850 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  tten;.}../*.** D
20860 6f 20 75 70 20 74 6f 20 6e 50 67 20 70 61 67 65  o up to nPg page
20870 73 20 6f 66 20 61 75 74 6f 6d 65 72 67 65 20 77  s of automerge w
20880 6f 72 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  ork on the index
20890 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
208a0 72 75 65 20 69 66 20 61 6e 79 20 63 68 61 6e 67  rue if any chang
208b0 65 73 20 77 65 72 65 20 61 63 74 75 61 6c 6c 79  es were actually
208c0 20 6d 61 64 65 2c 20 6f 72 20 66 61 6c 73 65 20   made, or false 
208d0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
208e0 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
208f0 65 78 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49  exMerge(.  Fts5I
20900 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
20910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
20920 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
20930 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
20940 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c  ture **ppStruct,
20950 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
20960 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74  : Current struct
20970 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
20980 20 20 69 6e 74 20 6e 50 67 2c 20 20 20 20 20 20    int nPg,      
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209a0 20 20 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f    /* Pages of wo
209b0 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 6e  rk to do */.  in
209c0 74 20 6e 4d 69 6e 20 20 20 20 20 20 20 20 20 20  t nMin          
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
209e0 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Minimum number 
209f0 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d  of segments to m
20a00 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  erge */.){.  int
20a10 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20 20 69   nRem = nPg;.  i
20a20 6e 74 20 62 52 65 74 20 3d 20 30 3b 0a 20 20 46  nt bRet = 0;.  F
20a30 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
20a40 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
20a50 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52 65 6d  t;.  while( nRem
20a60 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  >0 && p->rc==SQL
20a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
20a80 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
20a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
20aa0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
20ab0 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e  levels */.    in
20ac0 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b 20  t iBestLvl = 0; 
20ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
20ae0 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68 65 20  el offering the 
20af0 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67 6d 65  most input segme
20b00 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
20b10 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
20b20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20b30 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
20b40 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c  ts on best level
20b50 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
20b60 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68 65 20  iBestLvl to the 
20b70 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  level to read in
20b80 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  put segments fro
20b90 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  m. */.    assert
20ba0 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
20bb0 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  l>0 );.    for(i
20bc0 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
20bd0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
20be0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
20bf0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
20c00 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
20c10 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
20c20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
20c30 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 20  Merge ){.       
20c40 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
20c50 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20  e>nBest ){.     
20c60 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
20c70 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  iLvl;.          
20c80 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d  nBest = pLvl->nM
20c90 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  erge;.        }.
20ca0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20cc0 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73   pLvl->nSeg>nBes
20cd0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 65  t ){.        nBe
20ce0 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  st = pLvl->nSeg;
20cf0 0a 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76  .        iBestLv
20d00 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20  l = iLvl;.      
20d10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
20d20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74 69 6c  If nBest is stil
20d30 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  l 0, then the in
20d40 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d 70 74  dex must be empt
20d50 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y. */.#ifdef SQL
20d60 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 6f  ITE_DEBUG.    fo
20d70 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d  r(iLvl=0; nBest=
20d80 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75  =0 && iLvl<pStru
20d90 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
20da0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
20db0 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  t( pStruct->aLev
20dc0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30  el[iLvl].nSeg==0
20dd0 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
20de0 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73 74 3c  ..    if( nBest<
20df0 6e 4d 69 6e 20 26 26 20 70 53 74 72 75 63 74 2d  nMin && pStruct-
20e00 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c  >aLevel[iBestLvl
20e10 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ].nMerge==0 ){. 
20e20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20e30 7d 0a 20 20 20 20 62 52 65 74 20 3d 20 31 3b 0a  }.    bRet = 1;.
20e40 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
20e50 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72  geLevel(p, &pStr
20e60 75 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26  uct, iBestLvl, &
20e70 6e 52 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  nRem);.    if( p
20e80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20e90 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
20ea0 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65  el[iBestLvl].nMe
20eb0 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rge==0 ){.      
20ec0 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
20ed0 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c  mote(p, iBestLvl
20ee0 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  +1, pStruct);.  
20ef0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72    }.  }.  *ppStr
20f00 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20  uct = pStruct;. 
20f10 20 72 65 74 75 72 6e 20 62 52 65 74 3b 0a 7d 0a   return bRet;.}.
20f20 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  ./*.** A total o
20f30 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67  f nLeaf leaf pag
20f40 65 73 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a  es of data has j
20f50 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64  ust been flushed
20f60 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a   to a level-0.**
20f70 20 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20 66   segment. This f
20f80 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20  unction updates 
20f90 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65  the write-counte
20fa0 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e  r accordingly an
20fb0 64 2c 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61  d, if.** necessa
20fc0 72 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e 63  ry, performs inc
20fd0 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 77  remental merge w
20fe0 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ork..**.** If an
20ff0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
21000 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  et the Fts5Index
21010 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .rc error code. 
21020 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
21030 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
21040 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
21050 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
21060 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
21070 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67  ts5IndexAutomerg
21080 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
21090 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
210a0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
210b0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
210c0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
210d0 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
210e0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
210f0 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66  ent structure of
21100 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
21110 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  nLeaf           
21120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21130 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
21140 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69 74  leaves just writ
21150 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ten */.){.  if( 
21160 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
21170 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e   && p->pConfig->
21180 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a  nAutomerge>0 ){.
21190 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
211a0 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
211b0 53 74 72 75 63 74 3b 0a 20 20 20 20 75 36 34 20  Struct;.    u64 
211c0 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
211d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
211e0 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72  tial value of wr
211f0 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ite-counter */. 
21200 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20     int nWork;   
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21220 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f   /* Number of wo
21230 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72  rk-quanta to per
21240 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  form */.    int 
21250 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nRem;           
21260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21270 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
21280 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20  s left to write 
21290 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  */..    /* Updat
212a0 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e  e the write-coun
212b0 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67  ter. While doing
212c0 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20   so, set nWork. 
212d0 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20  */.    nWrite = 
212e0 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
212f0 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72  ounter;.    nWor
21300 6b 20 3d 20 28 69 6e 74 29 28 28 28 6e 57 72 69  k = (int)(((nWri
21310 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d  te + nLeaf) / p-
21320 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e  >nWorkUnit) - (n
21330 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b  Write / p->nWork
21340 55 6e 69 74 29 29 3b 0a 20 20 20 20 70 53 74 72  Unit));.    pStr
21350 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
21360 65 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20  er += nLeaf;.   
21370 20 6e 52 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d   nRem = (int)(p-
21380 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f  >nWorkUnit * nWo
21390 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c  rk * pStruct->nL
213a0 65 76 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35  evel);..    fts5
213b0 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 70 70  IndexMerge(p, pp
213c0 53 74 72 75 63 74 2c 20 6e 52 65 6d 2c 20 70 2d  Struct, nRem, p-
213d0 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d  >pConfig->nAutom
213e0 65 72 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  erge);.  }.}..st
213f0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
21400 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a  dexCrisismerge(.
21410 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
21440 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
21450 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
21460 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a  Struct        /*
21470 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
21480 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
21490 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  dex */.){.  cons
214a0 74 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20  t int nCrisis = 
214b0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69  p->pConfig->nCri
214c0 73 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35  sisMerge;.  Fts5
214d0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
214e0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
214f0 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a    int iLvl = 0;.
21500 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
21510 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
21520 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30  Struct->nLevel>0
21530 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
21540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21550 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
21560 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72  [iLvl].nSeg>=nCr
21570 69 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35  isis ){.    fts5
21580 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
21590 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76  p, &pStruct, iLv
215a0 6c 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  l, 0);.    asser
215b0 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
215c0 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e  _OK || pStruct->
215d0 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20  nLevel>(iLvl+1) 
215e0 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
215f0 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
21600 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b  Lvl+1, pStruct);
21610 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d  .    iLvl++;.  }
21620 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70  .  *ppStruct = p
21630 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69  Struct;.}..stati
21640 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52  c int fts5IndexR
21650 65 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20  eturn(Fts5Index 
21660 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
21670 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d  p->rc;.  p->rc =
21680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65   SQLITE_OK;.  re
21690 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65  turn rc;.}..type
216a0 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46  def struct Fts5F
216b0 6c 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73  lushCtx Fts5Flus
216c0 68 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73  hCtx;.struct Fts
216d0 35 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74  5FlushCtx {.  Ft
216e0 73 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20  s5Index *pIdx;. 
216f0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
21700 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a  riter; .};../*.*
21710 2a 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20  * Buffer aBuf[] 
21720 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20  contains a list 
21730 6f 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20  of varints, all 
21740 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20  small enough to 
21750 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62  fit.** in a 32-b
21760 69 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75  it integer. Retu
21770 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
21780 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69  he largest prefi
21790 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69  x of this .** li
217a0 73 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72  st nMax bytes or
217b0 20 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a   less in size..*
217c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
217d0 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63  5PoslistPrefix(c
217e0 6f 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69  onst u8 *aBuf, i
217f0 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  nt nMax){.  int 
21800 72 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79  ret;.  u32 dummy
21810 3b 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65  ;.  ret = fts5Ge
21820 74 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20  tVarint32(aBuf, 
21830 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 65  dummy);.  if( re
21840 74 3c 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77 68  t<nMax ){.    wh
21850 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
21860 69 6e 74 20 69 20 3d 20 66 74 73 35 47 65 74 56  int i = fts5GetV
21870 61 72 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65  arint32(&aBuf[re
21880 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  t], dummy);.    
21890 20 20 69 66 28 20 28 72 65 74 20 2b 20 69 29 20    if( (ret + i) 
218a0 3e 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a  > nMax ) break;.
218b0 20 20 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a        ret += i;.
218c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
218d0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
218e0 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65   Flush the conte
218f0 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  nts of in-memory
21900 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73   hash table iHas
21910 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c  h to a new level
21920 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f  -0 .** segment o
21930 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64  n disk. Also upd
21940 61 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ate the correspo
21950 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  nding structure 
21960 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  record..**.** If
21970 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21980 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
21990 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
219a0 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
219b0 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
219c0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
219d0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
219e0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
219f0 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61  d fts5FlushOneHa
21a00 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  sh(Fts5Index *p)
21a10 7b 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70 48  {.  Fts5Hash *pH
21a20 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a  ash = p->pHash;.
21a30 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
21a40 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20  *pStruct;.  int 
21a50 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67  iSegid;.  int pg
21a60 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20  noLast = 0;     
21a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
21a80 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
21a90 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
21aa0 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
21ab0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
21ac0 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
21ad0 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  re and allocate 
21ae0 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
21af0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
21b00 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e  w level-0 segmen
21b10 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74  t.  */.  pStruct
21b20 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
21b30 52 65 61 64 28 70 29 3b 0a 20 20 69 53 65 67 69  Read(p);.  iSegi
21b40 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
21b50 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
21b60 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
21b70 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b  reInvalidate(p);
21b80 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 20 29  ..  if( iSegid )
21b90 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
21ba0 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  pgsz = p->pConfi
21bb0 67 2d 3e 70 67 73 7a 3b 0a 20 20 20 20 69 6e 74  g->pgsz;.    int
21bc0 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
21bd0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
21be0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
21bf0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
21c00 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74    /* New segment
21c10 20 77 69 74 68 69 6e 20 70 53 74 72 75 63 74 20   within pStruct 
21c20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  */.    Fts5Buffe
21c30 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20  r *pBuf;        
21c40 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69       /* Buffer i
21c50 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d  n which to assem
21c60 62 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f  ble leaf page */
21c70 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
21c80 2a 70 50 67 69 64 78 3b 20 20 20 20 20 20 20 20  *pPgidx;        
21c90 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20     /* Buffer in 
21ca0 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c  which to assembl
21cb0 65 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20 20  e pgidx */..    
21cc0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
21cd0 69 74 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72  iter;.    fts5Wr
21ce0 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74  iteInit(p, &writ
21cf0 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20  er, iSegid);..  
21d00 20 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72    pBuf = &writer
21d10 2e 77 72 69 74 65 72 2e 62 75 66 3b 0a 20 20 20  .writer.buf;.   
21d20 20 70 50 67 69 64 78 20 3d 20 26 77 72 69 74 65   pPgidx = &write
21d30 72 2e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a  r.writer.pgidx;.
21d40 0a 20 20 20 20 2f 2a 20 66 74 73 35 57 72 69 74  .    /* fts5Writ
21d50 65 49 6e 69 74 28 29 20 73 68 6f 75 6c 64 20 68  eInit() should h
21d60 61 76 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ave initialized 
21d70 74 68 65 20 62 75 66 66 65 72 73 20 74 6f 20 28  the buffers to (
21d80 6d 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20 20  most likely).   
21d90 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
21da0 73 70 61 63 65 20 72 65 71 75 69 72 65 64 2e 20  space required. 
21db0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
21dc0 2d 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e 53  ->rc || pBuf->nS
21dd0 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54  pace>=(pgsz + FT
21de0 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29  S5_DATA_PADDING)
21df0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21e00 70 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64 78 2d  p->rc || pPgidx-
21e10 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b  >nSpace>=(pgsz +
21e20 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49   FTS5_DATA_PADDI
21e30 4e 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 42  NG) );..    /* B
21e40 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68  egin scanning th
21e50 72 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c 65  rough hash table
21e60 20 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c   entries. This l
21e70 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
21e80 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65  r each.    ** te
21e90 72 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65  rm/doclist curre
21ea0 6e 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68  ntly stored with
21eb0 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
21ec0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  e. */.    if( p-
21ed0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
21ee0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
21ef0 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
21f00 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30  canInit(pHash, 0
21f10 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
21f20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
21f30 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71  LITE_OK && 0==sq
21f40 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
21f50 6e 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20  nEof(pHash) ){. 
21f60 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
21f70 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *zTerm;         
21f80 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
21f90 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20  ining term */.  
21fa0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44      const u8 *pD
21fb0 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oclist;         
21fc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f  /* Pointer to do
21fd0 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 74  clist for this t
21fe0 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  erm */.      int
21ff0 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20   nDoclist;      
22000 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
22010 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
22020 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  ytes */..      /
22030 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 72 6d  * Write the term
22040 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20   for this entry 
22050 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20 20  to disk. */.    
22060 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
22070 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68  hScanEntry(pHash
22080 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c  , &zTerm, &pDocl
22090 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b  ist, &nDoclist);
220a0 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
220b0 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77  AppendTerm(p, &w
220c0 72 69 74 65 72 2c 20 28 69 6e 74 29 73 74 72 6c  riter, (int)strl
220d0 65 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73  en(zTerm), (cons
220e0 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20  t u8*)zTerm);.. 
220f0 20 20 20 20 20 61 73 73 65 72 74 28 20 77 72 69       assert( wri
22100 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49  ter.bFirstRowidI
22110 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
22120 20 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75    if( pgsz>=(pBu
22130 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
22140 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29   + nDoclist + 1)
22150 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
22160 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
22170 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
22180 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
22190 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
221a0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
221b0 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69  lob(pBuf, pDocli
221c0 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
221d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
221e0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
221f0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
22200 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20  iDelta = 0;.    
22210 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30      int iOff = 0
22220 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
22230 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
22240 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
22250 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20   this leaf. The 
22260 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20  following .     
22270 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61     ** loop itera
22280 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  tes through the 
22290 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61  poslists that ma
222a0 6b 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e  ke up the curren
222b0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  t .        ** do
222c0 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  clist.  */.     
222d0 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
222e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f  =SQLITE_OK && iO
222f0 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ff<nDoclist ){. 
22300 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
22310 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
22320 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
22330 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
22340 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
22350 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
22360 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
22370 20 69 66 28 20 77 72 69 74 65 72 2e 62 46 69 72   if( writer.bFir
22380 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b  stRowidInPage ){
22390 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
223a0 35 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70  5PutU16(&pBuf->p
223b0 5b 30 5d 2c 20 28 75 31 36 29 70 42 75 66 2d 3e  [0], (u16)pBuf->
223c0 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72  n);   /* first r
223d0 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  owid on page */.
223e0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
223f0 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
22400 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
22410 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69  f->p[pBuf->n], i
22420 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
22430 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72 73      writer.bFirs
22440 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
22450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
22460 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
22470 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69  nd(p, &writer, i
22480 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
22490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
224a0 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20       pBuf->n += 
224b0 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
224c0 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  rint(&pBuf->p[pB
224d0 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b  uf->n], iDelta);
224e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
224f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22500 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53  Buf->n<=pBuf->nS
22510 70 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20  pace );..       
22520 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
22530 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
22540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22550 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73  if( iOff<nDoclis
22560 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f  t && pDoclist[iO
22570 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ff]==0 ){.      
22580 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b          pBuf->p[
22590 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a  pBuf->n++] = 0;.
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4f                iO
225b0 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ff++;.          
225c0 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f      if( iOff<nDo
225d0 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73  clist && pDoclis
225e0 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20  t[iOff]==0 ){.  
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
22600 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d  uf->p[pBuf->n++]
22610 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22620 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20        iOff++;.  
22630 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22640 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22650 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75          if( (pBu
22660 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
22670 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  )>=pgsz ){.     
22680 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
22690 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26  teFlushLeaf(p, &
226a0 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20  writer);.       
226b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
226c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
226d0 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
226e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
226f0 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nPos;.          
22700 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 66 74    int nCopy = ft
22710 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
22720 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d  (&pDoclist[iOff]
22730 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
22740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
22750 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20  Copy += nPos;.  
22760 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
22770 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d  Buf->n + pPgidx-
22780 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70  >n + nCopy) <= p
22790 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
227a0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
227b0 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20  re poslist will 
227c0 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  fit on the curre
227d0 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79  nt leaf. So copy
227e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
227f0 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20  * it in one go. 
22800 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
22810 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
22820 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
22830 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
22840 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20   nCopy);.       
22850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22870 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20   entire poslist 
22880 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
22890 74 68 69 73 20 6c 65 61 66 2e 20 53 6f 20 69 74  this leaf. So it
228a0 20 6e 65 65 64 73 0a 20 20 20 20 20 20 20 20 20   needs.         
228b0 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 62 72       ** to be br
228c0 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f  oken into sectio
228d0 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75 61  ns. The only qua
228e0 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69 6e 67  lification being
228f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
22900 2a 20 74 68 61 74 20 65 61 63 68 20 76 61 72 69  * that each vari
22910 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65  nt must be store
22920 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20  d contiguously. 
22930 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22940 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73    const u8 *pPos
22950 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74  list = &pDoclist
22960 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20  [iOff];.        
22970 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d        int iPos =
22980 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
22990 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
229a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
229c0 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d   nSpace = pgsz -
229d0 20 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64   pBuf->n - pPgid
229e0 78 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  x->n;.          
229f0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
22a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22a10 20 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69 50   if( (nCopy - iP
22a20 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20  os)<=nSpace ){. 
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a40 20 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f   n = nCopy - iPo
22a50 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s;.             
22a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22a70 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
22a80 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69  fts5PoslistPrefi
22a90 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73  x(&pPoslist[iPos
22aa0 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 20 20  ], nSpace);.    
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
22ad0 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20  sert( n>0 );.   
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
22af0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
22b00 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f  dBlob(pBuf, &pPo
22b10 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b  slist[iPos], n);
22b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22b30 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20   iPos += n;.    
22b40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22b50 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64  (pBuf->n + pPgid
22b60 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20  x->n)>=pgsz ){. 
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
22b90 65 61 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b  eaf(p, &writer);
22ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22bb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
22bc0 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f     if( iPos>=nCo
22bd0 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  py ) break;.    
22be0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22c00 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43        iOff += nC
22c10 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  opy;.          }
22c20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22c30 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   }..      /* TOD
22c40 4f 32 3a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d  O2: Doclist term
22c50 69 6e 61 74 6f 72 20 77 72 69 74 74 65 6e 20 68  inator written h
22c60 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  ere. */.      /*
22c70 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e   pBuf->p[pBuf->n
22c80 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20  ++] = '\0'; */. 
22c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75       assert( pBu
22ca0 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61  f->n<=pBuf->nSpa
22cb0 63 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ce );.      sqli
22cc0 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e  te3Fts5HashScanN
22cd0 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20 20 20  ext(pHash);.    
22ce0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
22cf0 35 48 61 73 68 43 6c 65 61 72 28 70 48 61 73 68  5HashClear(pHash
22d00 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  );.    fts5Write
22d10 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65  Finish(p, &write
22d20 72 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  r, &pgnoLast);..
22d30 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
22d40 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
22d50 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20 62   It is written b
22d60 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
22d70 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a  ase by the.    *
22d80 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  * fts5StructureR
22d90 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65  elease() call be
22da0 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  low.  */.    if(
22db0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
22dc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
22dd0 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
22de0 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72  el(&p->rc, &pStr
22df0 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uct);.    }.    
22e00 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
22e10 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
22e20 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20   pStruct, 0, 1, 
22e30 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  0);.    if( p->r
22e40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22e50 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 53        pSeg = &pS
22e60 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
22e70 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e  .aSeg[ pStruct->
22e80 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b  aLevel[0].nSeg++
22e90 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   ];.      pSeg->
22ea0 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
22eb0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
22ec0 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
22ed0 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74    pSeg->pgnoLast
22ee0 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
22ef0 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
22f00 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ment++;.    }.  
22f10 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
22f20 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74  romote(p, 0, pSt
22f30 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74  ruct);.  }..  ft
22f40 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65  s5IndexAutomerge
22f50 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67  (p, &pStruct, pg
22f60 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 49  noLast);.  fts5I
22f70 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28  ndexCrisismerge(
22f80 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20  p, &pStruct);.  
22f90 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
22fa0 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  te(p, pStruct);.
22fb0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
22fc0 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
22fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
22fe0 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20  any data stored 
22ff0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
23000 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20   hash tables to 
23010 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
23020 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
23030 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35  5IndexFlush(Fts5
23040 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a 20  Index *p){.  /* 
23050 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d 70  Unless it is emp
23060 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68 61  ty, flush the ha
23070 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
23080 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 65   */.  if( p->nPe
23090 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20  ndingData ){.   
230a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73   assert( p->pHas
230b0 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e  h );.    p->nPen
230c0 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20  dingData = 0;.  
230d0 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61    fts5FlushOneHa
230e0 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  sh(p);.  }.}..st
230f0 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75  atic Fts5Structu
23100 72 65 20 2a 66 74 73 35 49 6e 64 65 78 4f 70 74  re *fts5IndexOpt
23110 69 6d 69 7a 65 53 74 72 75 63 74 28 0a 20 20 46  imizeStruct(.  F
23120 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
23130 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
23140 53 74 72 75 63 74 0a 29 7b 0a 20 20 46 74 73 35  Struct.){.  Fts5
23150 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20  Structure *pNew 
23160 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
23170 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   = sizeof(Fts5St
23180 72 75 63 74 75 72 65 29 3b 0a 20 20 69 6e 74 20  ructure);.  int 
23190 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
231a0 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20  nSegment;.  int 
231b0 69 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  i;..  /* Figure 
231c0 6f 75 74 20 69 66 20 74 68 69 73 20 73 74 72 75  out if this stru
231d0 63 74 75 72 65 20 72 65 71 75 69 72 65 73 20 6f  cture requires o
231e0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 41 20 73  ptimization. A s
231f0 74 72 75 63 74 75 72 65 20 64 6f 65 73 0a 20 20  tructure does.  
23200 2a 2a 20 6e 6f 74 20 72 65 71 75 69 72 65 20 6f  ** not require o
23210 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 65  ptimization if e
23220 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ither:.  **.  **
23230 20 20 2b 20 69 74 20 63 6f 6e 73 69 73 74 73 20    + it consists 
23240 6f 66 20 66 65 77 65 72 20 74 68 61 6e 20 74 77  of fewer than tw
23250 6f 20 73 65 67 6d 65 6e 74 73 2c 20 6f 72 20 0a  o segments, or .
23260 20 20 2a 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d    **  + all segm
23270 65 6e 74 73 20 61 72 65 20 6f 6e 20 74 68 65 20  ents are on the 
23280 73 61 6d 65 20 6c 65 76 65 6c 2c 20 6f 72 0a 20  same level, or. 
23290 20 2a 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65   **  + all segme
232a0 6e 74 73 20 65 78 63 65 70 74 20 6f 6e 65 20 61  nts except one a
232b0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 70  re currently inp
232c0 75 74 73 20 74 6f 20 61 20 6d 65 72 67 65 20 6f  uts to a merge o
232d0 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  peration..  **. 
232e0 20 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74   ** In the first
232f0 20 63 61 73 65 2c 20 72 65 74 75 72 6e 20 4e 55   case, return NU
23300 4c 4c 2e 20 49 6e 20 74 68 65 20 73 65 63 6f 6e  LL. In the secon
23310 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  d, increment the
23320 20 72 65 66 2d 63 6f 75 6e 74 0a 20 20 2a 2a 20   ref-count.  ** 
23330 6f 6e 20 2a 70 53 74 72 75 63 74 20 61 6e 64 20  on *pStruct and 
23340 72 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  return a copy of
23350 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
23360 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  it..  */.  if( n
23370 53 65 67 3c 32 20 29 20 72 65 74 75 72 6e 20 30  Seg<2 ) return 0
23380 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
23390 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
233a0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54  i++){.    int nT
233b0 68 69 73 20 3d 20 70 53 74 72 75 63 74 2d 3e 61  his = pStruct->a
233c0 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 0a 20  Level[i].nSeg;. 
233d0 20 20 20 69 66 28 20 6e 54 68 69 73 3d 3d 6e 53     if( nThis==nS
233e0 65 67 20 7c 7c 20 28 6e 54 68 69 73 3d 3d 6e 53  eg || (nThis==nS
233f0 65 67 2d 31 20 26 26 20 70 53 74 72 75 63 74 2d  eg-1 && pStruct-
23400 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67  >aLevel[i].nMerg
23410 65 3d 3d 6e 54 68 69 73 29 20 29 7b 0a 20 20 20  e==nThis) ){.   
23420 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
23430 52 65 66 28 70 53 74 72 75 63 74 29 3b 0a 20 20  Ref(pStruct);.  
23440 20 20 20 20 72 65 74 75 72 6e 20 70 53 74 72 75      return pStru
23450 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ct;.    }.    as
23460 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61  sert( pStruct->a
23470 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3c  Level[i].nMerge<
23480 3d 6e 54 68 69 73 20 29 3b 0a 20 20 7d 0a 0a 20  =nThis );.  }.. 
23490 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75   nByte += (pStru
234a0 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20  ct->nLevel+1) * 
234b0 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
234c0 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20 70 4e  tureLevel);.  pN
234d0 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  ew = (Fts5Struct
234e0 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ure*)sqlite3Fts5
234f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
23500 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66  c, nByte);..  if
23510 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74  ( pNew ){.    Ft
23520 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
23530 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 69 6e 74 20   *pLvl;.    int 
23540 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73  nByte = nSeg * s
23550 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
23560 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
23570 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pNew->nLevel = 
23580 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
23590 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65  1;.    pNew->nRe
235a0 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d  f = 1;.    pNew-
235b0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d  >nWriteCounter =
235c0 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
235d0 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76  Counter;.    pLv
235e0 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65  l = &pNew->aLeve
235f0 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l[pStruct->nLeve
23600 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53  l];.    pLvl->aS
23610 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  eg = (Fts5Struct
23620 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69  ureSegment*)sqli
23630 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
23640 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
23650 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  ;.    if( pLvl->
23660 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e  aSeg ){.      in
23670 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20  t iLvl, iSeg;.  
23680 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20      int iSegOut 
23690 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49 74  = 0;.      /* It
236a0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
236b0 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66 72 6f 6d  l segments, from
236c0 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73   oldest to newes
236d0 74 2e 20 41 64 64 20 74 68 65 6d 20 74 6f 0a 20  t. Add them to. 
236e0 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
236f0 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a 65 63 74  Fts5Level object
23700 20 73 6f 20 74 68 61 74 20 70 4c 76 6c 2d 3e 61   so that pLvl->a
23710 53 65 67 5b 30 5d 20 69 73 20 74 68 65 20 6f 6c  Seg[0] is the ol
23720 64 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  dest.      ** se
23730 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  gment in the dat
23740 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f  a structure.  */
23750 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  .      for(iLvl=
23760 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d  pStruct->nLevel-
23770 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69 4c 76 6c  1; iLvl>=0; iLvl
23780 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  --){.        for
23790 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
237a0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
237b0 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
237c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  ){.          pLv
237d0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d  l->aSeg[iSegOut]
237e0 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
237f0 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
23800 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
23810 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20  SegOut++;.      
23820 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23830 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74    pNew->nSegment
23840 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20   = pLvl->nSeg = 
23850 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nSeg;.    }else{
23860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
23870 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
23880 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d   pNew = 0;.    }
23890 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
238a0 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  New;.}..int sqli
238b0 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69  te3Fts5IndexOpti
238c0 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a  mize(Fts5Index *
238d0 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
238e0 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
238f0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
23900 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  New = 0;..  asse
23910 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
23920 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e  E_OK );.  fts5In
23930 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 70  dexFlush(p);.  p
23940 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
23950 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
23960 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
23970 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20  validate(p);..  
23980 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
23990 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 6e     pNew = fts5In
239a0 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63  dexOptimizeStruc
239b0 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  t(p, pStruct);. 
239c0 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74 75   }.  fts5Structu
239d0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
239e0 74 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  t);..  assert( p
239f0 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65 77 2d 3e  New==0 || pNew->
23a00 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  nSegment>0 );.  
23a10 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
23a20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20 20 66 6f  int iLvl;.    fo
23a30 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65 77 2d 3e  r(iLvl=0; pNew->
23a40 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
23a50 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29 7b 7d 0a  g==0; iLvl++){}.
23a60 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
23a70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
23a80 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  New->aLevel[iLvl
23a90 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20  ].nSeg>0 ){.    
23aa0 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53    int nRem = FTS
23ab0 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b  5_OPT_WORK_UNIT;
23ac0 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78  .      fts5Index
23ad0 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70  MergeLevel(p, &p
23ae0 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d  New, iLvl, &nRem
23af0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  );.    }..    ft
23b00 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
23b10 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66  (p, pNew);.    f
23b20 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
23b30 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  ase(pNew);.  }..
23b40 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
23b50 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a  exReturn(p); .}.
23b60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
23b70 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  alled to impleme
23b80 6e 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 22  nt the special "
23b90 56 41 4c 55 45 53 28 27 6d 65 72 67 65 27 2c 20  VALUES('merge', 
23ba0 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20 49 4e 53  $nMerge)".** INS
23bb0 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ERT command..*/.
23bc0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
23bd0 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e  ndexMerge(Fts5In
23be0 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72  dex *p, int nMer
23bf0 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  ge){.  Fts5Struc
23c00 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
23c10 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
23c20 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74 72  d(p);.  if( pStr
23c30 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  uct ){.    int n
23c40 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  Min = p->pConfig
23c50 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b 0a 20 20  ->nUsermerge;.  
23c60 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
23c70 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20  nvalidate(p);.  
23c80 20 20 69 66 28 20 6e 4d 65 72 67 65 3c 30 20 29    if( nMerge<0 )
23c90 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
23ca0 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 66 74  cture *pNew = ft
23cb0 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53  s5IndexOptimizeS
23cc0 74 72 75 63 74 28 70 2c 20 70 53 74 72 75 63 74  truct(p, pStruct
23cd0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  );.      fts5Str
23ce0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
23cf0 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
23d00 74 72 75 63 74 20 3d 20 70 4e 65 77 3b 0a 20 20  truct = pNew;.  
23d10 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b 0a 20 20      nMin = 2;.  
23d20 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 6e 4d 65      nMerge = nMe
23d30 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  rge*-1;.    }.  
23d40 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
23d50 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
23d60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 74   ){.      if( ft
23d70 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20  s5IndexMerge(p, 
23d80 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67 65  &pStruct, nMerge
23d90 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20 20 20 20  , nMin) ){.     
23da0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
23db0 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74  Write(p, pStruct
23dc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
23dd0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
23de0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
23df0 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
23e00 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
23e10 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  (p);.}..static v
23e20 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64 52 6f  oid fts5AppendRo
23e30 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
23e40 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74   *p,.  i64 iDelt
23e50 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  a,.  Fts5Iter *p
23e60 55 6e 75 73 65 64 2c 0a 20 20 46 74 73 35 42 75  Unused,.  Fts5Bu
23e70 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
23e80 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e  UNUSED_PARAM(pUn
23e90 75 73 65 64 29 3b 0a 20 20 66 74 73 35 42 75 66  used);.  fts5Buf
23ea0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
23eb0 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 44  &p->rc, pBuf, iD
23ec0 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  elta);.}..static
23ed0 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64   void fts5Append
23ee0 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49  Poslist(.  Fts5I
23ef0 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69  ndex *p,.  i64 i
23f00 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74 65  Delta,.  Fts5Ite
23f10 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74 73  r *pMulti,.  Fts
23f20 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
23f30 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70  .  int nData = p
23f40 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e 44 61 74  Multi->base.nDat
23f50 61 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61  a;.  assert( nDa
23f60 74 61 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ta>0 );.  if( p-
23f70 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
23f80 26 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47  & 0==fts5BufferG
23f90 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  row(&p->rc, pBuf
23fa0 2c 20 6e 44 61 74 61 2b 39 2b 39 29 20 29 7b 0a  , nData+9+9) ){.
23fb0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
23fc0 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
23fd0 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20  Buf, iDelta);.  
23fe0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
23ff0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
24000 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a 20 20 20  f, nData*2);.   
24010 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
24020 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
24030 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 70 44 61  pMulti->base.pDa
24040 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a  ta, nData);.  }.
24050 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }...static void 
24060 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
24070 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49  ext(Fts5DoclistI
24080 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75  ter *pIter){.  u
24090 38 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 61 50  8 *p = pIter->aP
240a0 6f 73 6c 69 73 74 20 2b 20 70 49 74 65 72 2d 3e  oslist + pIter->
240b0 6e 53 69 7a 65 20 2b 20 70 49 74 65 72 2d 3e 6e  nSize + pIter->n
240c0 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61 73 73 65  Poslist;..  asse
240d0 72 74 28 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  rt( pIter->aPosl
240e0 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 3e 3d  ist );.  if( p>=
240f0 70 49 74 65 72 2d 3e 61 45 6f 66 20 29 7b 0a 20  pIter->aEof ){. 
24100 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69     pIter->aPosli
24110 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  st = 0;.  }else{
24120 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b  .    i64 iDelta;
24130 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47  ..    p += fts5G
24140 65 74 56 61 72 69 6e 74 28 70 2c 20 28 75 36 34  etVarint(p, (u64
24150 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
24160 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
24170 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a   iDelta;..    /*
24180 20 52 65 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c   Read position l
24190 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ist size */.    
241a0 69 66 28 20 70 5b 30 5d 20 26 20 30 78 38 30 20  if( p[0] & 0x80 
241b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  ){.      int nPo
241c0 73 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  s;.      pIter->
241d0 6e 53 69 7a 65 20 3d 20 66 74 73 35 47 65 74 56  nSize = fts5GetV
241e0 61 72 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29  arint32(p, nPos)
241f0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
24200 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e  Poslist = (nPos>
24210 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >1);.    }else{.
24220 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
24230 73 6c 69 73 74 20 3d 20 28 28 69 6e 74 29 28 70  slist = ((int)(p
24240 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20  [0])) >> 1;.    
24250 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d    pIter->nSize =
24260 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   1;.    }..    p
24270 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
24280 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   p;.  }.}..stati
24290 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
242a0 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  stIterInit(.  Ft
242b0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
242c0 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  .  Fts5DoclistIt
242d0 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d  er *pIter.){.  m
242e0 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
242f0 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
24300 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69  .  pIter->aPosli
24310 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20  st = pBuf->p;.  
24320 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26 70  pIter->aEof = &p
24330 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b  Buf->p[pBuf->n];
24340 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  .  fts5DoclistIt
24350 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 7d  erNext(pIter);.}
24360 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70  ..#if 0./*.** Ap
24370 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74  pend a doclist t
24380 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  o buffer pBuf..*
24390 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
243a0 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
243b0 73 70 61 63 65 20 77 69 74 68 69 6e 20 74 68 65  space within the
243c0 20 62 75 66 66 65 72 20 68 61 73 20 61 6c 72 65   buffer has alre
243d0 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f  ady been.** allo
243e0 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cated..*/.static
243f0 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41   void fts5MergeA
24400 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 46 74  ppendDocid(.  Ft
24410 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24430 20 42 75 66 66 65 72 20 74 6f 20 77 72 69 74 65   Buffer to write
24440 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69   to */.  i64 *pi
24450 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20  LastRowid,      
24460 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
24470 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77  UT: Previous row
24480 69 64 20 77 72 69 74 74 65 6e 20 28 69 66 20 61  id written (if a
24490 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  ny) */.  i64 iRo
244a0 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
244b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
244c0 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29  d to append */.)
244d0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 66  {.  assert( pBuf
244e0 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c 61  ->n!=0 || (*piLa
244f0 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a 20  stRowid)==0 );. 
24500 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
24510 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
24520 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61  , iRowid - *piLa
24530 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69 4c  stRowid);.  *piL
24540 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  astRowid = iRowi
24550 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65  d;.}.#endif..#de
24560 66 69 6e 65 20 66 74 73 35 4d 65 72 67 65 41 70  fine fts5MergeAp
24570 70 65 6e 64 44 6f 63 69 64 28 70 42 75 66 2c 20  pendDocid(pBuf, 
24580 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f 77  iLastRowid, iRow
24590 69 64 29 20 7b 20 20 20 20 20 20 20 5c 0a 20 20  id) {       \.  
245a0 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e  assert( (pBuf)->
245b0 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52 6f  n!=0 || (iLastRo
245c0 77 69 64 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  wid)==0 );      
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
245e0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
245f0 70 70 65 6e 64 56 61 72 69 6e 74 28 28 70 42 75  ppendVarint((pBu
24600 66 29 2c 20 28 69 52 6f 77 69 64 29 20 2d 20 28  f), (iRowid) - (
24610 69 4c 61 73 74 52 6f 77 69 64 29 29 3b 20 5c 0a  iLastRowid)); \.
24620 20 20 28 69 4c 61 73 74 52 6f 77 69 64 29 20 3d    (iLastRowid) =
24630 20 28 69 52 6f 77 69 64 29 3b 20 20 20 20 20 20   (iRowid);      
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
24660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74  .}../*.** Swap t
24670 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 62  he contents of b
24680 75 66 66 65 72 20 2a 70 31 20 77 69 74 68 20 74  uffer *p1 with t
24690 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a 2f 0a 73  hat of *p2..*/.s
246a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
246b0 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75  ufferSwap(Fts5Bu
246c0 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75  ffer *p1, Fts5Bu
246d0 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73  ffer *p2){.  Fts
246e0 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70  5Buffer tmp = *p
246f0 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a  1;.  *p1 = *p2;.
24700 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a    *p2 = tmp;.}..
24710 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24720 4e 65 78 74 52 6f 77 69 64 28 46 74 73 35 42 75  NextRowid(Fts5Bu
24730 66 66 65 72 20 2a 70 42 75 66 2c 20 69 6e 74 20  ffer *pBuf, int 
24740 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a 70 69 52  *piOff, i64 *piR
24750 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20 69 20 3d  owid){.  int i =
24760 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66 28 20 69   *piOff;.  if( i
24770 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a 20 20 20  >=pBuf->n ){.   
24780 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20   *piOff = -1;.  
24790 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36 34 20 69  }else{.    u64 i
247a0 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f 66 66 20  Val;.    *piOff 
247b0 3d 20 69 20 2b 20 73 71 6c 69 74 65 33 46 74 73  = i + sqlite3Fts
247c0 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66  5GetVarint(&pBuf
247d0 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a  ->p[i], &iVal);.
247e0 20 20 20 20 2a 70 69 52 6f 77 69 64 20 2b 3d 20      *piRowid += 
247f0 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iVal;.  }.}../*.
24800 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 65  ** This is the e
24810 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 66 74 73  quivalent of fts
24820 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
24830 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 3d 6e  s() for detail=n
24840 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20 49 6e 20  one mode..** In 
24850 74 68 69 73 20 63 61 73 65 20 74 68 65 20 62 75  this case the bu
24860 66 66 65 72 73 20 63 6f 6e 73 69 73 74 20 6f 66  ffers consist of
24870 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64   a delta-encoded
24880 20 6c 69 73 74 20 6f 66 20 72 6f 77 69 64 73 20   list of rowids 
24890 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
248a0 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 52 6f  void fts5MergeRo
248b0 77 69 64 4c 69 73 74 73 28 0a 20 20 46 74 73 35  widLists(.  Fts5
248c0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
248d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
248e0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
248f0 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ct */.  Fts5Buff
24900 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20  er *p1,         
24910 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24920 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
24930 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
24940 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
24950 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69      /* Second li
24960 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  st to merge */.)
24970 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 30 3b 0a  {.  int i1 = 0;.
24980 20 20 69 6e 74 20 69 32 20 3d 20 30 3b 0a 20 20    int i2 = 0;.  
24990 69 36 34 20 69 52 6f 77 69 64 31 20 3d 20 30 3b  i64 iRowid1 = 0;
249a0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 32 20 3d  .  i64 iRowid2 =
249b0 20 30 3b 0a 20 20 69 36 34 20 69 4f 75 74 20 3d   0;.  i64 iOut =
249c0 20 30 3b 0a 0a 20 20 46 74 73 35 42 75 66 66 65   0;..  Fts5Buffe
249d0 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73 65 74 28  r out;.  memset(
249e0 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &out, 0, sizeof(
249f0 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  out));.  sqlite3
24a00 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
24a10 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d  p->rc, &out, p1-
24a20 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 69  >n + p2->n);.  i
24a30 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
24a40 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78 74 52 6f  n;..  fts5NextRo
24a50 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52  wid(p1, &i1, &iR
24a60 6f 77 69 64 31 29 3b 0a 20 20 66 74 73 35 4e 65  owid1);.  fts5Ne
24a70 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69 32 2c  xtRowid(p2, &i2,
24a80 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20 77 68   &iRowid2);.  wh
24a90 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c 20 69 32  ile( i1>=0 || i2
24aa0 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  >=0 ){.    if( i
24ab0 31 3e 3d 30 20 26 26 20 28 69 32 3c 30 20 7c 7c  1>=0 && (i2<0 ||
24ac0 20 69 52 6f 77 69 64 31 3c 69 52 6f 77 69 64 32   iRowid1<iRowid2
24ad0 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
24ae0 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52  t( iOut==0 || iR
24af0 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b 0a 20 20  owid1>iOut );.  
24b00 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24b10 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  feAppendVarint(&
24b20 6f 75 74 2c 20 69 52 6f 77 69 64 31 20 2d 20 69  out, iRowid1 - i
24b30 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f 75 74  Out);.      iOut
24b40 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20 20 20 20   = iRowid1;.    
24b50 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
24b60 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64  p1, &i1, &iRowid
24b70 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
24b80 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75       assert( iOu
24b90 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 32 3e  t==0 || iRowid2>
24ba0 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74  iOut );.      ft
24bb0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
24bc0 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69  ndVarint(&out, i
24bd0 52 6f 77 69 64 32 20 2d 20 69 4f 75 74 29 3b 0a  Rowid2 - iOut);.
24be0 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f        iOut = iRo
24bf0 77 69 64 32 3b 0a 20 20 20 20 20 20 69 66 28 20  wid2;.      if( 
24c00 69 31 3e 3d 30 20 26 26 20 69 52 6f 77 69 64 31  i1>=0 && iRowid1
24c10 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a 20 20 20  ==iRowid2 ){.   
24c20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77       fts5NextRow
24c30 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f  id(p1, &i1, &iRo
24c40 77 69 64 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  wid1);.      }. 
24c50 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77       fts5NextRow
24c60 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f  id(p2, &i2, &iRo
24c70 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  wid2);.    }.  }
24c80 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 77  ..  fts5BufferSw
24c90 61 70 28 26 6f 75 74 2c 20 70 31 29 3b 0a 20 20  ap(&out, p1);.  
24ca0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
24cb0 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  out);.}../*.** B
24cc0 75 66 66 65 72 73 20 70 31 20 61 6e 64 20 70 32  uffers p1 and p2
24cd0 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74   contain doclist
24ce0 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
24cf0 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e 74   merges the cont
24d00 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77  ent.** of the tw
24d10 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65 74  o doclists toget
24d20 68 65 72 20 61 6e 64 20 73 65 74 73 20 62 75 66  her and sets buf
24d30 66 65 72 20 70 31 20 74 6f 20 74 68 65 20 72 65  fer p1 to the re
24d40 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72  sult before.** r
24d50 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
24d60 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
24d70 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
24d80 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e  e is left in p->
24d90 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rc. If an error 
24da0 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  has.** already o
24db0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
24dc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
24dd0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
24de0 64 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69  d fts5MergePrefi
24df0 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e  xLists(.  Fts5In
24e00 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
24e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
24e20 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
24e30 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
24e40 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20 20   *p1,           
24e50 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
24e60 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
24e70 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32    Fts5Buffer *p2
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74    /* Second list
24ea0 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a   to merge */.){.
24eb0 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20    if( p2->n ){. 
24ec0 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69     i64 iLastRowi
24ed0 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 44  d = 0;.    Fts5D
24ee0 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b 0a 20  oclistIter i1;. 
24ef0 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
24f00 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73 35 42  er i2;.    Fts5B
24f10 75 66 66 65 72 20 6f 75 74 20 3d 20 7b 30 2c 20  uffer out = {0, 
24f20 30 2c 20 30 7d 3b 0a 20 20 20 20 46 74 73 35 42  0, 0};.    Fts5B
24f30 75 66 66 65 72 20 74 6d 70 20 3d 20 7b 30 2c 20  uffer tmp = {0, 
24f40 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 69 66 28 20  0, 0};..    if( 
24f50 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
24f60 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f  rSize(&p->rc, &o
24f70 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e  ut, p1->n + p2->
24f80 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
24f90 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
24fa0 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a 20  Init(p1, &i1);. 
24fb0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
24fc0 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29 3b  erInit(p2, &i2);
24fd0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  ..    while( 1 )
24fe0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 31 2e 69  {.      if( i1.i
24ff0 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 20  Rowid<i2.iRowid 
25000 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ){.        /* Co
25010 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31  py entry from i1
25020 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
25030 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
25040 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
25050 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i1.iRowid);. 
25060 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
25070 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
25080 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73  &out, i1.aPoslis
25090 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69  t, i1.nPoslist+i
250a0 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  1.nSize);.      
250b0 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
250c0 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20  rNext(&i1);.    
250d0 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c      if( i1.aPosl
250e0 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ist==0 ) break;.
250f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
25100 73 65 20 69 66 28 20 69 32 2e 69 52 6f 77 69 64  se if( i2.iRowid
25110 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20  !=i1.iRowid ){. 
25120 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
25130 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a  ntry from i2 */.
25140 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
25150 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75  eAppendDocid(&ou
25160 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  t, iLastRowid, i
25170 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
25180 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
25190 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
251a0 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i2.aPoslist, i
251b0 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53  2.nPoslist+i2.nS
251c0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ize);.        ft
251d0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
251e0 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20  t(&i2);.        
251f0 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d  if( i2.aPoslist=
25200 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
25210 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a    }.      else{.
25220 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65          /* Merge
25230 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f   the two positio
25240 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20  n lists. */ .   
25250 20 20 20 20 20 69 36 34 20 69 50 6f 73 31 20 3d       i64 iPos1 =
25260 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
25270 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20 20  iPos2 = 0;.     
25280 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20 30     int iOff1 = 0
25290 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
252a0 66 66 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ff2 = 0;.       
252b0 20 75 38 20 2a 61 31 20 3d 20 26 69 31 2e 61 50   u8 *a1 = &i1.aP
252c0 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65 5d  oslist[i1.nSize]
252d0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 32  ;.        u8 *a2
252e0 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73 74 5b   = &i2.aPoslist[
252f0 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20 20  i2.nSize];..    
25300 20 20 20 20 69 36 34 20 69 50 72 65 76 20 3d 20      i64 iPrev = 
25310 30 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  0;.        Fts5P
25320 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69  oslistWriter wri
25330 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ter;.        mem
25340 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20  set(&writer, 0, 
25350 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b  sizeof(writer));
25360 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  ..        fts5Me
25370 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
25380 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
25390 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i2.iRowid);.   
253a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
253b0 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20  ero(&tmp);.     
253c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
253d0 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
253e0 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c 69   &tmp, i1.nPosli
253f0 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69 73 74  st + i2.nPoslist
25400 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25410 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ->rc ) break;.. 
25420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
25430 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
25440 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  a1, i1.nPoslist,
25450 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29   &iOff1, &iPos1)
25460 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25470 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
25480 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69  64(a2, i2.nPosli
25490 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f  st, &iOff2, &iPo
254a0 73 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  s2);.        ass
254b0 65 72 74 28 20 69 50 6f 73 31 3e 3d 30 20 26 26  ert( iPos1>=0 &&
254c0 20 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20 20   iPos2>=0 );..  
254d0 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c        if( iPos1<
254e0 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20  iPos2 ){.       
254f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
25500 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
25510 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
25520 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
25530 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
25540 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e  stNext64(a1, i1.
25550 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31  nPoslist, &iOff1
25560 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  , &iPos1);.     
25570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25580 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
25590 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
255a0 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
255b0 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos2);.         
255c0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
255d0 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
255e0 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
255f0 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20  2, &iPos2);.    
25600 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
25610 66 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69  f( iPos1>=0 && i
25620 50 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20 20 20  Pos2>=0 ){.     
25630 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
25640 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25650 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a   iPos1<iPos2 ){.
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
25670 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29  ( iPos1!=iPrev )
25680 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25690 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
256a0 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26  listSafeAppend(&
256b0 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f  tmp, &iPrev, iPo
256c0 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s1);.           
256d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
256e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
256f0 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20  slistNext64(a1, 
25700 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i1.nPoslist, &iO
25710 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20  ff1, &iPos1);.  
25720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25730 69 50 6f 73 31 3c 30 20 29 20 62 72 65 61 6b 3b  iPos1<0 ) break;
25740 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
25750 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
25760 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 32 21    assert( iPos2!
25770 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20  =iPrev );.      
25780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
25790 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
257a0 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
257b0 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  v, iPos2);.     
257c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
257d0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
257e0 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  4(a2, i2.nPoslis
257f0 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73  t, &iOff2, &iPos
25800 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
25810 20 20 69 66 28 20 69 50 6f 73 32 3c 30 20 29 20    if( iPos2<0 ) 
25820 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
25830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
25840 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
25850 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d 30      if( iPos1>=0
25860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
25870 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29  ( iPos1!=iPrev )
25880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
25890 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
258a0 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
258b0 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b   &iPrev, iPos1);
258c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
258d0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
258e0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
258f0 26 74 6d 70 2c 20 26 61 31 5b 69 4f 66 66 31 5d  &tmp, &a1[iOff1]
25900 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2d 69 4f  , i1.nPoslist-iO
25910 66 66 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ff1);.        }e
25920 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
25930 73 73 65 72 74 28 20 69 50 6f 73 32 3e 3d 30 20  ssert( iPos2>=0 
25940 26 26 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20  && iPos2!=iPrev 
25950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
25960 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
25970 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
25980 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a  &iPrev, iPos2);.
25990 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
259a0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
259b0 6f 62 28 26 74 6d 70 2c 20 26 61 32 5b 69 4f 66  ob(&tmp, &a2[iOf
259c0 66 32 5d 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  f2], i2.nPoslist
259d0 2d 69 4f 66 66 32 29 3b 0a 20 20 20 20 20 20 20  -iOff2);.       
259e0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
259f0 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
25a00 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
25a10 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
25a20 61 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e  arint(&out, tmp.
25a30 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20  n * 2);.        
25a40 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
25a50 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74  pendBlob(&out, t
25a60 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20  mp.p, tmp.n);.  
25a70 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
25a80 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a  tIterNext(&i1);.
25a90 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
25aa0 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29  istIterNext(&i2)
25ab0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
25ac0 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20  .aPoslist==0 || 
25ad0 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29  i2.aPoslist==0 )
25ae0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25af0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
25b00 31 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20  1.aPoslist ){.  
25b10 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
25b20 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
25b30 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52  LastRowid, i1.iR
25b40 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73  owid);.      fts
25b50 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
25b60 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61  dBlob(&out, i1.a
25b70 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45 6f 66  Poslist, i1.aEof
25b80 20 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b   - i1.aPoslist);
25b90 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
25ba0 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 20  if( i2.aPoslist 
25bb0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72  ){.      fts5Mer
25bc0 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
25bd0 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
25be0 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
25bf0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
25c00 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
25c10 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32   i2.aPoslist, i2
25c20 2e 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f 73 6c  .aEof - i2.aPosl
25c30 69 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ist);.    }..   
25c40 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
25c50 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e  p->rc, p1, out.n
25c60 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66 74  , out.p);.    ft
25c70 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 6d  s5BufferFree(&tm
25c80 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
25c90 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 20 20  erFree(&out);.  
25ca0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
25cb0 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
25cc0 49 74 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65  Iter(.  Fts5Inde
25cd0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
25ce0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
25cf0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
25d00 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20  .  int bDesc,   
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22     /* True for "
25d30 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
25d40 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ESC" */.  const 
25d50 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20  u8 *pToken,     
25d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
25d70 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
25d80 72 65 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a  refix to match *
25d90 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  /.  int nToken, 
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25db0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
25dc0 75 66 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20  uffer pToken in 
25dd0 62 79 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 43  bytes */.  Fts5C
25de0 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
25df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25e00 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
25e10 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
25e20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a  */.  Fts5Iter **
25e30 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
25e40 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
25e50 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ator */.){.  Fts
25e60 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
25e70 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65  uct;.  Fts5Buffe
25e80 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74  r *aBuf;.  const
25e90 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a   int nBuf = 32;.
25ea0 0a 20 20 76 6f 69 64 20 28 2a 78 4d 65 72 67 65  .  void (*xMerge
25eb0 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74  )(Fts5Index*, Ft
25ec0 73 35 42 75 66 66 65 72 2a 2c 20 46 74 73 35 42  s5Buffer*, Fts5B
25ed0 75 66 66 65 72 2a 29 3b 0a 20 20 76 6f 69 64 20  uffer*);.  void 
25ee0 28 2a 78 41 70 70 65 6e 64 29 28 46 74 73 35 49  (*xAppend)(Fts5I
25ef0 6e 64 65 78 2a 2c 20 69 36 34 2c 20 46 74 73 35  ndex*, i64, Fts5
25f00 49 74 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65  Iter*, Fts5Buffe
25f10 72 2a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43  r*);.  if( p->pC
25f20 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
25f30 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
25f40 20 29 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d   ){.    xMerge =
25f50 20 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c   fts5MergeRowidL
25f60 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e  ists;.    xAppen
25f70 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64 52 6f  d = fts5AppendRo
25f80 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
25f90 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d    xMerge = fts5M
25fa0 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 3b  ergePrefixLists;
25fb0 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66  .    xAppend = f
25fc0 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  ts5AppendPoslist
25fd0 3b 0a 20 20 7d 0a 0a 20 20 61 42 75 66 20 3d 20  ;.  }..  aBuf = 
25fe0 28 46 74 73 35 42 75 66 66 65 72 2a 29 66 74 73  (Fts5Buffer*)fts
25ff0 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
26000 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
26010 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63  *nBuf);.  pStruc
26020 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
26030 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28  eRead(p);..  if(
26040 20 61 42 75 66 20 26 26 20 70 53 74 72 75 63 74   aBuf && pStruct
26050 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
26060 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e  t flags = FTS5IN
26070 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 0a  DEX_QUERY_SCAN .
26080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26090 20 20 20 20 7c 20 46 54 53 35 49 4e 44 45 58 5f      | FTS5INDEX_
260a0 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 20  QUERY_SKIPEMPTY 
260b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
260c0 20 20 20 20 20 7c 20 46 54 53 35 49 4e 44 45 58       | FTS5INDEX
260d0 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b  _QUERY_NOOUTPUT;
260e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
260f0 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d  i64 iLastRowid =
26100 20 30 3b 0a 20 20 20 20 46 74 73 35 49 74 65 72   0;.    Fts5Iter
26110 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a   *p1 = 0;     /*
26120 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74   Iterator used t
26130 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66 72  o gather data fr
26140 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  om index */.    
26150 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
26160 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
26170 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74  doclist;.    int
26180 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 0a   bNewTerm = 1;..
26190 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c      memset(&docl
261a0 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ist, 0, sizeof(d
261b0 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 74  oclist));.    ft
261c0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
261d0 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
261e0 2c 20 70 43 6f 6c 73 65 74 2c 20 70 54 6f 6b 65  , pColset, pToke
261f0 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30  n, nToken, -1, 0
26200 2c 20 26 70 31 29 3b 0a 20 20 20 20 66 74 73 35  , &p1);.    fts5
26210 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28  IterSetOutputCb(
26220 26 70 2d 3e 72 63 2c 20 70 31 29 3b 0a 20 20 20  &p->rc, p1);.   
26230 20 66 6f 72 28 20 2f 2a 20 6e 6f 2d 6f 70 20 2a   for( /* no-op *
26240 2f 20 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  / ;.        fts5
26250 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
26260 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  p1)==0;.        
26270 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
26280 74 32 28 70 2c 20 70 31 2c 20 26 62 4e 65 77 54  t2(p, p1, &bNewT
26290 65 72 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  erm).    ){.    
262a0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
262b0 53 65 67 20 3d 20 26 70 31 2d 3e 61 53 65 67 5b  Seg = &p1->aSeg[
262c0 20 70 31 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69   p1->aFirst[1].i
262d0 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 69  First ];.      i
262e0 6e 74 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d  nt nTerm = pSeg-
262f0 3e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 63  >term.n;.      c
26300 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d  onst u8 *pTerm =
26310 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 3b 0a 20   pSeg->term.p;. 
26320 20 20 20 20 20 70 31 2d 3e 78 53 65 74 4f 75 74       p1->xSetOut
26330 70 75 74 73 28 70 31 2c 20 70 53 65 67 29 3b 0a  puts(p1, pSeg);.
26340 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
26350 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  ( memcmp(pToken,
26360 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b   pTerm, MIN(nTok
26370 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29  en, nTerm))<=0 )
26380 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4e 65 77  ;.      if( bNew
26390 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
263a0 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e  if( nTerm<nToken
263b0 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65   || memcmp(pToke
263c0 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e  n, pTerm, nToken
263d0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
263e0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31   }..      if( p1
263f0 2d 3e 62 61 73 65 2e 6e 44 61 74 61 3d 3d 30 20  ->base.nData==0 
26400 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
26410 20 20 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e     if( p1->base.
26420 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77  iRowid<=iLastRow
26430 69 64 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3e  id && doclist.n>
26440 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
26450 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
26460 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73  ITE_OK && doclis
26470 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  t.n; i++){.     
26480 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
26490 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Buf );.         
264a0 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d   if( aBuf[i].n==
264b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
264c0 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
264d0 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
264e0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
264f0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
26500 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  &doclist);.     
26510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26520 20 20 20 20 20 20 20 20 78 4d 65 72 67 65 28 70          xMerge(p
26530 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75  , &doclist, &aBu
26540 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  f[i]);.         
26550 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
26560 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  o(&aBuf[i]);.   
26570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26580 20 7d 0a 20 20 20 20 20 20 20 20 69 4c 61 73 74   }.        iLast
26590 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Rowid = 0;.     
265a0 20 7d 0a 0a 20 20 20 20 20 20 78 41 70 70 65 6e   }..      xAppen
265b0 64 28 70 2c 20 70 31 2d 3e 62 61 73 65 2e 69 52  d(p, p1->base.iR
265c0 6f 77 69 64 2d 69 4c 61 73 74 52 6f 77 69 64 2c  owid-iLastRowid,
265d0 20 70 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a   p1, &doclist);.
265e0 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64        iLastRowid
265f0 20 3d 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77   = p1->base.iRow
26600 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  id;.    }..    f
26610 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20  or(i=0; i<nBuf; 
26620 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
26630 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
26640 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4d 65 72   ){.        xMer
26650 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20  ge(p, &doclist, 
26660 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
26670 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66   }.      fts5Buf
26680 66 65 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d  ferFree(&aBuf[i]
26690 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
266a0 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
266b0 31 29 3b 0a 0a 20 20 20 20 70 44 61 74 61 20 3d  1);..    pData =
266c0 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
266d0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  , sizeof(Fts5Dat
266e0 61 29 20 2b 20 64 6f 63 6c 69 73 74 2e 6e 29 3b  a) + doclist.n);
266f0 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29  .    if( pData )
26700 7b 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e 70  {.      pData->p
26710 20 3d 20 28 75 38 2a 29 26 70 44 61 74 61 5b 31   = (u8*)&pData[1
26720 5d 3b 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e  ];.      pData->
26730 6e 6e 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65  nn = pData->szLe
26740 61 66 20 3d 20 64 6f 63 6c 69 73 74 2e 6e 3b 0a  af = doclist.n;.
26750 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61        memcpy(pDa
26760 74 61 2d 3e 70 2c 20 64 6f 63 6c 69 73 74 2e 70  ta->p, doclist.p
26770 2c 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20  , doclist.n);.  
26780 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
26790 72 4e 65 77 32 28 70 2c 20 70 44 61 74 61 2c 20  rNew2(p, pData, 
267a0 62 44 65 73 63 2c 20 70 70 49 74 65 72 29 3b 0a  bDesc, ppIter);.
267b0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
267c0 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69 73  fferFree(&doclis
267d0 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53  t);.  }..  fts5S
267e0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
267f0 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c 69  pStruct);.  sqli
26800 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b 0a  te3_free(aBuf);.
26810 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  }.../*.** Indica
26820 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  te that all subs
26830 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
26840 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
26850 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e 0a  Write() pertain.
26860 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65  ** to the docume
26870 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69 52  nt with rowid iR
26880 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
26890 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65 67  ite3Fts5IndexBeg
268a0 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  inWrite(Fts5Inde
268b0 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 6c 65 74  x *p, int bDelet
268c0 65 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  e, i64 iRowid){.
268d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
268e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
268f0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
26900 20 68 61 73 68 20 74 61 62 6c 65 20 69 66 20 69   hash table if i
26910 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t has not alread
26920 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
26930 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61   */.  if( p->pHa
26940 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  sh==0 ){.    p->
26950 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
26960 48 61 73 68 4e 65 77 28 70 2d 3e 70 43 6f 6e 66  HashNew(p->pConf
26970 69 67 2c 20 26 70 2d 3e 70 48 61 73 68 2c 20 26  ig, &p->pHash, &
26980 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 29  p->nPendingData)
26990 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  ;.  }..  /* Flus
269a0 68 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  h the hash table
269b0 20 74 6f 20 64 69 73 6b 20 69 66 20 72 65 71 75   to disk if requ
269c0 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 69 52  ired */.  if( iR
269d0 6f 77 69 64 3c 70 2d 3e 69 57 72 69 74 65 52 6f  owid<p->iWriteRo
269e0 77 69 64 20 0a 20 20 20 7c 7c 20 28 69 52 6f 77  wid .   || (iRow
269f0 69 64 3d 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77  id==p->iWriteRow
26a00 69 64 20 26 26 20 70 2d 3e 62 44 65 6c 65 74 65  id && p->bDelete
26a10 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 70 2d 3e 6e  ==0).   || (p->n
26a20 50 65 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d  PendingData > p-
26a30 3e 70 43 6f 6e 66 69 67 2d 3e 6e 48 61 73 68 53  >pConfig->nHashS
26a40 69 7a 65 29 20 0a 20 20 29 7b 0a 20 20 20 20 66  ize) .  ){.    f
26a50 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
26a60 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 57 72 69  ;.  }..  p->iWri
26a70 74 65 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  teRowid = iRowid
26a80 3b 0a 20 20 70 2d 3e 62 44 65 6c 65 74 65 20 3d  ;.  p->bDelete =
26a90 20 62 44 65 6c 65 74 65 3b 0a 20 20 72 65 74 75   bDelete;.  retu
26aa0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
26ab0 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
26ac0 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64  Commit data to d
26ad0 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
26ae0 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63  te3Fts5IndexSync
26af0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
26b00 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 61  nt bCommit){.  a
26b10 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
26b20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
26b30 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a  5IndexFlush(p);.
26b40 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 20 29 20    if( bCommit ) 
26b50 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
26b60 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  p);.  return fts
26b70 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
26b80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
26b90 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  d any data store
26ba0 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
26bb0 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20  ry hash tables. 
26bc0 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a  Do not write it.
26bd0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
26be0 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
26bf0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
26c00 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
26c10 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c  e %_data.** tabl
26c20 65 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67  e may have chang
26c30 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61  ed on disk. So a
26c40 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ny in-memory cac
26c50 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a  hes of %_data .*
26c60 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62  * records must b
26c70 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
26c80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
26c90 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46  5IndexRollback(F
26ca0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
26cb0 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
26cc0 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44  p);.  fts5IndexD
26cd0 69 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20  iscardData(p);. 
26ce0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
26cf0 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 2f  validate(p);.  /
26d00 2a 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d  * assert( p->rc=
26d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f  =SQLITE_OK ); */
26d20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26d30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
26d40 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69  e %_data table i
26d50 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
26d60 74 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ty when this fun
26d70 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
26d80 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
26d90 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20 77  n populates it w
26da0 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ith the initial 
26db0 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
26dc0 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  s for each index
26dd0 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 69  ,.** and the ini
26de0 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20  tial version of 
26df0 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
26e00 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62 79  ecord (a zero-by
26e10 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74  te blob)..*/.int
26e20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
26e30 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65  xReinit(Fts5Inde
26e40 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72  x *p){.  Fts5Str
26e50 75 63 74 75 72 65 20 73 3b 0a 20 20 66 74 73 35  ucture s;.  fts5
26e60 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
26e70 61 74 65 28 70 29 3b 0a 20 20 6d 65 6d 73 65 74  ate(p);.  memset
26e80 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
26e90 74 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a  ts5Structure));.
26ea0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
26eb0 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  p, FTS5_AVERAGES
26ec0 5f 52 4f 57 49 44 2c 20 28 63 6f 6e 73 74 20 75  _ROWID, (const u
26ed0 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 66 74 73  8*)"", 0);.  fts
26ee0 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
26ef0 70 2c 20 26 73 29 3b 0a 20 20 72 65 74 75 72 6e  p, &s);.  return
26f00 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
26f10 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  (p);.}../*.** Op
26f20 65 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64  en a new Fts5Ind
26f30 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68  ex handle. If th
26f40 65 20 62 43 72 65 61 74 65 20 61 72 67 75 6d 65  e bCreate argume
26f50 6e 74 20 69 73 20 74 72 75 65 2c 20 63 72 65 61  nt is true, crea
26f60 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  te.** and initia
26f70 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
26f80 69 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65  ing %_data table
26f90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
26fa0 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74  ssful, set *pp t
26fb0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
26fc0 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ew object and re
26fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
26fe0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
26ff0 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e  t *pp to NULL an
27000 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  d return an SQLi
27010 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
27020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
27030 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74  5IndexOpen(.  Ft
27040 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
27050 67 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74  g, .  int bCreat
27060 65 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20  e, .  Fts5Index 
27070 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70  **pp,.  char **p
27080 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
27090 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
270a0 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20  Fts5Index *p;   
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270c0 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
270d0 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46  ..  *pp = p = (F
270e0 74 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65  ts5Index*)sqlite
270f0 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
27100 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  &rc, sizeof(Fts5
27110 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 72  Index));.  if( r
27120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27130 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d      p->pConfig =
27140 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d   pConfig;.    p-
27150 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53  >nWorkUnit = FTS
27160 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20  5_WORK_UNIT;.   
27170 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73   p->zDataTbl = s
27180 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74  qlite3Fts5Mprint
27190 66 28 26 72 63 2c 20 22 25 73 5f 64 61 74 61 22  f(&rc, "%s_data"
271a0 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
271b0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 44  );.    if( p->zD
271c0 61 74 61 54 62 6c 20 26 26 20 62 43 72 65 61 74  ataTbl && bCreat
271d0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
271e0 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
271f0 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20  eTable(.        
27200 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61    pConfig, "data
27210 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20 50  ", "id INTEGER P
27220 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63  RIMARY KEY, bloc
27230 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72  k BLOB", 0, pzEr
27240 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  r.      );.     
27250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27260 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
27270 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72   = sqlite3Fts5Cr
27280 65 61 74 65 54 61 62 6c 65 28 70 43 6f 6e 66 69  eateTable(pConfi
27290 67 2c 20 22 69 64 78 22 2c 20 0a 20 20 20 20 20  g, "idx", .     
272a0 20 20 20 20 20 20 20 22 73 65 67 69 64 2c 20 74         "segid, t
272b0 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41  erm, pgno, PRIMA
272c0 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 65  RY KEY(segid, te
272d0 72 6d 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  rm)", .         
272e0 20 20 20 31 2c 20 70 7a 45 72 72 0a 20 20 20 20     1, pzErr.    
272f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
27300 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27320 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
27330 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29  s5IndexReinit(p)
27340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27350 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72    }..  assert( r
27360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
27370 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
27380 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
27390 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
273a0 6e 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20  ndexClose(p);.  
273b0 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
273c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
273d0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e  *.** Close a han
273e0 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e  dle opened by an
273f0 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
27400 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27410 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  xOpen()..*/.int 
27420 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27430 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20  Close(Fts5Index 
27440 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
27450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
27460 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
27470 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
27480 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
27490 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70  tureInvalidate(p
274a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
274b0 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74  inalize(p->pWrit
274c0 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
274d0 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65  _finalize(p->pDe
274e0 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  leter);.    sqli
274f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
27500 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
27510 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27520 65 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  e(p->pIdxDeleter
27530 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27540 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53  inalize(p->pIdxS
27550 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
27560 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
27570 70 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20  pDataVersion);. 
27580 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
27590 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29  shFree(p->pHash)
275a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
275b0 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
275c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
275d0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
275e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
275f0 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
27600 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
27610 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
27620 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
27630 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
27640 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
27650 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
27660 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
27670 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
27680 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
27690 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
276a0 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
276b0 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
276c0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
276d0 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65  3Fts5IndexCharle
276e0 6e 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f  nToBytelen(.  co
276f0 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 0a 20 20  nst char *p, .  
27700 69 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e  int nByte, .  in
27710 74 20 6e 43 68 61 72 0a 29 7b 0a 20 20 69 6e 74  t nChar.){.  int
27720 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b   n = 0;.  int i;
27730 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
27740 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  har; i++){.    i
27750 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65  f( n>=nByte ) re
27760 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20  turn 0;      /* 
27770 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66  Input contains f
27780 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20  ewer than nChar 
27790 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28  chars */.    if(
277a0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
277b0 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a  p[n++]>=0xc0 ){.
277c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b        while( (p[
277d0 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  n] & 0xc0)==0x80
277e0 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
277f0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
27800 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20  ./*.** pIn is a 
27810 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74  UTF-8 encoded st
27820 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20  ring, nIn bytes 
27830 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  in size. Return 
27840 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
27850 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
27860 65 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e  ers in the strin
27870 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
27880 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
27890 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49  n(const char *pI
278a0 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69  n, int nIn){.  i
278b0 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20  nt nChar = 0;   
278c0 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
278d0 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
278e0 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28  i<nIn ){.    if(
278f0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
27900 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29  pIn[i++]>=0xc0 )
27910 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
27920 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20  <nIn && (pIn[i] 
27930 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  & 0xc0)==0x80 ) 
27940 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  i++;.    }.    n
27950 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Char++;.  }.  re
27960 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f  turn nChar;.}../
27970 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
27980 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72  emove data to or
27990 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e   from the index.
279a0 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63   Each time a doc
279b0 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64  ument is .** add
279c0 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64  ed to or removed
279d0 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c   from the index,
279e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
279f0 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20  s called one or 
27a00 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a  more.** times..*
27a10 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65  *.** For an inse
27a20 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  rt, it must be c
27a30 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
27a40 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
27a50 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a   new document..*
27a60 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
27a70 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20  on is a delete, 
27a80 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
27a90 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63  d (at least) onc
27aa0 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e  e for each.** un
27ab0 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68  ique token in th
27ac0 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
27ad0 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65  an iCol value le
27ae0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68  ss than zero. Th
27af0 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65  e iPos.** argume
27b00 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  nt is ignored fo
27b10 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69  r a delete..*/.i
27b20 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
27b30 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35  dexWrite(.  Fts5
27b40 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
27b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27b60 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f  ndex to write to
27b70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
27b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b90 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
27ba0 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e  token appears in
27bb0 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29   (-ve -> delete)
27bc0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27be0 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
27bf0 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  n of token withi
27c00 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  n column */.  co
27c10 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
27c20 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
27c30 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
27c40 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
27c50 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  om index */.){. 
27c60 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
27c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c80 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
27c90 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
27ca0 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  xes */.  int rc 
27cb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
27cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27cd0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
27ce0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
27cf0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a   = p->pConfig;..
27d00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
27d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27d20 61 73 73 65 72 74 28 20 28 69 43 6f 6c 3c 30 29  assert( (iCol<0)
27d30 3d 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29 3b 0a  ==p->bDelete );.
27d40 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e  .  /* Add the en
27d50 74 72 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  try to the main 
27d60 74 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a  terms index. */.
27d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
27d80 73 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 20  s5HashWrite(.   
27d90 20 20 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e     p->pHash, p->
27da0 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f  iWriteRowid, iCo
27db0 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41  l, iPos, FTS5_MA
27dc0 49 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65  IN_PREFIX, pToke
27dd0 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a  n, nToken.  );..
27de0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
27df0 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26  nfig->nPrefix &&
27e00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
27e10 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
27e20 69 6e 74 20 6e 43 68 61 72 20 3d 20 70 43 6f 6e  int nChar = pCon
27e30 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 3b  fig->aPrefix[i];
27e40 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
27e50 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27e60 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
27e70 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  n(pToken, nToken
27e80 2c 20 6e 43 68 61 72 29 3b 0a 20 20 20 20 69 66  , nChar);.    if
27e90 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
27ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
27eb0 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e 70 48  5HashWrite(p->pH
27ec0 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
27ed0 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20  p->iWriteRowid, 
27ee0 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 28 63 68 61  iCol, iPos, (cha
27ef0 72 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  r)(FTS5_MAIN_PRE
27f00 46 49 58 2b 69 2b 31 29 2c 20 70 54 6f 6b 65 6e  FIX+i+1), pToken
27f10 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74  ,.          nByt
27f20 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
27f30 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
27f40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
27f50 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20   a new iterator 
27f60 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67  to iterate thoug
27f70 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74  h all rowid that
27f80 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73   match the .** s
27f90 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f  pecified token o
27fa0 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a  r token prefix..
27fb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
27fc0 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20  s5IndexQuery(.  
27fd0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ff0 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20  /* FTS index to 
28000 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  query */.  const
28010 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
28020 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f  nt nToken, /* To
28030 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20  ken (or prefix) 
28040 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
28050 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
28060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28070 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
28080 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66  5INDEX_QUERY_X f
28090 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  lags */.  Fts5Co
280a0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
280b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
280c0 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  ch these columns
280d0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49   only */.  Fts5I
280e0 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65  ndexIter **ppIte
280f0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
28100 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
28110 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
28120 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
28130 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
28140 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 52 65  .  Fts5Iter *pRe
28150 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66  t = 0;.  Fts5Buf
28160 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c  fer buf = {0, 0,
28170 20 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68   0};..  /* If th
28180 65 20 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61  e QUERY_SCAN fla
28190 67 20 69 73 20 73 65 74 2c 20 61 6c 6c 20 6f 74  g is set, all ot
281a0 68 65 72 20 66 6c 61 67 73 20 6d 75 73 74 20 62  her flags must b
281b0 65 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 61 73  e clear. */.  as
281c0 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 46  sert( (flags & F
281d0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
281e0 43 41 4e 29 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  CAN)==0 || flags
281f0 3d 3d 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  ==FTS5INDEX_QUER
28200 59 5f 53 43 41 4e 20 29 3b 0a 0a 20 20 69 66 28  Y_SCAN );..  if(
28210 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
28220 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
28230 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d  buf, nToken+1)==
28240 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64  0 ){.    int iId
28250 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
28260 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
28270 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20  to search */.   
28280 20 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31   memcpy(&buf.p[1
28290 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  ], pToken, nToke
282a0 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75  n);..    /* Figu
282b0 72 65 20 6f 75 74 20 77 68 69 63 68 20 69 6e 64  re out which ind
282c0 65 78 20 74 6f 20 73 65 61 72 63 68 20 61 6e 64  ex to search and
282d0 20 73 65 74 20 69 49 64 78 20 61 63 63 6f 72 64   set iIdx accord
282e0 69 6e 67 6c 79 2e 20 49 66 20 74 68 69 73 0a 20  ingly. If this. 
282f0 20 20 20 2a 2a 20 69 73 20 61 20 70 72 65 66 69     ** is a prefi
28300 78 20 71 75 65 72 79 20 66 6f 72 20 77 68 69 63  x query for whic
28310 68 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72  h there is no pr
28320 65 66 69 78 20 69 6e 64 65 78 2c 20 73 65 74 20  efix index, set 
28330 69 49 64 78 20 74 6f 0a 20 20 20 20 2a 2a 20 67  iIdx to.    ** g
28340 72 65 61 74 65 72 20 74 68 61 6e 20 70 43 6f 6e  reater than pCon
28350 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 74 6f 20  fig->nPrefix to 
28360 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
28370 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 0a  e query will be.
28380 20 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64      ** satisfied
28390 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 6d 75 6c   by scanning mul
283a0 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
283b0 68 65 20 6d 61 69 6e 20 69 6e 64 65 78 2e 0a 20  he main index.. 
283c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
283d0 74 68 65 20 51 55 45 52 59 5f 54 45 53 54 5f 4e  the QUERY_TEST_N
283e0 4f 49 44 58 20 66 6c 61 67 20 77 61 73 20 73 70  OIDX flag was sp
283f0 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68  ecified, then th
28400 69 73 20 6d 75 73 74 20 62 65 20 61 0a 20 20 20  is must be a.   
28410 20 2a 2a 20 70 72 65 66 69 78 2d 71 75 65 72 79   ** prefix-query
28420 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69  . Instead of usi
28430 6e 67 20 61 20 70 72 65 66 69 78 2d 69 6e 64 65  ng a prefix-inde
28440 78 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73  x (if one exists
28450 29 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75  ), .    ** evalu
28460 61 74 65 20 74 68 65 20 70 72 65 66 69 78 20 71  ate the prefix q
28470 75 65 72 79 20 75 73 69 6e 67 20 74 68 65 20 6d  uery using the m
28480 61 69 6e 20 46 54 53 20 69 6e 64 65 78 2e 20 54  ain FTS index. T
28490 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 20 20  his is used.    
284a0 2a 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ** for internal 
284b0 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
284c0 62 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  by the integrity
284d0 2d 63 68 65 63 6b 20 69 6e 20 64 65 62 75 67 20  -check in debug 
284e0 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c  .    ** mode onl
284f0 79 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  y.  */.#ifdef SQ
28500 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
28510 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65  f( pConfig->bPre
28520 66 69 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28  fixIndex==0 || (
28530 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
28540 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49  X_QUERY_TEST_NOI
28550 44 58 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  DX) ){.      ass
28560 65 72 74 28 20 66 6c 61 67 73 20 26 20 46 54 53  ert( flags & FTS
28570 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
28580 46 49 58 20 29 3b 0a 20 20 20 20 20 20 69 49 64  FIX );.      iId
28590 78 20 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e  x = 1+pConfig->n
285a0 50 72 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73  Prefix;.    }els
285b0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
285c0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
285d0 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20  EX_QUERY_PREFIX 
285e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 68  ){.      int nCh
285f0 61 72 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68  ar = fts5IndexCh
28600 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54  arlen(pToken, nT
28610 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72  oken);.      for
28620 28 69 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70  (iIdx=1; iIdx<=p
28630 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
28640 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20   iIdx++){.      
28650 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
28660 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d  Prefix[iIdx-1]==
28670 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20  nChar ) break;. 
28680 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
28690 20 20 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e    if( iIdx<=pCon
286a0 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a  fig->nPrefix ){.
286b0 20 20 20 20 20 20 2f 2a 20 53 74 72 61 69 67 68        /* Straigh
286c0 74 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 2a  t index lookup *
286d0 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  /.      Fts5Stru
286e0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
286f0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
28700 61 64 28 70 29 3b 0a 20 20 20 20 20 20 62 75 66  ad(p);.      buf
28710 2e 70 5b 30 5d 20 3d 20 28 75 38 29 28 46 54 53  .p[0] = (u8)(FTS
28720 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20  5_MAIN_PREFIX + 
28730 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28  iIdx);.      if(
28740 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
28750 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
28760 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
28770 20 66 6c 61 67 73 20 7c 20 46 54 53 35 49 4e 44   flags | FTS5IND
28780 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50  EX_QUERY_SKIPEMP
28790 54 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  TY, .           
287a0 20 70 43 6f 6c 73 65 74 2c 20 62 75 66 2e 70 2c   pColset, buf.p,
287b0 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30   nToken+1, -1, 0
287c0 2c 20 26 70 52 65 74 0a 20 20 20 20 20 20 20 20  , &pRet.        
287d0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  );.        fts5S
287e0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
287f0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
28800 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
28810 20 20 20 2f 2a 20 53 63 61 6e 20 6d 75 6c 74 69     /* Scan multi
28820 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ple terms in the
28830 20 6d 61 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 20   main index */. 
28840 20 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d       int bDesc =
28850 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
28860 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 21  DEX_QUERY_DESC)!
28870 3d 30 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b  =0;.      buf.p[
28880 30 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50  0] = FTS5_MAIN_P
28890 52 45 46 49 58 3b 0a 20 20 20 20 20 20 66 74 73  REFIX;.      fts
288a0 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72  5SetupPrefixIter
288b0 28 70 2c 20 62 44 65 73 63 2c 20 62 75 66 2e 70  (p, bDesc, buf.p
288c0 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 70 43 6f 6c  , nToken+1, pCol
288d0 73 65 74 2c 20 26 70 52 65 74 29 3b 0a 20 20 20  set, &pRet);.   
288e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
288f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
28900 52 65 74 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20  Ret->pColset==0 
28910 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49 74 65  );.      fts5Ite
28920 72 53 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d  rSetOutputCb(&p-
28930 3e 72 63 2c 20 70 52 65 74 29 3b 0a 20 20 20 20  >rc, pRet);.    
28940 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
28950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28960 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
28970 53 65 67 20 3d 20 26 70 52 65 74 2d 3e 61 53 65  Seg = &pRet->aSe
28980 67 5b 70 52 65 74 2d 3e 61 46 69 72 73 74 5b 31  g[pRet->aFirst[1
28990 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  ].iFirst];.     
289a0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
289b0 61 66 20 29 20 70 52 65 74 2d 3e 78 53 65 74 4f  af ) pRet->xSetO
289c0 75 74 70 75 74 73 28 70 52 65 74 2c 20 70 53 65  utputs(pRet, pSe
289d0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
289e0 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  }..    if( p->rc
289f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28a00 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 26  3Fts5IterClose(&
28a10 70 52 65 74 2d 3e 62 61 73 65 29 3b 0a 20 20 20  pRet->base);.   
28a20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
28a30 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
28a40 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  er(p);.    }..  
28a50 20 20 2a 70 70 49 74 65 72 20 3d 20 26 70 52 65    *ppIter = &pRe
28a60 74 2d 3e 62 61 73 65 3b 0a 20 20 20 20 73 71 6c  t->base;.    sql
28a70 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
28a80 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20 20  ee(&buf);.  }.  
28a90 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
28aa0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
28ab0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
28ac0 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
28ad0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
28ae0 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ly argument is a
28af0 74 20 45 4f 46 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  t EOF..*/./*.** 
28b00 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
28b10 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e   matching rowid.
28b20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
28b30 46 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73  Fts5IterNext(Fts
28b40 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64  5IndexIter *pInd
28b50 65 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49  exIter){.  Fts5I
28b60 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74  ter *pIter = (Ft
28b70 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
28b80 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  er;.  assert( pI
28b90 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
28ba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
28bb0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
28bc0 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
28bd0 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20   pIter, 0, 0);. 
28be0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
28bf0 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
28c00 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
28c10 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
28c20 74 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f  t matching term/
28c30 72 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20 74  rowid. Used by t
28c40 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64  he fts5vocab mod
28c50 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ule..*/.int sqli
28c60 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53  te3Fts5IterNextS
28c70 63 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65  can(Fts5IndexIte
28c80 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a  r *pIndexIter){.
28c90 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
28ca0 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70  r = (Fts5Iter*)p
28cb0 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 46 74 73  IndexIter;.  Fts
28cc0 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65  5Index *p = pIte
28cd0 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73  r->pIndex;..  as
28ce0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
28cf0 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  dex->rc==SQLITE_
28d00 4f 4b 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c  OK );..  fts5Mul
28d10 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
28d20 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  ter, 0, 0);.  if
28d30 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
28d40 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  OK ){.    Fts5Se
28d50 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
28d60 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
28d70 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
28d80 72 73 74 20 5d 3b 0a 20 20 20 20 69 66 28 20 70  rst ];.    if( p
28d90 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53  Seg->pLeaf && pS
28da0 65 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46  eg->term.p[0]!=F
28db0 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20  TS5_MAIN_PREFIX 
28dc0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ){.      fts5Dat
28dd0 61 52 65 6c 65 61 73 65 28 70 53 65 67 2d 3e 70  aRelease(pSeg->p
28de0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 53 65  Leaf);.      pSe
28df0 67 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  g->pLeaf = 0;.  
28e00 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
28e10 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
28e20 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74    }..  return ft
28e30 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
28e40 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
28e50 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
28e60 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
28e70 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75   rowid that occu
28e80 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69  rs at or after i
28e90 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65  Match. The.** de
28ea0 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20  finition of "at 
28eb0 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64  or after" depend
28ec0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69  s on whether thi
28ed0 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61  s iterator itera
28ee0 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  tes.** in ascend
28ef0 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e  ing or descendin
28f00 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a  g rowid order..*
28f10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
28f20 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74  5IterNextFrom(Ft
28f30 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
28f40 64 65 78 49 74 65 72 2c 20 69 36 34 20 69 4d 61  dexIter, i64 iMa
28f50 74 63 68 29 7b 0a 20 20 46 74 73 35 49 74 65 72  tch){.  Fts5Iter
28f60 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
28f70 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
28f80 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
28f90 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e  NextFrom(pIter->
28fa0 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 69  pIndex, pIter, i
28fb0 4d 61 74 63 68 29 3b 0a 20 20 72 65 74 75 72 6e  Match);.  return
28fc0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
28fd0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
28fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28ff0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
29000 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  m..*/.const char
29010 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65   *sqlite3Fts5Ite
29020 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49  rTerm(Fts5IndexI
29030 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c  ter *pIndexIter,
29040 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74   int *pn){.  int
29050 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
29060 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61   *z = (const cha
29070 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
29080 54 65 72 6d 28 28 46 74 73 35 49 74 65 72 2a 29  Term((Fts5Iter*)
29090 70 49 6e 64 65 78 49 74 65 72 2c 20 26 6e 29 3b  pIndexIter, &n);
290a0 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20  .  *pn = n-1;.  
290b0 72 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a  return &z[1];.}.
290c0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
290d0 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20  iterator opened 
290e0 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
290f0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ll to sqlite3Fts
29100 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a  5IndexQuery()..*
29110 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
29120 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35  s5IterClose(Fts5
29130 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
29140 78 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  xIter){.  if( pI
29150 6e 64 65 78 49 74 65 72 20 29 7b 0a 20 20 20 20  ndexIter ){.    
29160 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20  Fts5Iter *pIter 
29170 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e  = (Fts5Iter*)pIn
29180 64 65 78 49 74 65 72 3b 0a 20 20 20 20 46 74 73  dexIter;.    Fts
29190 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d  5Index *pIndex =
291a0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a   pIter->pIndex;.
291b0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
291c0 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  rFree(pIter);.  
291d0 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
291e0 72 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d  r(pIndex);.  }.}
291f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64  ../*.** Read and
29200 20 64 65 63 6f 64 65 20 74 68 65 20 22 61 76 65   decode the "ave
29210 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 66 72  rages" record fr
29220 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
29230 20 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65   .**.** Paramete
29240 72 20 61 6e 53 69 7a 65 20 6d 75 73 74 20 70 6f  r anSize must po
29250 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
29260 6f 66 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77 68  of size nCol, wh
29270 65 72 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74  ere nCol is.** t
29280 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
29290 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r defined column
292a0 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  s in the FTS tab
292b0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
292c0 65 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76  e3Fts5IndexGetAv
292d0 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
292e0 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c   *p, i64 *pnRow,
292f0 20 69 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a 20   i64 *anSize){. 
29300 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70   int nCol = p->p
29310 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20  Config->nCol;.  
29320 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
29330 0a 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a  ..  *pnRow = 0;.
29340 20 20 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65 2c    memset(anSize,
29350 20 30 2c 20 73 69 7a 65 6f 66 28 69 36 34 29 20   0, sizeof(i64) 
29360 2a 20 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74 61  * nCol);.  pData
29370 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
29380 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  p, FTS5_AVERAGES
29390 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70  _ROWID);.  if( p
293a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
293b0 26 26 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a  && pData->nn ){.
293c0 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
293d0 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
293e0 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
293f0 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d  int(&pData->p[i]
29400 2c 20 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b 0a  , (u64*)pnRow);.
29410 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
29420 69 3c 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20 69  i<pData->nn && i
29430 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  Col<nCol; iCol++
29440 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  ){.      i += ft
29450 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
29460 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29  ta->p[i], (u64*)
29470 26 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a  &anSize[iCol]);.
29480 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
29490 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
294a0 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ta);.  return ft
294b0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
294c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  ;.}../*.** Repla
294d0 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22  ce the current "
294e0 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
294f0 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
29500 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
29510 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73   .** supplied as
29520 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
29530 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
29540 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
29550 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64  Averages(Fts5Ind
29560 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20  ex *p, const u8 
29570 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
29580 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  a){.  assert( p-
29590 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
295a0 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74  ;.  fts5DataWrit
295b0 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47  e(p, FTS5_AVERAG
295c0 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c  ES_ROWID, pData,
295d0 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72   nData);.  retur
295e0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
295f0 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
29600 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
29610 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73  number of blocks
29620 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73   this module has
29630 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
29640 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73  _data.** table s
29650 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61  ince it was crea
29660 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
29670 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64  te3Fts5IndexRead
29680 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  s(Fts5Index *p){
29690 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65  .  return p->nRe
296a0 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ad;.}../*.** Set
296b0 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b   the 32-bit cook
296c0 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ie value stored 
296d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
296e0 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a  all structure .*
296f0 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  * records to the
29700 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
29710 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
29720 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ment..**.** Retu
29730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
29740 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
29750 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
29760 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
29770 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
29780 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
29790 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35  exSetCookie(Fts5
297a0 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e  Index *p, int iN
297b0 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ew){.  int rc;  
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
297e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
297f0 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
29800 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
29810 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72  ;    /* Configur
29820 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ation object */.
29830 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b    u8 aCookie[4];
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29850 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79         /* Binary
29860 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
29870 6f 66 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c  of iNew */.  sql
29880 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
29890 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
298a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
298b0 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  K );.  sqlite3Ft
298c0 73 35 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c  s5Put32(aCookie,
298d0 20 69 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20   iNew);..  rc = 
298e0 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
298f0 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70  n(pConfig->db, p
29900 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
29910 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20  zDataTbl, .     
29920 20 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53   "block", FTS5_S
29930 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20  TRUCTURE_ROWID, 
29940 31 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20  1, &pBlob.  );. 
29950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29960 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
29970 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c  3_blob_write(pBl
29980 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20  ob, aCookie, 4, 
29990 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
299a0 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
299b0 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72  pBlob);.  }..  r
299c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74  eturn rc;.}..int
299d0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
299e0 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35  xLoadConfig(Fts5
299f0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
29a00 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
29a10 75 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  uct;.  pStruct =
29a20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
29a30 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72  ad(p);.  fts5Str
29a40 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
29a50 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  truct);.  return
29a60 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
29a70 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  (p);.}.../******
29a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ac0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
29ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
29b10 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69  * Below this poi
29b20 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d  nt is the implem
29b30 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
29b40 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
29b50 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  .** functionalit
29b60 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  y..*/../*.** Ret
29b70 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65  urn a simple che
29b80 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65  cksum value base
29b90 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  d on the argumen
29ba0 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  ts..*/.u64 sqlit
29bb0 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
29bc0 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f  Cksum(.  i64 iRo
29bd0 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c  wid, .  int iCol
29be0 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a  , .  int iPos, .
29bf0 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f    int iIdx,.  co
29c00 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c  nst char *pTerm,
29c10 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a  .  int nTerm.){.
29c20 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72    int i;.  u64 r
29c30 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72  et = iRowid;.  r
29c40 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
29c50 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20   iCol;.  ret += 
29c60 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b  (ret<<3) + iPos;
29c70 0a 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29  .  if( iIdx>=0 )
29c80 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
29c90 20 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52   + (FTS5_MAIN_PR
29ca0 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20  EFIX + iIdx);.  
29cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
29cc0 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72  ; i++) ret += (r
29cd0 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69  et<<3) + pTerm[i
29ce0 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ];.  return ret;
29cf0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
29d00 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
29d10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70  is function is p
29d20 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61  urely an interna
29d30 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20  l test. It does 
29d40 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74  not contribute t
29d50 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69  o .** FTS functi
29d60 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e  onality, or even
29d70 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
29d80 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79  heck, in any way
29d90 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c  ..**.** Instead,
29da0 20 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74   it tests that t
29db0 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70  he same set of p
29dc0 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e  gno/rowid combin
29dd0 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76  ations are .** v
29de0 69 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73  isited regardles
29df0 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
29e00 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
29e10 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
29e20 61 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67 69  ameters.** iSegi
29e30 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61  d/iLeaf is itera
29e40 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20  ted in forwards 
29e50 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  or reverse order
29e60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29e70 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
29e80 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64  verse(.  Fts5Ind
29e90 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53  ex *p, .  int iS
29ea0 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  egid,           
29eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
29ec0 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20  ment id to load 
29ed0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  from */.  int iL
29ee0 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
29ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61            /* Loa
29f00 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  d doclist-index 
29f10 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
29f20 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  .){.  Fts5DlidxI
29f30 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b  ter *pDlidx = 0;
29f40 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20  .  u64 cksum1 = 
29f50 31 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32  13;.  u64 cksum2
29f60 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44   = 13;..  for(pD
29f70 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74  lidx=fts5DlidxIt
29f80 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65  erInit(p, 0, iSe
29f90 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20  gid, iLeaf);.   
29fa0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
29fb0 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
29fc0 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  0;.      fts5Dli
29fd0 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44  dxIterNext(p, pD
29fe0 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69  lidx).  ){.    i
29ff0 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
2a000 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
2a010 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20  Dlidx);.    int 
2a020 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  pgno = fts5Dlidx
2a030 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
2a040 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
2a050 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  no>iLeaf );.    
2a060 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64  cksum1 += iRowid
2a070 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33   + ((i64)pgno<<3
2a080 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c  2);.  }.  fts5Dl
2a090 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
2a0a0 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20  dx);.  pDlidx = 
2a0b0 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78  0;..  for(pDlidx
2a0c0 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  =fts5DlidxIterIn
2a0d0 69 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64 2c  it(p, 1, iSegid,
2a0e0 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66   iLeaf);.      f
2a0f0 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
2a100 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
2a110 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2a120 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78  erPrev(p, pDlidx
2a130 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ).  ){.    i64 i
2a140 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64  Rowid = fts5Dlid
2a150 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
2a160 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f  x);.    int pgno
2a170 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
2a180 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
2a190 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c    assert( fts5Dl
2a1a0 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
2a1b0 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20  dx)>iLeaf );.   
2a1c0 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69   cksum2 += iRowi
2a1d0 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c  d + ((i64)pgno<<
2a1e0 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44  32);.  }.  fts5D
2a1f0 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
2a200 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d  idx);.  pDlidx =
2a210 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
2a220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2a230 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20  ksum1!=cksum2 ) 
2a240 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2a250 52 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RUPT;.}..static 
2a260 69 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b 73  int fts5QueryCks
2a270 75 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  um(.  Fts5Index 
2a280 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2a290 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69 6e        /* Fts5 in
2a2a0 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
2a2b0 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73  int iIdx,.  cons
2a2c0 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20  t char *z,      
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a2e0 6e 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65 72  ndex key to quer
2a2f0 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  y for */.  int n
2a300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2a320 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 20  ze of index key 
2a330 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
2a340 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a360 20 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35 49   Flags for Fts5I
2a370 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20 75  ndexQuery */.  u
2a380 36 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20 20  64 *pCksum      
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a3a0 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73  * IN/OUT: Checks
2a3b0 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  um value */.){. 
2a3c0 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70   int eDetail = p
2a3d0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
2a3e0 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20  il;.  u64 cksum 
2a3f0 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74 73  = *pCksum;.  Fts
2a400 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
2a410 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  r = 0;.  int rc 
2a420 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2a430 65 78 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c  exQuery(p, z, n,
2a440 20 66 6c 61 67 73 2c 20 30 2c 20 26 70 49 74 65   flags, 0, &pIte
2a450 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63  r);..  while( rc
2a460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
2a470 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ==sqlite3Fts5Ite
2a480 72 45 6f 66 28 70 49 74 65 72 29 20 29 7b 0a 20  rEof(pIter) ){. 
2a490 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 70     i64 rowid = p
2a4a0 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20  Iter->iRowid;.. 
2a4b0 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
2a4c0 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
2a4d0 20 29 7b 0a 20 20 20 20 20 20 63 6b 73 75 6d 20   ){.      cksum 
2a4e0 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
2a4f0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f  dexEntryCksum(ro
2a500 77 69 64 2c 20 30 2c 20 30 2c 20 69 49 64 78 2c  wid, 0, 0, iIdx,
2a510 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73   z, n);.    }els
2a520 65 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73  e{.      Fts5Pos
2a530 6c 69 73 74 52 65 61 64 65 72 20 73 52 65 61 64  listReader sRead
2a540 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 73 71  er;.      for(sq
2a550 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
2a560 52 65 61 64 65 72 49 6e 69 74 28 70 49 74 65 72  ReaderInit(pIter
2a570 2d 3e 70 44 61 74 61 2c 20 70 49 74 65 72 2d 3e  ->pData, pIter->
2a580 6e 44 61 74 61 2c 20 26 73 52 65 61 64 65 72 29  nData, &sReader)
2a590 3b 0a 20 20 20 20 20 20 20 20 20 20 73 52 65 61  ;.          sRea
2a5a0 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20  der.bEof==0;.   
2a5b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
2a5c0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e  s5PoslistReaderN
2a5d0 65 78 74 28 26 73 52 65 61 64 65 72 29 0a 20 20  ext(&sReader).  
2a5e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
2a5f0 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50  nt iCol = FTS5_P
2a600 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65  OS2COLUMN(sReade
2a610 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  r.iPos);.       
2a620 20 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53 35   int iOff = FTS5
2a630 5f 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65 61  _POS2OFFSET(sRea
2a640 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20  der.iPos);.     
2a650 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69     cksum ^= sqli
2a660 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2a670 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69 43  yCksum(rowid, iC
2a680 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c 20  ol, iOff, iIdx, 
2a690 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
2a6a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2a6b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a6c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a6d0 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 74  Fts5IterNext(pIt
2a6e0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
2a6f0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2a700 43 6c 6f 73 65 28 70 49 74 65 72 29 3b 0a 0a 20  Close(pIter);.. 
2a710 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d   *pCksum = cksum
2a720 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2a730 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
2a740 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70  nction is also p
2a750 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61  urely an interna
2a760 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20  l test. It does 
2a770 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74  not contribute t
2a780 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69  o .** FTS functi
2a790 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e  onality, or even
2a7a0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
2a7b0 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79  heck, in any way
2a7c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a7d0 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 0a 20   fts5TestTerm(. 
2a7e0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
2a7f0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50    Fts5Buffer *pP
2a800 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
2a810 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65    /* Previous te
2a820 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  rm */.  const ch
2a830 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20  ar *z, int n,   
2a840 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
2a850 62 6c 79 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  bly new term to 
2a860 74 65 73 74 20 2a 2f 0a 20 20 75 36 34 20 65 78  test */.  u64 ex
2a870 70 65 63 74 65 64 2c 0a 20 20 75 36 34 20 2a 70  pected,.  u64 *p
2a880 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72  Cksum.){.  int r
2a890 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
2a8a0 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a   pPrev->n==0 ){.
2a8b0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
2a8c0 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c  t(&rc, pPrev, n,
2a8d0 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a   (const u8*)z);.
2a8e0 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 72 63    }else.  if( rc
2a8f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
2a900 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d  pPrev->n!=n || m
2a910 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20  emcmp(pPrev->p, 
2a920 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20 75 36  z, n)) ){.    u6
2a930 34 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73  4 cksum3 = *pCks
2a940 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  um;.    const ch
2a950 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e  ar *zTerm = (con
2a960 73 74 20 63 68 61 72 2a 29 26 70 50 72 65 76 2d  st char*)&pPrev-
2a970 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20  >p[1];  /* term 
2a980 73 61 6e 73 20 70 72 65 66 69 78 2d 62 79 74 65  sans prefix-byte
2a990 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72   */.    int nTer
2a9a0 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20  m = pPrev->n-1; 
2a9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2a9c0 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  ze of zTerm in b
2a9d0 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ytes */.    int 
2a9e0 69 49 64 78 20 3d 20 28 70 50 72 65 76 2d 3e 70  iIdx = (pPrev->p
2a9f0 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f  [0] - FTS5_MAIN_
2aa00 50 52 45 46 49 58 29 3b 0a 20 20 20 20 69 6e 74  PREFIX);.    int
2aa10 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d 3d   flags = (iIdx==
2aa20 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44 45  0 ? 0 : FTS5INDE
2aa30 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29 3b  X_QUERY_PREFIX);
2aa40 0a 20 20 20 20 75 36 34 20 63 6b 31 20 3d 20 30  .    u64 ck1 = 0
2aa50 3b 0a 20 20 20 20 75 36 34 20 63 6b 32 20 3d 20  ;.    u64 ck2 = 
2aa60 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  0;..    /* Check
2aa70 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
2aa80 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 41  s returned for A
2aa90 53 43 20 61 6e 64 20 44 45 53 43 20 71 75 65 72  SC and DESC quer
2aaa0 69 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ies are.    ** t
2aab0 68 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c  he same. If not,
2aac0 20 63 61 6c 6c 20 74 68 69 73 20 63 6f 72 72 75   call this corru
2aad0 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72  ption.  */.    r
2aae0 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73  c = fts5QueryCks
2aaf0 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72  um(p, iIdx, zTer
2ab00 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
2ab10 20 26 63 6b 31 29 3b 0a 20 20 20 20 69 66 28 20   &ck1);.    if( 
2ab20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ab30 0a 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66  .      int f = f
2ab40 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51  lags|FTS5INDEX_Q
2ab50 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20  UERY_DESC;.     
2ab60 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
2ab70 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54  ksum(p, iIdx, zT
2ab80 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26  erm, nTerm, f, &
2ab90 63 6b 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ck2);.    }.    
2aba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2abb0 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
2abc0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2abd0 54 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  T;..    /* If th
2abe0 69 73 20 69 73 20 61 20 70 72 65 66 69 78 20 71  is is a prefix q
2abf0 75 65 72 79 2c 20 63 68 65 63 6b 20 74 68 61 74  uery, check that
2ac00 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74   the results ret
2ac10 75 72 6e 65 64 20 69 66 20 74 68 65 0a 20 20 20  urned if the.   
2ac20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73   ** the index is
2ac30 20 64 69 73 61 62 6c 65 64 20 61 72 65 20 74 68   disabled are th
2ac40 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20  e same. In both 
2ac50 41 53 43 20 61 6e 64 20 44 45 53 43 20 6f 72 64  ASC and DESC ord
2ac60 65 72 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  er. .    **.    
2ac70 2a 2a 20 54 68 69 73 20 63 68 65 63 6b 20 6d 61  ** This check ma
2ac80 79 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72  y only be perfor
2ac90 6d 65 64 20 69 66 20 74 68 65 20 68 61 73 68 20  med if the hash 
2aca0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20  table is empty. 
2acb0 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 62  This.    ** is b
2acc0 65 63 61 75 73 65 20 74 68 65 20 68 61 73 68 20  ecause the hash 
2acd0 74 61 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f  table only suppo
2ace0 72 74 73 20 61 20 73 69 6e 67 6c 65 20 73 63 61  rts a single sca
2acf0 6e 20 71 75 65 72 79 20 61 74 0a 20 20 20 20 2a  n query at.    *
2ad00 2a 20 61 20 74 69 6d 65 2c 20 61 6e 64 20 74 68  * a time, and th
2ad10 65 20 6d 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f  e multi-iter loo
2ad20 70 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 69  p from which thi
2ad30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2ad40 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 61  lled.    ** is a
2ad50 6c 72 65 61 64 79 20 70 65 72 66 6f 72 6d 69 6e  lready performin
2ad60 67 20 73 75 63 68 20 61 20 73 63 61 6e 2e 20 2a  g such a scan. *
2ad70 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 65  /.    if( p->nPe
2ad80 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a  ndingData==0 ){.
2ad90 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30        if( iIdx>0
2ada0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2adb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
2adc0 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
2add0 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
2ade0 4e 4f 49 44 58 3b 0a 20 20 20 20 20 20 20 20 63  NOIDX;.        c
2adf0 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  k2 = 0;.        
2ae00 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
2ae10 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
2ae20 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
2ae30 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  k2);.        if(
2ae40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ae50 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
2ae60 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2ae70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2ae80 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d  ( iIdx>0 && rc==
2ae90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2aea0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
2aeb0 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
2aec0 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54  RY_TEST_NOIDX|FT
2aed0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
2aee0 53 43 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20  SC;.        ck2 
2aef0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2af00 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
2af10 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
2af20 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29   nTerm, f, &ck2)
2af30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2af40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2af50 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46  k1!=ck2 ) rc = F
2af60 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2af70 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2af80 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20  cksum3 ^= ck1;. 
2af90 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
2afa0 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20  (&rc, pPrev, n, 
2afb0 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a  (const u8*)z);..
2afc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2afd0 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21  TE_OK && cksum3!
2afe0 3d 65 78 70 65 63 74 65 64 20 29 7b 0a 20 20 20  =expected ){.   
2aff0 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52     rc = FTS5_COR
2b000 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
2b010 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33  *pCksum = cksum3
2b020 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20  ;.  }.  p->rc = 
2b030 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20  rc;.}. .#else.# 
2b040 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 44  define fts5TestD
2b050 6c 69 64 78 52 65 76 65 72 73 65 28 78 2c 79 2c  lidxReverse(x,y,
2b060 7a 29 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  z).# define fts5
2b070 54 65 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78  TestTerm(u,v,w,x
2b080 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y,z).#endif../*
2b090 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 0a  .** Check that:.
2b0a0 2a 2a 0a 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c  **.**   1) All l
2b0b0 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65  eaves of pSeg be
2b0c0 74 77 65 65 6e 20 69 46 69 72 73 74 20 61 6e 64  tween iFirst and
2b0d0 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76   iLast (inclusiv
2b0e0 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20  e) exist and.** 
2b0f0 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72       contain zer
2b100 6f 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29  o terms..**   2)
2b110 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70   All leaves of p
2b120 53 65 67 20 62 65 74 77 65 65 6e 20 69 4e 6f 52  Seg between iNoR
2b130 6f 77 69 64 20 61 6e 64 20 69 4c 61 73 74 20 28  owid and iLast (
2b140 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74  inclusive) exist
2b150 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e   and.**      con
2b160 74 61 69 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73  tain zero rowids
2b170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b180 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
2b190 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20  ityCheckEmpty(. 
2b1a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
2b1b0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2b1c0 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20  gment *pSeg,    
2b1d0 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63   /* Segment to c
2b1e0 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f  heck internal co
2b1f0 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69  nsistency */.  i
2b200 6e 74 20 69 46 69 72 73 74 2c 0a 20 20 69 6e 74  nt iFirst,.  int
2b210 20 69 4e 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74   iNoRowid,.  int
2b220 20 69 4c 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20   iLast.){.  int 
2b230 69 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65  i;..  /* Now che
2b240 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ck that the iter
2b250 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66  .nEmpty leaves f
2b260 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72  ollowing the cur
2b270 72 65 6e 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28  rent leaf.  ** (
2b280 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
2b290 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
2b2a0 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46  s. */.  for(i=iF
2b2b0 69 72 73 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  irst; p->rc==SQL
2b2c0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61  ITE_OK && i<=iLa
2b2d0 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  st; i++){.    Ft
2b2e0 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
2b2f0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
2b300 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
2b310 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
2b320 20 69 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c   i));.    if( pL
2b330 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28  eaf ){.      if(
2b340 20 21 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d   !fts5LeafIsTerm
2b350 6c 65 73 73 28 70 4c 65 61 66 29 20 29 20 70 2d  less(pLeaf) ) p-
2b360 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2b370 50 54 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e  PT;.      if( i>
2b380 3d 69 4e 6f 52 6f 77 69 64 20 26 26 20 30 21 3d  =iNoRowid && 0!=
2b390 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
2b3a0 69 64 4f 66 66 28 70 4c 65 61 66 29 20 29 20 70  idOff(pLeaf) ) p
2b3b0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2b3c0 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  UPT;.    }.    f
2b3d0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
2b3e0 4c 65 61 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Leaf);.  }.}..st
2b3f0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
2b400 74 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64  tegrityCheckPgid
2b410 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  x(Fts5Index *p, 
2b420 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29  Fts5Data *pLeaf)
2b430 7b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66  {.  int iTermOff
2b440 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a   = 0;.  int ii;.
2b450 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
2b460 66 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20  f1 = {0,0,0};.  
2b470 46 74 73 35 42 75 66 66 65 72 20 62 75 66 32 20  Fts5Buffer buf2 
2b480 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69  = {0,0,0};..  ii
2b490 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
2b4a0 3b 0a 20 20 77 68 69 6c 65 28 20 69 69 3c 70 4c  ;.  while( ii<pL
2b4b0 65 61 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72 63  eaf->nn && p->rc
2b4c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b4d0 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
2b4e0 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e  int iOff;.    in
2b4f0 74 20 6e 49 6e 63 72 3b 0a 0a 20 20 20 20 69 69  t nIncr;..    ii
2b500 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2b510 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 69  t32(&pLeaf->p[ii
2b520 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69  ], nIncr);.    i
2b530 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72  TermOff += nIncr
2b540 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65  ;.    iOff = iTe
2b550 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20  rmOff;..    if( 
2b560 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  iOff>=pLeaf->szL
2b570 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  eaf ){.      p->
2b580 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2b590 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
2b5a0 20 69 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72   iTermOff==nIncr
2b5b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
2b5c0 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  yte;.      iOff 
2b5d0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2b5e0 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
2b5f0 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
2b600 20 20 69 66 28 20 28 69 4f 66 66 2b 6e 42 79 74    if( (iOff+nByt
2b610 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  e)>pLeaf->szLeaf
2b620 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
2b630 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2b640 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b650 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
2b660 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rSet(&p->rc, &bu
2b670 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61  f1, nByte, &pLea
2b680 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  f->p[iOff]);.   
2b690 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2b6a0 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 2c        int nKeep,
2b6b0 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f   nByte;.      iO
2b6c0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2b6d0 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
2b6e0 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20  iOff], nKeep);. 
2b6f0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2b700 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2b710 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42  eaf->p[iOff], nB
2b720 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
2b730 6e 4b 65 65 70 3e 62 75 66 31 2e 6e 20 7c 7c 20  nKeep>buf1.n || 
2b740 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65  (iOff+nByte)>pLe
2b750 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2b760 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2b770 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2b780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b790 20 62 75 66 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b   buf1.n = nKeep;
2b7a0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
2b7b0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
2b7c0 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79  ->rc, &buf1, nBy
2b7d0 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  te, &pLeaf->p[iO
2b7e0 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ff]);.      }.. 
2b7f0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
2b800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b810 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35 42       res = fts5B
2b820 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 62 75  ufferCompare(&bu
2b830 66 31 2c 20 26 62 75 66 32 29 3b 0a 20 20 20 20  f1, &buf2);.    
2b840 20 20 20 20 69 66 28 20 72 65 73 3c 3d 30 20 29      if( res<=0 )
2b850 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2b860 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
2b870 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66     }.    fts5Buf
2b880 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
2b890 62 75 66 32 2c 20 62 75 66 31 2e 6e 2c 20 62 75  buf2, buf1.n, bu
2b8a0 66 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 66 74  f1.p);.  }..  ft
2b8b0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
2b8c0 66 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  f1);.  fts5Buffe
2b8d0 72 46 72 65 65 28 26 62 75 66 32 29 3b 0a 7d 0a  rFree(&buf2);.}.
2b8e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2b8f0 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
2b900 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46  heckSegment(.  F
2b910 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b930 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
2b940 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
2b950 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
2b960 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65  *pSeg      /* Se
2b970 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
2b980 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
2b990 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ncy */.){.  Fts5
2b9a0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
2b9b0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
2b9c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2b9d0 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  tmt = 0;.  int r
2b9e0 63 32 3b 0a 20 20 69 6e 74 20 69 49 64 78 50 72  c2;.  int iIdxPr
2b9f0 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  evLeaf = pSeg->p
2ba00 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e  gnoFirst-1;.  in
2ba10 74 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66  t iDlidxPrevLeaf
2ba20 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
2ba30 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  t;..  if( pSeg->
2ba40 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20 72  pgnoFirst==0 ) r
2ba50 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e  eturn;..  fts5In
2ba60 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
2ba70 2c 20 26 70 53 74 6d 74 2c 20 73 71 6c 69 74 65  , &pStmt, sqlite
2ba80 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
2ba90 20 22 53 45 4c 45 43 54 20 73 65 67 69 64 2c 20   "SELECT segid, 
2baa0 74 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c  term, (pgno>>1),
2bab0 20 28 70 67 6e 6f 26 31 29 20 46 52 4f 4d 20 25   (pgno&1) FROM %
2bac0 51 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45  Q.'%q_idx' WHERE
2bad0 20 73 65 67 69 64 3d 25 64 22 2c 0a 20 20 20 20   segid=%d",.    
2bae0 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
2baf0 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20  pConfig->zName, 
2bb00 70 53 65 67 2d 3e 69 53 65 67 69 64 0a 20 20 29  pSeg->iSegid.  )
2bb10 29 3b 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65  );..  /* Iterate
2bb20 20 74 68 72 6f 75 67 68 20 74 68 65 20 62 2d 74   through the b-t
2bb30 72 65 65 20 68 69 65 72 61 72 63 68 79 2e 20 20  ree hierarchy.  
2bb40 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  */.  while( p->r
2bb50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2bb60 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
2bb70 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
2bb80 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b  ){.    i64 iRow;
2bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bba0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
2bbb0 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20  r this leaf */. 
2bbc0 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
2bbd0 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2bbe0 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69   /* Data for thi
2bbf0 73 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 20 20 69  s leaf */..    i
2bc00 6e 74 20 6e 49 64 78 54 65 72 6d 20 3d 20 73 71  nt nIdxTerm = sq
2bc10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
2bc20 65 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  es(pStmt, 1);.  
2bc30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
2bc40 64 78 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20  dxTerm = (const 
2bc50 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
2bc60 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
2bc70 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 49 64   1);.    int iId
2bc80 78 4c 65 61 66 20 3d 20 73 71 6c 69 74 65 33 5f  xLeaf = sqlite3_
2bc90 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2bca0 2c 20 32 29 3b 0a 20 20 20 20 69 6e 74 20 62 49  , 2);.    int bI
2bcb0 64 78 44 6c 69 64 78 20 3d 20 73 71 6c 69 74 65  dxDlidx = sqlite
2bcc0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2bcd0 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20  mt, 3);..    /* 
2bce0 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71  If the leaf in q
2bcf0 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  uestion has alre
2bd00 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64  ady been trimmed
2bd10 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e   from the segmen
2bd20 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72  t, .    ** ignor
2bd30 65 20 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e  e this b-tree en
2bd40 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  try. Otherwise, 
2bd50 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d  load it into mem
2bd60 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ory. */.    if( 
2bd70 69 49 64 78 4c 65 61 66 3c 70 53 65 67 2d 3e 70  iIdxLeaf<pSeg->p
2bd80 67 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69  gnoFirst ) conti
2bd90 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20  nue;.    iRow = 
2bda0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
2bdb0 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
2bdc0 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20   iIdxLeaf);.    
2bdd0 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2bde0 52 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20  Read(p, iRow);. 
2bdf0 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20     if( pLeaf==0 
2be00 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
2be10 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2be20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74  leaf contains at
2be30 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c   least one term,
2be40 20 61 6e 64 20 74 68 61 74 20 69 74 20 69 73 20   and that it is 
2be50 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20  equal.    ** to 
2be60 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  or larger than t
2be70 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20  he split-key in 
2be80 7a 49 64 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20  zIdxTerm.  Also 
2be90 63 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68  check that if th
2bea0 65 72 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c  ere.    ** is al
2beb0 73 6f 20 61 20 72 6f 77 69 64 20 70 6f 69 6e 74  so a rowid point
2bec0 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 6c 65  er within the le
2bed0 61 66 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  af page header, 
2bee0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20  it points to a. 
2bef0 20 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62     ** location b
2bf00 65 66 6f 72 65 20 74 68 65 20 74 65 72 6d 2e 20  efore the term. 
2bf10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 61   */.    if( pLea
2bf20 66 2d 3e 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a  f->nn<=pLeaf->sz
2bf30 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d  Leaf ){.      p-
2bf40 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2bf50 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2bf60 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20       int iOff;  
2bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf80 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
2bf90 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66  rst term on leaf
2bfa0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 52   */.      int iR
2bfb0 6f 77 69 64 4f 66 66 3b 20 20 20 20 20 20 20 20  owidOff;        
2bfc0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2bfd0 6f 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  of first rowid o
2bfe0 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20  n leaf */.      
2bff0 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
2c000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2c010 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c  ize of term on l
2c020 65 61 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  eaf in bytes */.
2c030 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20        int res;  
2c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c050 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
2c060 6f 66 20 74 65 72 6d 20 61 6e 64 20 73 70 6c 69  of term and spli
2c070 74 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20  t-key */..      
2c080 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
2c090 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61  irstTermOff(pLea
2c0a0 66 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64  f);.      iRowid
2c0b0 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69  Off = fts5LeafFi
2c0c0 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
2c0d0 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52  f);.      if( iR
2c0e0 6f 77 69 64 4f 66 66 3e 3d 69 4f 66 66 20 29 7b  owidOff>=iOff ){
2c0f0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
2c100 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2c110 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c120 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2c130 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2c140 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65  af->p[iOff], nTe
2c150 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73  rm);.        res
2c160 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66   = memcmp(&pLeaf
2c170 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54  ->p[iOff], zIdxT
2c180 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20  erm, MIN(nTerm, 
2c190 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20  nIdxTerm));.    
2c1a0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
2c1b0 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e   res = nTerm - n
2c1c0 49 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  IdxTerm;.       
2c1d0 20 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e   if( res<0 ) p->
2c1e0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2c1f0 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  T;.      }..    
2c200 20 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43    fts5IntegrityC
2c210 68 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65  heckPgidx(p, pLe
2c220 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  af);.    }.    f
2c230 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
2c240 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70  Leaf);.    if( p
2c250 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ->rc ) break;.. 
2c260 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20     /* Now check 
2c270 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45  that the iter.nE
2c280 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c  mpty leaves foll
2c290 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  owing the curren
2c2a0 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61  t leaf.    ** (a
2c2b0 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20  ) exist and (b) 
2c2c0 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
2c2d0 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64  . */.    fts5Ind
2c2e0 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2c2f0 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20 70  Empty(.        p
2c300 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72 65 76  , pSeg, iIdxPrev
2c310 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72  Leaf+1, iDlidxPr
2c320 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65  evLeaf+1, iIdxLe
2c330 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20  af-1.    );.    
2c340 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61  if( p->rc ) brea
2c350 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  k;..    /* If th
2c360 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
2c370 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68  -index, check th
2c380 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68  at it looks righ
2c390 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  t. */.    if( bI
2c3a0 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  dxDlidx ){.     
2c3b0 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
2c3c0 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20  pDlidx = 0;  /* 
2c3d0 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
2c3e0 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e  rough doclist in
2c3f0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
2c400 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64   iPrevLeaf = iId
2c410 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74  xLeaf;.      int
2c420 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e   iSegid = pSeg->
2c430 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e  iSegid;.      in
2c440 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20  t iPg = 0;.     
2c450 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20   i64 iKey;..    
2c460 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
2c470 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
2c480 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64  , 0, iSegid, iId
2c490 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  xLeaf);.        
2c4a0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
2c4b0 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
2c4c0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
2c4d0 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
2c4e0 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29   pDlidx).      )
2c4f0 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  {..        /* Ch
2c500 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65  eck any rowid-le
2c510 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63  ss pages that oc
2c520 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63  cur before the c
2c530 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a  urrent leaf. */.
2c540 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
2c550 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67  iPrevLeaf+1; iPg
2c560 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67  <fts5DlidxIterPg
2c570 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b  no(pDlidx); iPg+
2c580 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b  +){.          iK
2c590 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ey = FTS5_SEGMEN
2c5a0 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
2c5b0 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iPg);.          
2c5c0 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2c5d0 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
2c5e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
2c5f0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2c600 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 46 69    if( fts5LeafFi
2c610 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
2c620 66 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  f)!=0 ) p->rc = 
2c630 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2c640 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
2c650 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
2c660 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c680 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35  iPrevLeaf = fts5
2c690 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
2c6a0 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20  lidx);..        
2c6b0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2c6c0 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69  e leaf page indi
2c6d0 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
2c6e0 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  rator really doe
2c6f0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  s.        ** con
2c700 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73  tain the rowid s
2c710 75 67 67 65 73 74 65 64 20 62 79 20 74 68 65 20  uggested by the 
2c720 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  same. */.       
2c730 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
2c740 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
2c750 64 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20  d, iPrevLeaf);. 
2c760 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
2c770 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
2c780 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
2c790 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
2c7a0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b       i64 iRowid;
2c7b0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2c7c0 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c  RowidOff = fts5L
2c7d0 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
2c7e0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
2c7f0 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46     ASSERT_SZLEAF
2c800 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  _OK(pLeaf);.    
2c810 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
2c820 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
2c830 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2c840 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
2c850 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2c860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c870 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
2c880 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
2c890 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
2c8a0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
2c8b0 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21       if( iRowid!
2c8c0 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  =fts5DlidxIterRo
2c8d0 77 69 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d  wid(pDlidx) ) p-
2c8e0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2c8f0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
2c900 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
2c910 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
2c920 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c930 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64    }..      iDlid
2c940 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b  xPrevLeaf = iPg;
2c950 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
2c960 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
2c970 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65 73 74  ;.      fts5Test
2c980 44 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c 20  DlidxReverse(p, 
2c990 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
2c9a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c9b0 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65      iDlidxPrevLe
2c9c0 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  af = pSeg->pgnoL
2c9d0 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  ast;.      /* TO
2c9e0 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20  DO: Check there 
2c9f0 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e  is no doclist in
2ca00 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  dex */.    }..  
2ca10 20 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d    iIdxPrevLeaf =
2ca20 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a   iIdxLeaf;.  }..
2ca30 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
2ca40 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2ca50 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
2ca60 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
2ca70 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67  = rc2;..  /* Pag
2ca80 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73  e iter.iLeaf mus
2ca90 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67  t now be the rig
2caa0 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65  htmost leaf-page
2cab0 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20   in the segment 
2cac0 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70  */.#if 0.  if( p
2cad0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2cae0 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70  && iter.iLeaf!=p
2caf0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
2cb00 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
2cb10 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23  5_CORRUPT;.  }.#
2cb20 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
2cb30 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  Run internal che
2cb40 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  cks to ensure th
2cb50 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  at the FTS index
2cb60 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c   (a) is internal
2cb70 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e  ly .** consisten
2cb80 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
2cb90 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77  ns entries for w
2cba0 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20  hich the XOR of 
2cbb0 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a  the checksums.**
2cbc0 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62   as calculated b
2cbd0 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  y sqlite3Fts5Ind
2cbe0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69  exEntryCksum() i
2cbf0 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52  s cksum..**.** R
2cc00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2cc10 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74  RUPT if any of t
2cc20 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  he internal chec
2cc30 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74  ks fail, or if t
2cc40 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64  he.** checksum d
2cc50 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52  oes not match. R
2cc60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2cc70 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61  if all checks pa
2cc80 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72  ss without.** er
2cc90 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ror, or some oth
2cca0 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  er SQLite error 
2ccb0 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20  code if another 
2ccc0 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29  error (e.g. OOM)
2ccd0 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
2cce0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2ccf0 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
2cd00 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  k(Fts5Index *p, 
2cd10 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e  u64 cksum){.  in
2cd20 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70  t eDetail = p->p
2cd30 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
2cd40 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  u64 cksum2 = 
2cd50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2cd60 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62     /* Checksum b
2cd70 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73  ased on contents
2cd80 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20   of indexes */. 
2cd90 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
2cda0 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  ist = {0,0,0};  
2cdb0 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
2cdc0 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73  to hold a poslis
2cdd0 74 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20  t */.  Fts5Iter 
2cde0 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
2cdf0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
2ce00 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2ce10 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a  h entire index *
2ce20 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
2ce30 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20  e *pStruct;     
2ce40 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
2ce50 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65  ucture */..#ifde
2ce60 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2ce70 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74 72   /* Used by extr
2ce80 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73  a internal tests
2ce90 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45   only run if NDE
2cea0 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
2ceb0 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75  ed */.  u64 cksu
2cec0 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  m3 = 0;         
2ced0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2cee0 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e  sum based on con
2cef0 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73  tents of indexes
2cf00 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2cf10 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b   term = {0,0,0};
2cf20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
2cf30 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73  used to hold mos
2cf40 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f  t recent term */
2cf50 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20  .#endif.  const 
2cf60 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
2cf70 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55  INDEX_QUERY_NOOU
2cf80 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c 6f  TPUT;.  .  /* Lo
2cf90 61 64 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  ad the FTS index
2cfa0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2cfb0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
2cfc0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
2cfd0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2cfe0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
2cff0 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d  des of each segm
2d000 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65  ent match the le
2d010 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53  aves */.  if( pS
2d020 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74  truct ){.    int
2d030 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
2d040 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
2d050 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
2d060 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
2d070 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
2d080 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
2d090 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
2d0a0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
2d0b0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2d0c0 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53  ment *pSeg = &pS
2d0d0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
2d0e0 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
2d0f0 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65          fts5Inde
2d100 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
2d110 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b  egment(p, pSeg);
2d120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d130 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73   }..  /* The cks
2d140 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  um argument pass
2d150 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
2d160 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75  ion is a checksu
2d170 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a  m calculated.  *
2d180 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65  * based on all e
2d190 78 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20  xpected entries 
2d1a0 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  in the FTS index
2d1b0 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66   (including pref
2d1c0 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e  ix index.  ** en
2d1d0 74 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f  tries). This blo
2d1e0 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61  ck checks that a
2d1f0 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c   checksum calcul
2d200 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
2d210 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f  e.  ** actual co
2d220 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e  ntents of FTS in
2d230 64 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c  dex is identical
2d240 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20  ..  **.  ** Two 
2d250 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
2d260 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72  same checksum ar
2d270 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68  e calculated. Th
2d280 65 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20  e first (stack. 
2d290 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73   ** variable cks
2d2a0 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e  um2) based on en
2d2b0 74 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20  tries extracted 
2d2c0 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65  from the full-te
2d2d0 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68  xt index.  ** wh
2d2e0 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65  ile doing a line
2d2f0 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20  ar scan of each 
2d300 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78  individual index
2d310 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a   in turn. .  **.
2d320 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72    ** As each ter
2d330 6d 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  m visited by the
2d340 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61   linear scans, a
2d350 20 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20   separate query 
2d360 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
2d370 65 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72  e term is perfor
2d380 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63  med. cksum3 is c
2d390 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20  alculated based 
2d3a0 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20  on the entries. 
2d3b0 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79   ** extracted by
2d3c0 20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a   these queries..
2d3d0 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d    */.  for(fts5M
2d3e0 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
2d3f0 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30  Struct, flags, 0
2d400 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26  , 0, 0, -1, 0, &
2d410 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74  pIter);.      ft
2d420 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
2d430 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20  , pIter)==0;.   
2d440 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
2d450 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
2d460 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  , 0).  ){.    in
2d470 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
2d480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2d490 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74  e of term in byt
2d4a0 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50  es */.    i64 iP
2d4b0 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  os = 0;         
2d4c0 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
2d4d0 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c  n read from posl
2d4e0 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ist */.    int i
2d4f0 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Off = 0;        
2d500 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2d510 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20   within poslist 
2d520 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  */.    i64 iRowi
2d530 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
2d540 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
2d550 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
2d560 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
2d570 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29  rTerm(pIter, &n)
2d580 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2d590 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c  s is a new term,
2d5a0 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55   query for it. U
2d5b0 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74  pdate cksum3 wit
2d5c0 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a  h the results. *
2d5d0 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65  /.    fts5TestTe
2d5e0 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20  rm(p, &term, z, 
2d5f0 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75  n, cksum2, &cksu
2d600 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44  m3);..    if( eD
2d610 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
2d620 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
2d630 20 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c 74   if( 0==fts5Mult
2d640 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
2d650 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20  pIter) ){.      
2d660 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69    cksum2 ^= sqli
2d670 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2d680 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 30  yCksum(iRowid, 0
2d690 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  , 0, -1, z, n);.
2d6a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2d6b0 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74  e{.      poslist
2d6c0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74  .n = 0;.      ft
2d6d0 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
2d6e0 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67  (p, &pIter->aSeg
2d6f0 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31  [pIter->aFirst[1
2d700 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26 70  ].iFirst], 0, &p
2d710 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  oslist);.      w
2d720 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33  hile( 0==sqlite3
2d730 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
2d740 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73  4(poslist.p, pos
2d750 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26  list.n, &iOff, &
2d760 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20  iPos) ){.       
2d770 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35   int iCol = FTS5
2d780 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73  _POS2COLUMN(iPos
2d790 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2d7a0 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f  TokOff = FTS5_PO
2d7b0 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a  S2OFFSET(iPos);.
2d7c0 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e          cksum2 ^
2d7d0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2d7e0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
2d7f0 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f  wid, iCol, iTokO
2d800 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  ff, -1, z, n);. 
2d810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d820 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  .  fts5TestTerm(
2d830 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20  p, &term, 0, 0, 
2d840 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29  cksum2, &cksum3)
2d850 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ;..  fts5MultiIt
2d860 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20  erFree(pIter);. 
2d870 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2d880 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d  TE_OK && cksum!=
2d890 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d  cksum2 ) p->rc =
2d8a0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
2d8b0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
2d8c0 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
2d8d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2d8e0 45 42 55 47 0a 20 20 66 74 73 35 42 75 66 66 65  EBUG.  fts5Buffe
2d8f0 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65  rFree(&term);.#e
2d900 6e 64 69 66 0a 20 20 66 74 73 35 42 75 66 66 65  ndif.  fts5Buffe
2d910 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b  rFree(&poslist);
2d920 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
2d930 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
2d940 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2d950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2d990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d9d0 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
2d9e0 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
2d9f0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2da00 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
2da10 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20  ode() scalar.** 
2da20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a  function only..*
2da30 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  /../*.** Decode 
2da40 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72  a segment-data r
2da50 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  owid from the %_
2da60 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73  data table. This
2da70 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
2da80 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20  the opposite of 
2da90 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45  macro FTS5_SEGME
2daa0 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73  NT_ROWID()..*/.s
2dab0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2dac0 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36  ecodeRowid(.  i6
2dad0 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
2dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2daf0 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61   Rowid from %_da
2db00 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ta table */.  in
2db10 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20  t *piSegid,     
2db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2db30 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64   OUT: Segment id
2db40 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69   */.  int *pbDli
2db50 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
2db60 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c        /* OUT: Dl
2db70 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e  idx flag */.  in
2db80 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20  t *piHeight,    
2db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dba0 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a   OUT: Height */.
2dbb0 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20    int *piPgno   
2dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbd0 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e    /* OUT: Page n
2dbe0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70  umber */.){.  *p
2dbf0 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52  iPgno = (int)(iR
2dc00 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
2dc10 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47  << FTS5_DATA_PAG
2dc20 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  E_B) - 1));.  iR
2dc30 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
2dc40 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70  TA_PAGE_B;..  *p
2dc50 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28  iHeight = (int)(
2dc60 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
2dc70 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48  1 << FTS5_DATA_H
2dc80 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a  EIGHT_B) - 1));.
2dc90 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
2dca0 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b  5_DATA_HEIGHT_B;
2dcb0 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28  ..  *pbDlidx = (
2dcc0 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78  int)(iRowid & 0x
2dcd0 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20  0001);.  iRowid 
2dce0 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c  >>= FTS5_DATA_DL
2dcf0 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64  I_B;..  *piSegid
2dd00 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
2dd10 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
2dd20 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20  S5_DATA_ID_B) - 
2dd30 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  1));.}..static v
2dd40 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77  oid fts5DebugRow
2dd50 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  id(int *pRc, Fts
2dd60 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
2dd70 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20  64 iKey){.  int 
2dd80 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c  iSegid, iHeight,
2dd90 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20   iPgno, bDlidx; 
2dda0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63        /* Rowid c
2ddb0 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66  ompenents */.  f
2ddc0 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69  ts5DecodeRowid(i
2ddd0 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62  Key, &iSegid, &b
2dde0 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c  Dlidx, &iHeight,
2ddf0 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28   &iPgno);..  if(
2de00 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
2de10 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35    if( iKey==FTS5
2de20 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
2de30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2de40 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2de50 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2de60 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29  , "{averages} ")
2de70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2de80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2de90 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2dea0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74  (pRc, pBuf, "{st
2deb0 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20  ructure}");.    
2dec0 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20  }.  }.  else{.  
2ded0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2dee0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2def0 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73  pRc, pBuf, "{%ss
2df00 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e  egid=%d h=%d pgn
2df10 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20  o=%d}",.        
2df20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20  bDlidx ? "dlidx 
2df30 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20  " : "", iSegid, 
2df40 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20  iHeight, iPgno. 
2df50 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61     );.  }.}..sta
2df60 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
2df70 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69  ugStructure(.  i
2df80 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
2df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dfa0 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20  * IN/OUT: error 
2dfb0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
2dfc0 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74  ffer *pBuf,.  Ft
2dfd0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29  s5Structure *p.)
2dfe0 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53  {.  int iLvl, iS
2dff0 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
2e000 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
2e010 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73  hrough levels, s
2e020 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f  egments */..  fo
2e030 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
2e040 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
2e050 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
2e060 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
2e070 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  = &p->aLevel[iLv
2e080 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l];.    sqlite3F
2e090 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2e0a0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2e0b0 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c   .        " {lvl
2e0c0 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53  =%d nMerge=%d nS
2e0d0 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c  eg=%d", iLvl, pL
2e0e0 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c  vl->nMerge, pLvl
2e0f0 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20  ->nSeg.    );.  
2e100 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
2e110 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
2e120 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Seg++){.      Ft
2e130 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2e140 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
2e150 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
2e160 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2e170 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2e180 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b  f(pRc, pBuf, " {
2e190 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e  id=%d leaves=%d.
2e1a0 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20  .%d}", .        
2e1b0 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20    pSeg->iSegid, 
2e1c0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c  pSeg->pgnoFirst,
2e1d0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a   pSeg->pgnoLast.
2e1e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2e1f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2e200 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2e210 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29  (pRc, pBuf, "}")
2e220 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2e230 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74  his is part of t
2e240 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
2e250 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a   debugging aid..
2e260 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20  **.** Arguments 
2e270 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74  pBlob/nBlob cont
2e280 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64  ain a serialized
2e290 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
2e2a0 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66  bject. This.** f
2e2b0 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
2e2c0 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
2e2d0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2e2e0 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65  of the same obje
2e2f0 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66  ct.** to the buf
2e300 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68  fer passed as th
2e310 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2e320 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
2e330 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72  id fts5DecodeStr
2e340 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70  ucture(.  int *p
2e350 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
2e360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2e370 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
2e380 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2e390 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75  *pBuf,.  const u
2e3a0 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  8 *pBlob, int nB
2e3b0 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lob.){.  int rc;
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e3e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
2e3f0 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20  5Structure *p = 
2e400 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2e410 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72  Decoded structur
2e420 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72  e object */..  r
2e430 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  c = fts5Structur
2e440 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e  eDecode(pBlob, n
2e450 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20  Blob, 0, &p);.  
2e460 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e470 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20  K ){.    *pRc = 
2e480 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2e490 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67    }..  fts5Debug
2e4a0 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70  Structure(pRc, p
2e4b0 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53  Buf, p);.  fts5S
2e4c0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
2e4d0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  p);.}../*.** Thi
2e4e0 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  s is part of the
2e4f0 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
2e500 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a  ebugging aid..**
2e510 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42  .** Arguments pB
2e520 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69  lob/nBlob contai
2e530 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20  n an "averages" 
2e540 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e  record. This fun
2e550 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64  ction .** append
2e560 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
2e570 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
2e580 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74  n of record to t
2e590 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  he buffer passed
2e5a0 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f   .** as the seco
2e5b0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f  nd argument. .*/
2e5c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2e5d0 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28  5DecodeAverages(
2e5e0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
2e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e600 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
2e610 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
2e620 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
2e630 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f    const u8 *pBlo
2e640 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a  b, int nBlob.){.
2e650 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63    int i = 0;.  c
2e660 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63  onst char *zSpac
2e670 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65  e = "";..  while
2e680 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20  ( i<nBlob ){.   
2e690 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   u64 iVal;.    i
2e6a0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
2e6b0 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b  etVarint(&pBlob[
2e6c0 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  i], &iVal);.    
2e6d0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2e6e0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2e6f0 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c  c, pBuf, "%s%d",
2e700 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56   zSpace, (int)iV
2e710 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20  al);.    zSpace 
2e720 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = " ";.  }.}../*
2e730 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29  .** Buffer (a/n)
2e740 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
2e750 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66  ontain a list of
2e760 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69   serialized vari
2e770 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63  nts. Read.** eac
2e780 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70  h varint and app
2e790 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72  end its string r
2e7a0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f  epresentation to
2e7b0 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65   buffer pBuf. Re
2e7c0 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69  turn.** after ei
2e7d0 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62  ther the input b
2e7e0 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74  uffer is exhaust
2e7f0 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20  ed or a 0 value 
2e800 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  is read..**.** T
2e810 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2e820 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2e830 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
2e840 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2e850 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2e860 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
2e870 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
2e880 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
2e890 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
2e8a0 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  n){.  int iOff =
2e8b0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66   0;.  while( iOf
2e8c0 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  f<n ){.    int i
2e8d0 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  Val;.    iOff +=
2e8e0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2e8f0 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29  (&a[iOff], iVal)
2e900 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2e910 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2e920 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2e930 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d   %d", iVal);.  }
2e940 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
2e950 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61  }../*.** The sta
2e960 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f  rt of buffer (a/
2e970 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  n) contains the 
2e980 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69  start of a docli
2e990 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a  st. The doclist.
2e9a0 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ** may or may no
2e9b0 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20  t finish within 
2e9c0 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73  the buffer. This
2e9d0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
2e9e0 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72  s a text.** repr
2e9f0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2ea00 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f  e part of the do
2ea10 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72  clist that is pr
2ea20 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a  esent to buffer.
2ea30 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20  ** pBuf. .**.** 
2ea40 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2ea50 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2ea60 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
2ea70 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
2ea80 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2ea90 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  t fts5DecodeDocl
2eaa0 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
2eab0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2eac0 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2ead0 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69   n){.  i64 iDoci
2eae0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  d = 0;.  int iOf
2eaf0 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e  f = 0;..  if( n>
2eb00 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20  0 ){.    iOff = 
2eb10 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
2eb20 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69  rint(a, (u64*)&i
2eb30 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Docid);.    sqli
2eb40 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2eb50 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2eb60 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c  Buf, " id=%lld",
2eb70 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20   iDocid);.  }.  
2eb80 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
2eb90 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20  .    int nPos;. 
2eba0 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20     int bDel;.   
2ebb0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2ebc0 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69  PoslistSize(&a[i
2ebd0 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
2ebe0 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
2ebf0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2ec00 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2ec10 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20  , " nPos=%d%s", 
2ec20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22  nPos, bDel?"*":"
2ec30 22 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  ");.    iOff += 
2ec40 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2ec50 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b  t(pRc, pBuf, &a[
2ec60 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66  iOff], MIN(n-iOf
2ec70 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69  f, nPos));.    i
2ec80 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
2ec90 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
2eca0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
2ecb0 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
2ecc0 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
2ecd0 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
2ece0 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c    iDocid += iDel
2ecf0 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ta;.      sqlite
2ed00 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2ed10 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2ed20 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69  f, " id=%lld", i
2ed30 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Docid);.    }.  
2ed40 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66  }..  return iOff
2ed50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2ed60 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74  function is part
2ed70 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
2ed80 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20  ode() debugging 
2ed90 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  function. It is 
2eda0 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75 73  .** only ever us
2edb0 65 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e  ed with detail=n
2edc0 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  one tables..**.*
2edd0 2a 20 42 75 66 66 65 72 20 28 70 44 61 74 61 2f  * Buffer (pData/
2ede0 6e 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73 20  nData) contains 
2edf0 61 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 65  a doclist in the
2ee00 20 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79 20   format used by 
2ee10 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74  detail=none.** t
2ee20 61 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e 63  ables. This func
2ee30 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68  tion appends a h
2ee40 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65  uman-readable ve
2ee50 72 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c 69  rsion of that li
2ee60 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20  st to.** buffer 
2ee70 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  pBuf..**.** If *
2ee80 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61  pRc is other tha
2ee90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  n SQLITE_OK when
2eea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2eeb0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
2eec0 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20 61  a.** no-op. If a
2eed0 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20 65  n OOM or other e
2eee0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
2eef0 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
2ef00 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65 74  , *pRc is.** set
2ef10 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72   to an SQLite er
2ef20 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20  ror code before 
2ef30 72 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 66  returning. The f
2ef40 69 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62 75  inal state of bu
2ef50 66 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73 20  ffer.** pBuf is 
2ef60 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
2ef70 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
2ef80 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2ef90 65 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69 6e  eRowidList(.  in
2efa0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2efc0 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
2efd0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2efe0 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20  fer *pBuf,      
2eff0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
2f000 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78  er to append tex
2f010 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  t to */.  const 
2f020 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  u8 *pData, int n
2f030 44 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61 74  Data      /* Dat
2f040 61 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73 74  a to decode list
2f050 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d 20  -of-rowids from 
2f060 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  */.){.  int i = 
2f070 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20  0;.  i64 iRowid 
2f080 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69  = 0;..  while( i
2f090 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63 6f  <nData ){.    co
2f0a0 6e 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20 3d  nst char *zApp =
2f0b0 20 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56 61   "";.    u64 iVa
2f0c0 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  l;.    i += sqli
2f0d0 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2f0e0 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56 61  (&pData[i], &iVa
2f0f0 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 2b  l);.    iRowid +
2f100 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66 28  = iVal;..    if(
2f110 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74   i<nData && pDat
2f120 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20  a[i]==0x00 ){.  
2f130 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69      i++;.      i
2f140 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44  f( i<nData && pD
2f150 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a  ata[i]==0x00 ){.
2f160 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
2f170 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22 3b       zApp = "+";
2f180 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f190 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a 22        zApp = "*"
2f1a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f1b0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2f1c0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2f1d0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2f1e0 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64 2c  %lld%s", iRowid,
2f1f0 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   zApp);.  }.}../
2f200 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
2f210 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d  ntation of user-
2f220 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
2f230 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63  unction fts5_dec
2f240 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
2f250 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2f260 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
2f270 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2f280 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x,          /* F
2f290 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
2f2a0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  text */.  int nA
2f2b0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
2f2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2f2d0 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77  ber of args (alw
2f2e0 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69  ays 2) */.  sqli
2f2f0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
2f300 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  l           /* F
2f310 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
2f320 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52  s */.){.  i64 iR
2f330 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
2f340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
2f350 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65  id for record be
2f360 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20  ing decoded */. 
2f370 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69   int iSegid,iHei
2f380 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78  ght,iPgno,bDlidx
2f390 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e  ;/* Rowid compon
2f3a0 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
2f3b0 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e  u8 *aBlob; int n
2f3c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63  ;         /* Rec
2f3d0 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f  ord to decode */
2f3e0 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20  .  u8 *a = 0;.  
2f3f0 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20  Fts5Buffer s;   
2f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f410 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74  /* Build up text
2f420 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20   to return here 
2f430 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2f440 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2f450 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2f460 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ode */.  int nSp
2f470 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65  ace = 0;.  int e
2f480 44 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71  DetailNone = (sq
2f490 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
2f4a0 70 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73  pCtx)!=0);..  as
2f4b0 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
2f4c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
2f4d0 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28  nArg);.  memset(
2f4e0 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  &s, 0, sizeof(Ft
2f4f0 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52  s5Buffer));.  iR
2f500 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
2f510 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c  alue_int64(apVal
2f520 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  [0]);..  /* Make
2f530 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
2f540 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28  econd argument (
2f550 61 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62  a blob) in aBlob
2f560 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a  []. The aBlob[].
2f570 20 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c    ** copy is fol
2f580 6c 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44 41  lowed by FTS5_DA
2f590 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20  TA_ZERO_PADDING 
2f5a0 30 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63  0x00 bytes, whic
2f5b0 68 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20  h prevents.  ** 
2f5c0 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
2f5d0 20 65 76 65 6e 20 69 66 20 74 68 65 20 72 65 63   even if the rec
2f5e0 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ord is corrupt. 
2f5f0 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65   */.  n = sqlite
2f600 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70  3_value_bytes(ap
2f610 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62  Val[1]);.  aBlob
2f620 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2f630 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b  _blob(apVal[1]);
2f640 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20  .  nSpace = n + 
2f650 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
2f660 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75  ADDING;.  a = (u
2f670 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  8*)sqlite3Fts5Ma
2f680 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53  llocZero(&rc, nS
2f690 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d  pace);.  if( a==
2f6a0 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f  0 ) goto decode_
2f6b0 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c  out;.  memcpy(a,
2f6c0 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20 20   aBlob, n);...  
2f6d0 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
2f6e0 69 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64 2c  iRowid, &iSegid,
2f6f0 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67   &bDlidx, &iHeig
2f700 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
2f710 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26  fts5DebugRowid(&
2f720 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b  rc, &s, iRowid);
2f730 0a 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b  .  if( bDlidx ){
2f740 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 64 6c  .    Fts5Data dl
2f750 69 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  idx;.    Fts5Dli
2f760 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20  dxLvl lvl;..    
2f770 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20  dlidx.p = a;.   
2f780 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a   dlidx.nn = n;..
2f790 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c      memset(&lvl,
2f7a0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
2f7b0 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c  lidxLvl));.    l
2f7c0 76 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69 64  vl.pData = &dlid
2f7d0 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66  x;.    lvl.iLeaf
2f7e0 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20  Pgno = iPgno;.. 
2f7f0 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78     for(fts5Dlidx
2f800 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c  LvlNext(&lvl); l
2f810 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35  vl.bEof==0; fts5
2f820 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76  DlidxLvlNext(&lv
2f830 6c 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l)){.      sqlit
2f840 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f850 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73  ndPrintf(&rc, &s
2f860 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 25  , .          " %
2f870 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c  d(%lld)", lvl.iL
2f880 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f  eafPgno, lvl.iRo
2f890 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  wid.      );.   
2f8a0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69   }.  }else if( i
2f8b0 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
2f8c0 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35  if( iRowid==FTS5
2f8d0 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
2f8e0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63  ){.      fts5Dec
2f8f0 6f 64 65 41 76 65 72 61 67 65 73 28 26 72 63 2c  odeAverages(&rc,
2f900 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20   &s, a, n);.    
2f910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
2f920 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65  5DecodeStructure
2f930 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b  (&rc, &s, a, n);
2f940 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2f950 66 28 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20 29  f( eDetailNone )
2f960 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  {.    Fts5Buffer
2f970 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20   term;          
2f980 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
2f990 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61  erm read from pa
2f9a0 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ge */.    int sz
2f9b0 4c 65 61 66 3b 0a 20 20 20 20 69 6e 74 20 69 50  Leaf;.    int iP
2f9c0 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66  gidxOff = szLeaf
2f9d0 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
2f9e0 5b 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 54  [2]);.    int iT
2f9f0 65 72 6d 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20  ermOff;.    int 
2fa00 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 69  nKeep = 0;.    i
2fa10 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 6d 65  nt iOff;..    me
2fa20 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
2fa30 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
2fa40 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f  ));..    /* Deco
2fa50 64 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74  de any entries t
2fa60 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65  hat occur before
2fa70 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2e   the first term.
2fa80 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 7a 4c 65   */.    if( szLe
2fa90 61 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 50  af<n ){.      iP
2faa0 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
2fab0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
2fac0 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f  gidxOff], iTermO
2fad0 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ff);.    }else{.
2fae0 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d        iTermOff =
2faf0 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20   szLeaf;.    }. 
2fb00 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77     fts5DecodeRow
2fb10 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  idList(&rc, &s, 
2fb20 26 61 5b 34 5d 2c 20 69 54 65 72 6d 4f 66 66 2d  &a[4], iTermOff-
2fb30 34 29 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20  4);..    iOff = 
2fb40 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 77 68  iTermOff;.    wh
2fb50 69 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66  ile( iOff<szLeaf
2fb60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41   ){.      int nA
2fb70 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ppend;..      /*
2fb80 20 52 65 61 64 20 74 68 65 20 74 65 72 6d 20 64   Read the term d
2fb90 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ata for the next
2fba0 20 74 65 72 6d 2a 2f 0a 20 20 20 20 20 20 69 4f   term*/.      iO
2fbb0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2fbc0 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
2fbd0 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 20 20  nAppend);.      
2fbe0 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a  term.n = nKeep;.
2fbf0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
2fc00 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20  AppendBlob(&rc, 
2fc10 26 74 65 72 6d 2c 20 6e 41 70 70 65 6e 64 2c 20  &term, nAppend, 
2fc20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  &a[iOff]);.     
2fc30 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2fc40 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a  erAppendPrintf(.
2fc50 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
2fc60 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
2fc70 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
2fc80 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
2fc90 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66     );.      iOff
2fca0 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20   += nAppend;..  
2fcb0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
2fcc0 74 20 77 68 65 72 65 20 74 68 65 20 64 6f 63 6c  t where the docl
2fcd0 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72  ist for this ter
2fce0 6d 20 65 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20  m ends */.      
2fcf0 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  if( iPgidxOff<n 
2fd00 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2fd10 49 6e 63 72 3b 0a 20 20 20 20 20 20 20 20 69 50  Incr;.        iP
2fd20 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
2fd30 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
2fd40 67 69 64 78 4f 66 66 5d 2c 20 6e 49 6e 63 72 29  gidxOff], nIncr)
2fd50 3b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f  ;.        iTermO
2fd60 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20  ff += nIncr;.   
2fd70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fd80 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c    iTermOff = szL
2fd90 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eaf;.      }..  
2fda0 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f      fts5DecodeRo
2fdb0 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c  widList(&rc, &s,
2fdc0 20 26 61 5b 69 4f 66 66 5d 2c 20 69 54 65 72 6d   &a[iOff], iTerm
2fdd0 4f 66 66 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20  Off-iOff);.     
2fde0 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
2fdf0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
2fe00 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  <szLeaf ){.     
2fe10 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2fe20 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
2fe30 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
2fe40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2fe50 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
2fe60 74 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  term);.  }else{.
2fe70 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
2fe80 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2fe90 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72    /* Current ter
2fea0 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67 65  m read from page
2feb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
2fec0 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2fed0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2fee0 6f 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d 20  of pgidx in a[] 
2fef0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64  */.    int iPgid
2ff00 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69 50  xOff;.    int iP
2ff10 67 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20 20  gidxPrev = 0;   
2ff20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
2ff30 6f 75 73 20 76 61 6c 75 65 20 72 65 61 64 20 66  ous value read f
2ff40 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20 20  rom pgidx */.   
2ff50 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20   int iTermOff = 
2ff60 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77 69  0;.    int iRowi
2ff70 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e  dOff = 0;.    in
2ff80 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20  t iOff;.    int 
2ff90 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d  nDoclist;..    m
2ffa0 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
2ffb0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
2ffc0 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3c  r));..    if( n<
2ffd0 34 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4 ){.      sqlit
2ffe0 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
2fff0 26 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f 6e  &rc, &s, 7, (con
30000 73 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22  st u8*)"corrupt"
30010 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  );.      goto de
30020 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 65  code_out;.    }e
30030 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  lse{.      iRowi
30040 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  dOff = fts5GetU1
30050 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  6(&a[0]);.      
30060 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65  iPgidxOff = szLe
30070 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  af = fts5GetU16(
30080 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  &a[2]);.      if
30090 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b  ( iPgidxOff<n ){
300a0 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74  .        fts5Get
300b0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
300c0 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66  dxOff], iTermOff
300d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
300e0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
300f0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
30100 74 20 74 61 69 6c 20 61 74 20 74 68 65 20 73 74  t tail at the st
30110 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  art of the page 
30120 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  */.    if( iRowi
30130 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20  dOff!=0 ){.     
30140 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66   iOff = iRowidOf
30150 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  f;.    }else if(
30160 20 69 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b 0a   iTermOff!=0 ){.
30170 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65        iOff = iTe
30180 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65  rmOff;.    }else
30190 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 73  {.      iOff = s
301a0 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20  zLeaf;.    }.   
301b0 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
301c0 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34  st(&rc, &s, &a[4
301d0 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20  ], iOff-4);..   
301e0 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 6d   /* Decode any m
301f0 6f 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74 61  ore doclist data
30200 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e   that appears on
30210 20 74 68 65 20 70 61 67 65 20 62 65 66 6f 72 65   the page before
30220 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
30230 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e  t term. */.    n
30240 44 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72 6d  Doclist = (iTerm
30250 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20 3a  Off ? iTermOff :
30260 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66 3b   szLeaf) - iOff;
30270 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 44  .    fts5DecodeD
30280 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
30290 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69  &a[iOff], nDocli
302a0 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  st);..    while(
302b0 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
302c0 20 20 20 20 20 20 69 6e 74 20 62 46 69 72 73 74        int bFirst
302d0 20 3d 20 28 69 50 67 69 64 78 4f 66 66 3d 3d 73   = (iPgidxOff==s
302e0 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a 20 54  zLeaf);     /* T
302f0 72 75 65 20 66 6f 72 20 66 69 72 73 74 20 74 65  rue for first te
30300 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  rm on page */.  
30310 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
30320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
30340 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  es of data */.  
30350 20 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20      int iEnd;.  
30360 20 20 20 20 0a 20 20 20 20 20 20 69 50 67 69 64      .      iPgid
30370 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  xOff += fts5GetV
30380 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
30390 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
303a0 20 20 20 20 20 69 50 67 69 64 78 50 72 65 76 20       iPgidxPrev 
303b0 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  += nByte;.      
303c0 69 4f 66 66 20 3d 20 69 50 67 69 64 78 50 72 65  iOff = iPgidxPre
303d0 76 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 50  v;..      if( iP
303e0 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  gidxOff<n ){.   
303f0 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
30400 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
30410 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
30420 20 20 20 20 69 45 6e 64 20 3d 20 69 50 67 69 64      iEnd = iPgid
30430 78 50 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a 20  xPrev + nByte;. 
30440 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30450 20 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65 61      iEnd = szLea
30460 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  f;.      }..    
30470 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20    if( bFirst==0 
30480 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
30490 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
304a0 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79  32(&a[iOff], nBy
304b0 74 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72  te);.        ter
304c0 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  m.n = nByte;.   
304d0 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 66 66 20     }.      iOff 
304e0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
304f0 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79  32(&a[iOff], nBy
30500 74 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  te);.      fts5B
30510 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
30520 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74  &rc, &term, nByt
30530 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  e, &a[iOff]);.  
30540 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74      iOff += nByt
30550 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e;..      sqlite
30560 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
30570 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  dPrintf(.       
30580 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65     &rc, &s, " te
30590 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e  rm=%.*s", term.n
305a0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74  , (const char*)t
305b0 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20  erm.p.      );. 
305c0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
305d0 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26  5DecodeDoclist(&
305e0 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
305f0 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20 20  , iEnd-iOff);.  
30600 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66    }..    fts5Buf
30610 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
30620 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f    }.  . decode_o
30630 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
30640 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  ee(a);.  if( rc=
30650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30660 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
30670 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e  _text(pCtx, (con
30680 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e  st char*)s.p, s.
30690 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
306a0 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ENT);.  }else{. 
306b0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
306c0 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74  t_error_code(pCt
306d0 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74  x, rc);.  }.  ft
306e0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29  s5BufferFree(&s)
306f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
30700 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
30710 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63   user-defined sc
30720 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74  alar function ft
30730 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73  s5_rowid()..*/.s
30740 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 52  tatic void fts5R
30750 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20  owidFunction(.  
30760 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
30770 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
30780 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  /* Function call
30790 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
307a0 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
307b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
307c0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   Number of args 
307d0 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20  (always 2) */.  
307e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
307f0 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
30800 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75  /* Function argu
30810 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ments */.){.  co
30820 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a  nst char *zArg;.
30830 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b    if( nArg==0 ){
30840 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
30850 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
30860 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35  "should be: fts5
30870 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20  _rowid(subject, 
30880 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d  ....)", -1);.  }
30890 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d  else{.    zArg =
308a0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
308b0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
308c0 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20  (apVal[0]);.    
308d0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
308e0 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65  tricmp(zArg, "se
308f0 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  gment") ){.     
30900 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
30910 20 20 20 69 6e 74 20 73 65 67 69 64 2c 20 70 67     int segid, pg
30920 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  no;.      if( nA
30930 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg!=3 ){.       
30940 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
30950 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20  error(pCtx, .   
30960 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64           "should
30970 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28   be: fts5_rowid(
30980 27 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64  'segment', segid
30990 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20  , pgno))", -1.  
309a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
309b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
309c0 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  gid = sqlite3_va
309d0 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d  lue_int(apVal[1]
309e0 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20  );.        pgno 
309f0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
30a00 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20  int(apVal[2]);. 
30a10 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20         iRowid = 
30a20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
30a30 49 44 28 73 65 67 69 64 2c 20 70 67 6e 6f 29 3b  ID(segid, pgno);
30a40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30a50 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
30a60 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  tx, iRowid);.   
30a70 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
30a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
30a90 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
30aa0 20 0a 20 20 20 20 20 20 20 20 22 66 69 72 73 74   .        "first
30ab0 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77   arg to fts5_row
30ac0 69 64 28 29 20 6d 75 73 74 20 62 65 20 27 73 65  id() must be 'se
30ad0 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20 20  gment'" , -1.   
30ae0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
30af0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
30b00 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
30b10 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67 20 74  of registering t
30b20 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77  he FTS5 module w
30b30 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ith database.** 
30b40 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49  connection db. I
30b50 74 20 72 65 67 69 73 74 65 72 73 20 73 65 76 65  t registers seve
30b60 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ral user-defined
30b70 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
30b80 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68  s useful.** with
30b90 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FTS5..**.** If 
30ba0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
30bb0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
30bc0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
30bd0 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65  ccurs, some othe
30be0 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  r.** SQLite erro
30bf0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
30c00 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69  ed instead..*/.i
30c10 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
30c20 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20  dexInit(sqlite3 
30c30 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *db){.  int rc =
30c40 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
30c50 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20  function(.      
30c60 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65  db, "fts5_decode
30c70 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
30c80 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65  8, 0, fts5Decode
30c90 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20  Function, 0, 0. 
30ca0 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
30cb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30cc0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
30cd0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
30ce0 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
30cf0 64 65 63 6f 64 65 5f 6e 6f 6e 65 22 2c 20 32 2c  decode_none", 2,
30d00 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45   .        SQLITE
30d10 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 64 62  _UTF8, (void*)db
30d20 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63  , fts5DecodeFunc
30d30 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29  tion, 0, 0.    )
30d40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
30d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
30d70 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
30d80 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73          db, "fts
30d90 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51  5_rowid", -1, SQ
30da0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
30db0 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c  s5RowidFunction,
30dc0 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
30dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30de0 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
30df0 35 49 6e 64 65 78 52 65 73 65 74 28 46 74 73 35  5IndexReset(Fts5
30e00 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  Index *p){.  ass
30e10 65 72 74 28 20 70 2d 3e 70 53 74 72 75 63 74 3d  ert( p->pStruct=
30e20 3d 30 20 7c 7c 20 70 2d 3e 69 53 74 72 75 63 74  =0 || p->iStruct
30e30 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20 20  Version!=0 );.  
30e40 69 66 28 20 66 74 73 35 49 6e 64 65 78 44 61 74  if( fts5IndexDat
30e50 61 56 65 72 73 69 6f 6e 28 70 29 21 3d 70 2d 3e  aVersion(p)!=p->
30e60 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 20 29  iStructVersion )
30e70 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  {.    fts5Struct
30e80 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
30e90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  ;.  }.  return f
30ea0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
30eb0 29 3b 0a 7d 0a                                   );.}.