/ Hex Artifact Content
Login

Artifact 78069efb54559a17c35906a741362d0b5c899bd0:


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 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74  */.};..struct Ft
2c30: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a  s5DoclistIter {.
2c40: 20 20 75 38 20 2a 61 45 6f 66 3b 20 20 20 20 20    u8 *aEof;     
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2c70: 31 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20  1 byte past end 
2c80: 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20  of doclist */.. 
2c90: 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61   /* Output varia
2ca0: 62 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d  bles. aPoslist==
2cb0: 30 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36  0 at EOF */.  i6
2cc0: 34 20 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a  4 iRowid;.  u8 *
2cd0: 61 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20  aPoslist;.  int 
2ce0: 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20  nPoslist;.  int 
2cf0: 6e 53 69 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  nSize;.};../*.**
2d00: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2d10: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22   the "structure"
2d20: 20 72 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68   record for each
2d30: 20 69 6e 64 65 78 20 61 72 65 20 72 65 70 72 65   index are repre
2d40: 73 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  sented.** using 
2d50: 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65  an Fts5Structure
2d60: 20 72 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72   record in memor
2d70: 79 2e 20 57 68 69 63 68 20 75 73 65 73 20 69 6e  y. Which uses in
2d80: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a  stances of the .
2d90: 2a 2a 20 6f 74 68 65 72 20 46 74 73 35 53 74 72  ** other Fts5Str
2da0: 75 63 74 75 72 65 58 58 58 20 74 79 70 65 73 20  uctureXXX types 
2db0: 61 73 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a  as components..*
2dc0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  /.struct Fts5Str
2dd0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a  uctureSegment {.
2de0: 20 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20    int iSegid;   
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
2e10: 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72  */.  int pgnoFir
2e20: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
2e30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65       /* First le
2e40: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  af page number i
2e50: 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  n segment */.  i
2e60: 6e 74 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20  nt pgnoLast;    
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e80: 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
2e90: 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
2ea0: 6e 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  nt */.};.struct 
2eb0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
2ec0: 65 6c 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67  el {.  int nMerg
2ed0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ee0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ef0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
2f00: 69 6e 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20  incr-merge */.  
2f10: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2f40: 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c  of segments on l
2f50: 65 76 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74  evel */.  Fts5St
2f60: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
2f70: 61 53 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72  aSeg;     /* Arr
2f80: 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20  ay of segments. 
2f90: 61 53 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73  aSeg[0] is oldes
2fa0: 74 2e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  t. */.};.struct 
2fb0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a  Fts5Structure {.
2fc0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65    /* Object refe
2ff0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20  rence count */. 
3000: 20 75 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74   u64 nWriteCount
3010: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
3020: 20 2f 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73   /* Total leaves
3030: 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65   written to leve
3040: 6c 20 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  l 0 */.  int nSe
3050: 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  gment;          
3060: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
3070: 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
3080: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3090: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20    int nLevel;   
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
30c0: 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e  evels in this in
30d0: 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  dex */.  Fts5Str
30e0: 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76  uctureLevel aLev
30f0: 65 6c 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61  el[1];   /* Arra
3100: 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65  y of nLevel leve
3110: 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a  l objects */.};.
3120: 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
3130: 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65 67   of type Fts5Seg
3140: 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20 74  Writer is used t
3150: 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65  o write to segme
3160: 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  nts..*/.struct F
3170: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a  ts5PageWriter {.
3180: 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20    int pgno;     
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
31b0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
31c0: 2f 0a 20 20 69 6e 74 20 69 50 72 65 76 50 67 69  /.  int iPrevPgi
31d0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
31e0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
31f0: 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e  value written in
3200: 74 6f 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74  to pgidx */.  Ft
3210: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3230: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3240: 6e 67 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  ng leaf data */.
3250: 20 20 46 74 73 35 42 75 66 66 65 72 20 70 67 69    Fts5Buffer pgi
3260: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
3270: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
3280: 61 69 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65  aining page-inde
3290: 78 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  x */.  Fts5Buffe
32a0: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
32b0: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
32c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76   containing prev
32d0: 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67  ious term on pag
32e0: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  e */.};.struct F
32f0: 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b  ts5DlidxWriter {
3300: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20  .  int pgno;    
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
3330: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
3340: 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61  */.  int bPrevVa
3350: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
3360: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3370: 69 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a  iPrev is valid *
3380: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 3b 20 20  /.  i64 iPrev;  
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
33b0: 72 6f 77 69 64 20 76 61 6c 75 65 20 77 72 69 74  rowid value writ
33c0: 74 65 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  ten to page */. 
33d0: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
3400: 69 6e 69 6e 67 20 70 61 67 65 20 64 61 74 61 20  ining page data 
3410: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3420: 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69  5SegWriter {.  i
3430: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3450: 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69 74 65  * Segid to write
3460: 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67   to */.  Fts5Pag
3470: 65 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  eWriter writer; 
3480: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3490: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
34a0: 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69  .  i64 iPrevRowi
34b0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
34c0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
34d0: 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  owid written to 
34e0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
34f0: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
3500: 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  InDoclist;      
3510: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
3520: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
3530: 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   in doclist */. 
3540: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3550: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
3560: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3570: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3580: 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20  in page */.  /* 
3590: 54 4f 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28  TODO1: Can use (
35a0: 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d  writer.pgidx.n==
35b0: 30 29 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46  0) instead of bF
35c0: 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a  irstTermInPage *
35d0: 2f 0a 20 20 75 38 20 62 46 69 72 73 74 54 65 72  /.  u8 bFirstTer
35e0: 6d 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  mInPage;        
35f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
3600: 65 78 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  ext term will be
3610: 20 66 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a   first in leaf *
3620: 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69  /.  int nLeafWri
3630: 74 74 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tten;           
3640: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3650: 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74   leaf pages writ
3660: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d  ten */.  int nEm
3670: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
3680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3690: 65 72 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  er of contiguous
36a0: 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73   term-less nodes
36b0: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64   */..  int nDlid
36c0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
36d0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
36e0: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69  ted size of aDli
36f0: 64 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  dx[] array */.  
3700: 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
3710: 2a 61 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20  *aDlidx;        
3720: 2f 2a 20 41 72 72 61 79 20 6f 66 20 46 74 73 35  /* Array of Fts5
3730: 44 6c 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65  DlidxWriter obje
3740: 63 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c  cts */..  /* Val
3750: 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ues to insert in
3760: 74 6f 20 74 68 65 20 25 5f 69 64 78 20 74 61 62  to the %_idx tab
3770: 6c 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  le */.  Fts5Buff
3780: 65 72 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20  er btterm;      
3790: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
37a0: 74 65 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69  term to insert i
37b0: 6e 74 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20  nto %_idx table 
37c0: 2a 2f 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65  */.  int iBtPage
37d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37e0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
37f0: 62 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ber correspondin
3800: 67 20 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d  g to btterm */.}
3810: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
3820: 74 20 46 74 73 35 43 52 65 73 75 6c 74 20 46 74  t Fts5CResult Ft
3830: 73 35 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63  s5CResult;.struc
3840: 74 20 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a  t Fts5CResult {.
3850: 20 20 75 31 36 20 69 46 69 72 73 74 3b 20 20 20    u16 iFirst;   
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3870: 20 20 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65    /* aSeg[] inde
3880: 78 20 6f 66 20 66 69 72 73 74 65 73 74 20 69 74  x of firstest it
3890: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62  erator */.  u8 b
38a0: 54 65 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20  TermEq;         
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
38c0: 72 75 65 20 69 66 20 74 68 65 20 74 65 72 6d 73  rue if the terms
38d0: 20 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b   are equal */.};
38e0: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66  ../*.** Object f
38f0: 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
3900: 6f 75 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65  ough a single se
3910: 67 6d 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20  gment, visiting 
3920: 65 61 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a  each term/rowid.
3930: 2a 2a 20 70 61 69 72 20 69 6e 20 74 68 65 20 73  ** pair in the s
3940: 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53  egment..**.** pS
3950: 65 67 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67  eg:.**   The seg
3960: 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20  ment to iterate 
3970: 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69  through..**.** i
3980: 4c 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43  LeafPgno:.**   C
3990: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
39a0: 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73   number within s
39b0: 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c  egment..**.** iL
39c0: 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20  eafOffset:.**   
39d0: 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68  Byte offset with
39e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  in the current l
39f0: 65 61 66 20 74 68 61 74 20 69 73 20 74 68 65 20  eaf that is the 
3a00: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
3a10: 65 20 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e  e .**   position
3a20: 20 6c 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20   list data (one 
3a30: 62 79 74 65 20 70 61 73 73 65 64 20 74 68 65 20  byte passed the 
3a40: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
3a50: 7a 65 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20  ze field)..**   
3a60: 72 6f 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74  rowid field of t
3a70: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
3a80: 2e 20 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69  . Usually this i
3a90: 73 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64  s the size field
3aa0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73   of the.**   pos
3ab0: 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e  ition list data.
3ac0: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
3ad0: 73 20 69 66 20 74 68 65 20 72 6f 77 69 64 20 66  s if the rowid f
3ae0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
3af0: 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68  ntry .**   is th
3b00: 65 20 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20  e last thing on 
3b10: 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a  the leaf page..*
3b20: 2a 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20  *.** pLeaf:.**  
3b30: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3b40: 6e 67 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  ng current leaf 
3b50: 70 61 67 65 20 64 61 74 61 2e 20 53 65 74 20 74  page data. Set t
3b60: 6f 20 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a  o NULL at EOF..*
3b70: 2a 0a 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67  *.** iTermLeafPg
3b80: 6e 6f 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66  no, iTermLeafOff
3b90: 73 65 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70  set:.**   Leaf p
3ba0: 61 67 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61  age number conta
3bb0: 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74  ining the last t
3bc0: 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68  erm read from th
3bd0: 65 20 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a  e segment. And.*
3be0: 2a 20 20 20 74 68 65 20 6f 66 66 73 65 74 20 69  *   the offset i
3bf0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
3c00: 77 69 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61  wing the term da
3c10: 74 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a  ta..**.** flags:
3c20: 0a 2a 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54  .**   Mask of FT
3c30: 53 35 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76  S5_SEGITER_XXX v
3c40: 61 6c 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74  alues. Interpret
3c50: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
3c60: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
3c70: 54 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20  TER_ONETERM:.** 
3c80: 20 20 20 20 49 66 20 73 65 74 2c 20 73 65 74 20      If set, set 
3c90: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
3ca0: 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74  point to EOF aft
3cb0: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  er the current d
3cc0: 6f 63 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68  oclist .**     h
3cd0: 61 73 20 62 65 65 6e 20 65 78 68 61 75 73 74 65  as been exhauste
3ce0: 64 2e 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65  d. Do not procee
3cf0: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65  d to the next te
3d00: 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
3d10: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f  t..**.**   FTS5_
3d20: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a  SEGITER_REVERSE:
3d30: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
3d40: 67 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73  g is only ever s
3d50: 65 74 20 69 66 20 46 54 53 35 5f 53 45 47 49 54  et if FTS5_SEGIT
3d60: 45 52 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c  ER_ONETERM is al
3d70: 73 6f 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20  so set. If.**   
3d80: 20 20 69 74 20 69 73 20 73 65 74 2c 20 69 74 65    it is set, ite
3d90: 72 61 74 65 20 74 68 72 6f 75 67 68 20 72 6f 77  rate through row
3da0: 69 64 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67  id in descending
3db0: 20 6f 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f   order instead o
3dc0: 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66  f the.**     def
3dd0: 61 75 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f  ault ascending o
3de0: 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77  rder..**.** iRow
3df0: 69 64 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f  idOffset/nRowidO
3e00: 66 66 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73  ffset/aRowidOffs
3e10: 65 74 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65  et:.**     These
3e20: 20 61 72 65 20 75 73 65 64 20 69 66 20 74 68 65   are used if the
3e30: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
3e40: 56 45 52 53 45 20 66 6c 61 67 20 69 73 20 73 65  VERSE flag is se
3e50: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72  t..**.**     For
3e60: 20 65 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74   each rowid on t
3e70: 68 65 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f  he page correspo
3e80: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
3e90: 72 65 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a  rent term, the.*
3ea0: 2a 20 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64  *     correspond
3eb0: 69 6e 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74  ing aRowidOffset
3ec0: 5b 5d 20 65 6e 74 72 79 20 69 73 20 73 65 74 20  [] entry is set 
3ed0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
3ee0: 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  et of the.**    
3ef0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 22 70   start of the "p
3f00: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a  osition-list-siz
3f10: 65 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20  e" field within 
3f20: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
3f30: 69 54 65 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20  iTermIdx:.**    
3f40: 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
3f50: 74 20 74 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c  t term on iTermL
3f60: 65 61 66 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75  eafPgno..*/.stru
3f70: 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20 7b  ct Fts5SegIter {
3f80: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3f90: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
3fa0: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f     /* Segment to
3fb0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3ff0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
4000: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  lags */.  int iL
4010: 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20  eafPgno;        
4020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4030: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
4040: 75 6d 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44  umber */.  Fts5D
4050: 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
4060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4070: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
4080: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
4090: 4e 65 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20  NextLeaf;       
40a0: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67       /* Leaf pag
40b0: 65 20 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20  e (iLeafPgno+1) 
40c0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66  */.  int iLeafOf
40d0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
40e0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
40f0: 73 65 74 20 77 69 74 68 69 6e 20 63 75 72 72 65  set within curre
4100: 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a  nt leaf */..  /*
4110: 20 4e 65 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a   Next method */.
4120: 20 20 76 6f 69 64 20 28 2a 78 4e 65 78 74 29 28    void (*xNext)(
4130: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
4140: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
4150: 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ..  /* The page 
4160: 61 6e 64 20 6f 66 66 73 65 74 20 66 72 6f 6d 20  and offset from 
4170: 77 68 69 63 68 20 74 68 65 20 63 75 72 72 65 6e  which the curren
4180: 74 20 74 65 72 6d 20 77 61 73 20 72 65 61 64 2e  t term was read.
4190: 20 54 68 65 20 6f 66 66 73 65 74 20 0a 20 20 2a   The offset .  *
41a0: 2a 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20  * is the offset 
41b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
41c0: 69 64 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  id in the curren
41d0: 74 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20  t doclist.  */. 
41e0: 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66 50 67   int iTermLeafPg
41f0: 6e 6f 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c  no;.  int iTermL
4200: 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e  eafOffset;..  in
4210: 74 20 69 50 67 69 64 78 4f 66 66 3b 20 20 20 20  t iPgidxOff;    
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4230: 20 4e 65 78 74 20 6f 66 66 73 65 74 20 69 6e 20   Next offset in 
4240: 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69  pgidx */.  int i
4250: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20  EndofDoclist;.. 
4260: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
4270: 67 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20  g are only used 
4280: 69 66 20 74 68 65 20 46 54 53 35 5f 53 45 47 49  if the FTS5_SEGI
4290: 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67  TER_REVERSE flag
42a0: 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e   is set. */.  in
42b0: 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 20  t iRowidOffset; 
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42d0: 20 43 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69   Current entry i
42e0: 6e 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  n aRowidOffset[]
42f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64   */.  int nRowid
4300: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4310: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
4320: 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 77 69  ed size of aRowi
4330: 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20  dOffset[] array 
4340: 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69 64  */.  int *aRowid
4350: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4360: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
4370: 20 6f 66 66 73 65 74 20 74 6f 20 72 6f 77 69 64   offset to rowid
4380: 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74   fields */..  Ft
4390: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
43a0: 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
43b0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
43c0: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
43d0: 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20  .  /* Variables 
43e0: 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20  populated based 
43f0: 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  on current entry
4400: 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  . */.  Fts5Buffe
4410: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
4420: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4430: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20  t term */.  i64 
4440: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
4450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4460: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
4470: 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20    int nPos;     
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
44a0: 79 74 65 73 20 69 6e 20 63 75 72 72 65 6e 74 20  ytes in current 
44b0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
44c0: 0a 20 20 75 38 20 62 44 65 6c 3b 20 20 20 20 20  .  u8 bDel;     
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
44f0: 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73  e delete flag is
4500: 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   set */.};../*.*
4510: 2a 20 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20  * Argument is a 
4520: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74  pointer to an Ft
4530: 73 35 44 61 74 61 20 73 74 72 75 63 74 75 72 65  s5Data structure
4540: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
4550: 20 0a 2a 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a   .** leaf page..
4560: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 53 53 45 52  */.#define ASSER
4570: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61  T_SZLEAF_OK(x) a
4580: 73 73 65 72 74 28 20 5c 0a 20 20 20 20 28 78 29  ssert( \.    (x)
4590: 2d 3e 73 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e  ->szLeaf==(x)->n
45a0: 6e 20 7c 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66  n || (x)->szLeaf
45b0: 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26 28 78  ==fts5GetU16(&(x
45c0: 29 2d 3e 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64  )->p[2]) \.)..#d
45d0: 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54  efine FTS5_SEGIT
45e0: 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a  ER_ONETERM 0x01.
45f0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47  #define FTS5_SEG
4600: 49 54 45 52 5f 52 45 56 45 52 53 45 20 30 78 30  ITER_REVERSE 0x0
4610: 32 0a 0a 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65  2../* .** Argume
4620: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
4630: 74 6f 20 61 6e 20 46 74 73 35 44 61 74 61 20 73  to an Fts5Data s
4640: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
4650: 6e 74 61 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a  ntains a leaf.**
4660: 20 70 61 67 65 2e 20 54 68 69 73 20 6d 61 63 72   page. This macr
4670: 6f 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  o evaluates to t
4680: 72 75 65 20 69 66 20 74 68 65 20 6c 65 61 66 20  rue if the leaf 
4690: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d  contains no term
46a0: 73 2c 20 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69  s, or.** false i
46b0: 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74  f it contains at
46c0: 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
46d0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .*/.#define fts5
46e0: 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 78  LeafIsTermless(x
46f0: 29 20 28 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e  ) ((x)->szLeaf >
4700: 3d 20 28 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66  = (x)->nn)..#def
4710: 69 6e 65 20 66 74 73 35 4c 65 61 66 54 65 72 6d  ine fts5LeafTerm
4720: 4f 66 66 28 78 2c 20 69 29 20 28 66 74 73 35 47  Off(x, i) (fts5G
4730: 65 74 55 31 36 28 26 28 78 29 2d 3e 70 5b 28 78  etU16(&(x)->p[(x
4740: 29 2d 3e 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a  )->szLeaf + (i)*
4750: 32 5d 29 29 0a 0a 23 64 65 66 69 6e 65 20 66 74  2]))..#define ft
4760: 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
4770: 4f 66 66 28 78 29 20 28 66 74 73 35 47 65 74 55  Off(x) (fts5GetU
4780: 31 36 28 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a  16((x)->p))../*.
4790: 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74  ** Object for it
47a0: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
47b0: 74 68 65 20 6d 65 72 67 65 64 20 72 65 73 75 6c  the merged resul
47c0: 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ts of one or mor
47d0: 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76  e segments,.** v
47e0: 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65 72  isiting each ter
47f0: 6d 2f 72 6f 77 69 64 20 70 61 69 72 20 69 6e 20  m/rowid pair in 
4800: 74 68 65 20 6d 65 72 67 65 64 20 64 61 74 61 2e  the merged data.
4810: 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61  .**.** nSeg is a
4820: 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20 6f 66  lways a power of
4830: 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
4840: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
4850: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73  e number of.** s
4860: 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74 68 69  egments that thi
4870: 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65 72 67  s object is merg
4880: 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e 20 42  ing data from. B
4890: 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d 20 61  oth the aSeg[] a
48a0: 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61  nd.** aFirst[] a
48b0: 72 72 61 79 73 20 61 72 65 20 73 69 7a 65 64 20  rrays are sized 
48c0: 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65 73 2e  at nSeg entries.
48d0: 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72 72 61   The aSeg[] arra
48e0: 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a 20 77  y is padded.** w
48f0: 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63  ith zeroed objec
4900: 74 73 20 2d 20 74 68 65 73 65 20 61 72 65 20 68  ts - these are h
4910: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74 68 65  andled as if the
4920: 79 20 77 65 72 65 20 69 74 65 72 61 74 6f 72 73  y were iterators
4930: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d   opened.** on em
4940: 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a  pty segments..**
4950: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
4960: 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 67  of comparing seg
4970: 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e  ments aSeg[N] an
4980: 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65  d aSeg[N+1], whe
4990: 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76  re N is an.** ev
49a0: 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20 73 74  en number, is st
49b0: 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74 5b 28  ored in aFirst[(
49c0: 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20  nSeg+N)/2]. The 
49d0: 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68 65 20  "result" of the 
49e0: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  .** comparison i
49f0: 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 69  n this context i
4a00: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
4a10: 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  he iterator that
4a20: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
4a30: 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61 6c  ints to the smal
4a40: 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64 20 63  ler term/rowid c
4a50: 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72  ombination. Iter
4a60: 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61 72 65  ators at EOF are
4a70: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74  .** considered t
4a80: 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  o be greater tha
4a90: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74 65 72  n all other iter
4aa0: 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69  ators..**.** aFi
4ab0: 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20  rst[1] contains 
4ac0: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61 53 65  the index in aSe
4ad0: 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65 72 61  g[] of the itera
4ae0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
4af0: 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65  to.** the smalle
4b00: 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20  st key overall. 
4b10: 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75 6e 75  aFirst[0] is unu
4b20: 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c  sed. .**.** posl
4b30: 69 73 74 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62  ist:.**   Used b
4b40: 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  y sqlite3Fts5Ite
4b50: 72 50 6f 73 6c 69 73 74 28 29 20 77 68 65 6e 20  rPoslist() when 
4b60: 74 68 65 20 70 6f 73 6c 69 73 74 20 6e 65 65 64  the poslist need
4b70: 73 20 74 6f 20 62 65 20 62 75 66 66 65 72 65 64  s to be buffered
4b80: 2e 0a 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20  ..**   There is 
4b90: 6e 6f 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 69  no way to tell i
4ba0: 66 20 74 68 69 73 20 69 73 20 70 6f 70 75 6c 61  f this is popula
4bb0: 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73  ted or not..*/.s
4bc0: 74 72 75 63 74 20 46 74 73 35 49 74 65 72 20 7b  truct Fts5Iter {
4bd0: 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
4be0: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
4bf0: 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
4c00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70   containing outp
4c10: 75 74 20 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74  ut vars */..  Ft
4c20: 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b  s5Index *pIndex;
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4c40: 20 49 6e 64 65 78 20 74 68 61 74 20 6f 77 6e 73   Index that owns
4c50: 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a   this iterator *
4c60: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
4c70: 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20  e *pStruct;     
4c80: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4c90: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
4ca0: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4cb0: 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
4cc0: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
4cd0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
4ce0: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
4cf0: 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 43  slist */.  Fts5C
4d00: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
4d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4d20: 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
4d30: 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
4d40: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64  */..  /* Invoked
4d50: 20 74 6f 20 73 65 74 20 6f 75 74 70 75 74 20 76   to set output v
4d60: 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76  ariables. */.  v
4d70: 6f 69 64 20 28 2a 78 53 65 74 4f 75 74 70 75 74  oid (*xSetOutput
4d80: 73 29 28 46 74 73 35 49 74 65 72 2a 2c 20 46 74  s)(Fts5Iter*, Ft
4d90: 73 35 53 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20  s5SegIter*);..  
4da0: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4dd0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4de0: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e00: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4e10: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4e20: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4e30: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4e40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4e50: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4e60: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20  tries */..  i64 
4e70: 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20  iSwitchRowid;   
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4e90: 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66  irstest rowid of
4ea0: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72   other than aFir
4eb0: 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43  st[1] */.  Fts5C
4ec0: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
4ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4ee0: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
4ef0: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
4f00: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61  .  Fts5SegIter a
4f10: 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Seg[1];         
4f20: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
4f30: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4f40: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
4f50: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4f60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
4f70: 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72   is used to iter
4f80: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4f90: 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61  contents.** of a
4fa0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
4fb0: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61  ecord..**.** pDa
4fc0: 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20  ta:.**   Record 
4fd0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
4fe0: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74  oclist-index dat
4ff0: 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a  a..**.** bEof:.*
5000: 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20  *   Set to true 
5010: 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61  once iterator ha
5020: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a  s reached EOF..*
5030: 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20  *.** iOff:.**   
5040: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  Set to the curre
5050: 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
5060: 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a   record pData..*
5070: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  /.struct Fts5Dli
5080: 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61  dxLvl {.  Fts5Da
5090: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
50a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
50b0: 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65  for current page
50c0: 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a   of this level *
50d0: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  /.  int iOff;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
5100: 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a  set into pData *
5110: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
5140: 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ady */.  int iFi
5150: 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  rstOff;         
5160: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
5170: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
5180: 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ors */..  /* Out
5190: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
51a0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
51b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
51c0: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
51d0: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
51e0: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
51f0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5200: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5210: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5220: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73  LeafPgno */.};.s
5230: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
5240: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c  ter {.  int nLvl
5250: 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
5260: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61    Fts5DlidxLvl a
5270: 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74  Lvl[1];.};..stat
5280: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
5290: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
52a0: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
52b0: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
52c0: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
52d0: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
52e0: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
52f0: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5300: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5310: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5320: 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a  In[1];.} ../*.**
5330: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
5340: 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74  turn a buffer at
5350: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
5360: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
5370: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
5380: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
5390: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
53a0: 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  d set the error 
53b0: 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  code in.** the F
53c0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20  ts5Index handle 
53d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
53e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
53f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
5400: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35  s5IdxMalloc(Fts5
5410: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42  Index *p, int nB
5420: 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  yte){.  return s
5430: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
5440: 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79  Zero(&p->rc, nBy
5450: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  te);.}../*.** Co
5460: 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
5470: 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20  ts of the pLeft 
5480: 62 75 66 66 65 72 20 77 69 74 68 20 74 68 65 20  buffer with the 
5490: 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c  pRight/nRight bl
54a0: 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ob..**.** Return
54b0: 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73   -ve if pLeft is
54c0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52   smaller than pR
54d0: 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20  ight, 0 if they 
54e0: 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20  are equal or.** 
54f0: 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73  +ve if pRight is
5500: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c   smaller than pL
5510: 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  eft. In other wo
5520: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  rds:.**.**     r
5530: 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70  es = *pLeft - *p
5540: 52 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20  Right.*/.#ifdef 
5550: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
5560: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
5570: 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20  erCompareBlob(. 
5580: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65   Fts5Buffer *pLe
5590: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
55a0: 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69   /* Left hand si
55b0: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
55c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
55d0: 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67  pRight, int nRig
55e0: 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68  ht    /* Right h
55f0: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
5600: 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  arison */.){.  i
5610: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c  nt nCmp = MIN(pL
5620: 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b  eft->n, nRight);
5630: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
5640: 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52  cmp(pLeft->p, pR
5650: 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  ight, nCmp);.  r
5660: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
5670: 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67  (pLeft->n - nRig
5680: 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65  ht) : res);.}.#e
5690: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ndif../*.** Comp
56a0: 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
56b0: 20 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66 66   of the two buff
56c0: 65 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  ers using memcmp
56d0: 28 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66 65  (). If one buffe
56e0: 72 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78  r.** is a prefix
56f0: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 69   of the other, i
5700: 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  t is considered 
5710: 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a  the lesser..**.*
5720: 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20  * Return -ve if 
5730: 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72  pLeft is smaller
5740: 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20   than pRight, 0 
5750: 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61  if they are equa
5760: 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70  l or.** +ve if p
5770: 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72  Right is smaller
5780: 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20   than pLeft. In 
5790: 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a  other words:.**.
57a0: 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c  **     res = *pL
57b0: 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f  eft - *pRight.*/
57c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
57d0: 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46 74  BufferCompare(Ft
57e0: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
57f0: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 52 69   Fts5Buffer *pRi
5800: 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70  ght){.  int nCmp
5810: 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c   = MIN(pLeft->n,
5820: 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69   pRight->n);.  i
5830: 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
5840: 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74  pLeft->p, pRight
5850: 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ->p, nCmp);.  re
5860: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
5870: 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68  pLeft->n - pRigh
5880: 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a  t->n) : res);.}.
5890: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
58a0: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
58b0: 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66  (Fts5Data *pLeaf
58c0: 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
58d0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
58e0: 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d  &pLeaf->p[pLeaf-
58f0: 3e 73 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a  >szLeaf], ret);.
5900: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
5910: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
5920: 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20   read-only blob 
5930: 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73  handle, if it is
5940: 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   open..*/.static
5950: 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52   void fts5CloseR
5960: 65 61 64 65 72 28 46 74 73 35 49 6e 64 65 78 20  eader(Fts5Index 
5970: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52  *p){.  if( p->pR
5980: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  eader ){.    sql
5990: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64  ite3_blob *pRead
59a0: 65 72 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b  er = p->pReader;
59b0: 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20  .    p->pReader 
59c0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
59d0: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61  _blob_close(pRea
59e0: 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  der);.  }.}.../*
59f0: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72  .** Retrieve a r
5a00: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25  ecord from the %
5a10: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
5a20: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
5a30: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
5a40: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
5a50: 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65  rror left in the
5a60: 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f   .** Fts5Index o
5a70: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
5a80: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
5a90: 61 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65  ataRead(Fts5Inde
5aa0: 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
5ab0: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
5ac0: 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Ret = 0;.  if( p
5ad0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
5ae0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
5af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20  SQLITE_OK;..    
5b00: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29  if( p->pReader )
5b10: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
5b20: 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72 6e 20  call may return 
5b30: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69 66 20  SQLITE_ABORT if 
5b40: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 61  there has been a
5b50: 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 20   savepoint.     
5b60: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e   ** rollback sin
5b70: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 75  ce it was last u
5b80: 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  sed. In this cas
5b90: 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e  e a new blob han
5ba0: 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  dle.      ** is 
5bb0: 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
5bc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5bd0: 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65   *pBlob = p->pRe
5be0: 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  ader;.      p->p
5bf0: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Reader = 0;.    
5c00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5c10: 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62  lob_reopen(pBlob
5c20: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
5c30: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
5c40: 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  der==0 );.      
5c50: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70 42 6c  p->pReader = pBl
5c60: 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ob;.      if( rc
5c70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5c80: 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65         fts5Close
5c90: 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 20  Reader(p);.     
5ca0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
5cb0: 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 29 20  =SQLITE_ABORT ) 
5cc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
5ce0: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
5cf0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20   is not open at 
5d00: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e  this point, open
5d10: 20 69 74 20 61 6e 64 20 73 65 65 6b 20 0a 20 20   it and seek .  
5d20: 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 65 71 75    ** to the requ
5d30: 65 73 74 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f  ested entry.  */
5d40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61  .    if( p->pRea
5d50: 64 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  der==0 && rc==SQ
5d60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5d70: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
5d80: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
5d90: 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  g;.      rc = sq
5da0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
5db0: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20  pConfig->db, .  
5dc0: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
5dd0: 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
5de0: 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77  l, "block", iRow
5df0: 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61 64  id, 0, &p->pRead
5e00: 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  er.      );.    
5e10: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 69 74  }..    /* If eit
5e20: 68 65 72 20 6f 66 20 74 68 65 20 73 71 6c 69 74  her of the sqlit
5e30: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f  e3_blob_open() o
5e40: 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  r sqlite3_blob_r
5e50: 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20  eopen() calls.  
5e60: 20 20 2a 2a 20 61 62 6f 76 65 20 72 65 74 75 72    ** above retur
5e70: 6e 65 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ned SQLITE_ERROR
5e80: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
5e90: 43 4f 52 52 55 50 54 5f 56 54 41 42 20 69 6e 73  CORRUPT_VTAB ins
5ea0: 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c  tead..    ** All
5eb0: 20 74 68 65 20 72 65 61 73 6f 6e 73 20 74 68 6f   the reasons tho
5ec0: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67  se functions mig
5ed0: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
5ee0: 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67  _ERROR - missing
5ef0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d  .    ** table, m
5f00: 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d  issing row, non-
5f10: 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f  blob/text in blo
5f20: 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69  ck column - indi
5f30: 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 62 61 63  cate .    ** bac
5f40: 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f 72 72 75  king store corru
5f50: 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69  ption.  */.    i
5f60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  f( rc==SQLITE_ER
5f70: 52 4f 52 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ROR ) rc = FTS5_
5f80: 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 69 66  CORRUPT;..    if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f 75  ){.      u8 *aOu
5fb0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
5fc0: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f       /* Read blo
5fd0: 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  b data into this
5fe0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 20   buffer */.     
5ff0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
6000: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
6010: 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20  p->pReader);.   
6020: 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
6030: 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
6040: 20 2b 20 6e 42 79 74 65 20 2b 20 46 54 53 35 5f   + nByte + FTS5_
6050: 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20  DATA_PADDING;.  
6060: 20 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35      pRet = (Fts5
6070: 44 61 74 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Data*)sqlite3_ma
6080: 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20  lloc(nAlloc);.  
6090: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
60a0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 6e          pRet->nn
60b0: 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   = nByte;.      
60c0: 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70    aOut = pRet->p
60d0: 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31 5d   = (u8*)&pRet[1]
60e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
60f0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6100: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
6110: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
6120: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6130: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6140: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e  e3_blob_read(p->
6150: 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e  pReader, aOut, n
6160: 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Byte, 0);.      
6170: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
6180: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6190: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
61a0: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(pRet);.       
61b0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
61c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
61d0: 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78 20 74 68  /* TODO1: Fix th
61e0: 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 52  is */.        pR
61f0: 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20 66 74 73  et->szLeaf = fts
6200: 35 47 65 74 55 31 36 28 26 70 52 65 74 2d 3e 70  5GetU16(&pRet->p
6210: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [2]);.      }.  
6220: 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20    }.    p->rc = 
6230: 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64  rc;.    p->nRead
6240: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ++;.  }..  asser
6250: 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70  t( (pRet==0)==(p
6260: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc!=SQLITE_OK)
6270: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65   );.  return pRe
6280: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  t;.}../*.** Rele
6290: 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
62a0: 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64 20 72  to data record r
62b0: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
62c0: 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a  rlier call to.**
62d0: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 29 2e   fts5DataRead().
62e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
62f0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
6300: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29  Fts5Data *pData)
6310: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
6320: 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61 74  (pData);.}..stat
6330: 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
6340: 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20 46  PrepareStmt(.  F
6350: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 73  ts5Index *p,.  s
6360: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
6370: 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt,.  char *zS
6380: 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ql.){.  if( p->r
6390: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
63a0: 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a      if( zSql ){.
63b0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
63c0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
63d0: 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  (p->pConfig->db,
63e0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
63f0: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
6400: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6410: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6420: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
6430: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
6440: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
6450: 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f  ../*.** INSERT O
6460: 52 20 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f  R REPLACE a reco
6470: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61  rd into the %_da
6480: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ta table..*/.sta
6490: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
64a0: 61 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  aWrite(Fts5Index
64b0: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
64c0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
64d0: 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
64e0: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
64f0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
6500: 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72    if( p->pWriter
6510: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
6520: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
6530: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
6540: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
6550: 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72  eStmt(p, &p->pWr
6560: 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  iter, sqlite3_mp
6570: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
6580: 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27   "REPLACE INTO '
6590: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64  %q'.'%q_data'(id
65a0: 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28  , block) VALUES(
65b0: 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20  ?,?)", .        
65c0: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
65d0: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
65e0: 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70     ));.    if( p
65f0: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
6600: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   }..  sqlite3_bi
6610: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69  nd_int64(p->pWri
6620: 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b  ter, 1, iRowid);
6630: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
6640: 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c  blob(p->pWriter,
6650: 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61   2, pData, nData
6660: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
6670: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
6680: 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
6690: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
66a0: 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72  reset(p->pWriter
66b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
66c0: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ute the followin
66d0: 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  g SQL:.**.**    
66e0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64   DELETE FROM %_d
66f0: 61 74 61 20 57 48 45 52 45 20 69 64 20 42 45 54  ata WHERE id BET
6700: 57 45 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44  WEEN $iFirst AND
6710: 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69   $iLast.*/.stati
6720: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 44  c void fts5DataD
6730: 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65 78 20  elete(Fts5Index 
6740: 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20  *p, i64 iFirst, 
6750: 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66  i64 iLast){.  if
6760: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
6770: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
6780: 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d  if( p->pDeleter=
6790: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
67a0: 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  ;.    Fts5Config
67b0: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
67c0: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72  Config;.    char
67d0: 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
67e0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
67f0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27    "DELETE FROM '
6800: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48  %q'.'%q_data' WH
6810: 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64  ERE id>=? AND id
6820: 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20  <=?", .         
6830: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
6840: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
6850: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71    );.    if( zSq
6860: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
6870: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6880: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6890: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
68a0: 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69  repare_v2(pConfi
68b0: 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  g->db, zSql, -1,
68c0: 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30   &p->pDeleter, 0
68d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
68e0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
68f0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
6900: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6910: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
6920: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6930: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
6940: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
6950: 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72  Deleter, 1, iFir
6960: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  st);.  sqlite3_b
6970: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6980: 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29  leter, 2, iLast)
6990: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
69a0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
69b0: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
69c0: 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74  _reset(p->pDelet
69d0: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
69e0: 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  move all records
69f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6a00: 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e   segment iSegid.
6a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6a20: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
6a30: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
6a40: 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  *p, int iSegid){
6a50: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
6a60: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6a70: 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20  ID(iSegid, 0);. 
6a80: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
6a90: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
6aa0: 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a  iSegid+1, 0)-1;.
6ab0: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
6ac0: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
6ad0: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  t);.  if( p->pId
6ae0: 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  xDeleter==0 ){. 
6af0: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6b00: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6b10: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6b20: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6b30: 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72   &p->pIdxDeleter
6b40: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6b50: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44 45  f(.          "DE
6b60: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
6b70: 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
6b80: 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20  gid=?",.        
6b90: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6ba0: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6bb0: 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
6bc0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6bd0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6be0: 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
6bf0: 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65  xDeleter, 1, iSe
6c00: 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
6c10: 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65  3_step(p->pIdxDe
6c20: 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  leter);.    p->r
6c30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6c40: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6c50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6c60: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6c70: 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74  nce to an Fts5St
6c80: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72  ructure object r
6c90: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6ca0: 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74  rlier .** call t
6cb0: 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  o fts5StructureR
6cc0: 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72  ead() or fts5Str
6cd0: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a  uctureDecode()..
6ce0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6cf0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
6d00: 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ase(Fts5Structur
6d10: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
6d20: 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30 3e  f( pStruct && 0>
6d30: 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65  =(--pStruct->nRe
6d40: 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  f) ){.    int i;
6d50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
6d60: 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ruct->nRef==0 );
6d70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6d80: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
6d90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6da0: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
6db0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
6dc0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
6dd0: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6de0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ct);.  }.}..stat
6df0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6e00: 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74 72  ctureRef(Fts5Str
6e10: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
6e20: 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  {.  pStruct->nRe
6e30: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  f++;.}../*.** De
6e40: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
6e50: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
6e60: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
6e70: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
6e80: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
6e90: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
6ea0: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
6eb0: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
6ec0: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
6ed0: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
6ee0: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
6ef0: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
6f00: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
6f10: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
6f20: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
6f30: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
6f40: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
6f50: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
6f60: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6f70: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
6f80: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
6f90: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
6fa0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
6fb0: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
6fc0: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
6fd0: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
6fe0: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
6ff0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7000: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7010: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7020: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
7030: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7040: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
7050: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
7060: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
7070: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
70a0: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
70b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
70c0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
70d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
70e0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
70f0: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
7100: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
7110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7120: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
7130: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
7140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
7150: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
7160: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
7170: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
7180: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
7190: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  ;.  int nByte;  
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71b0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
71c0: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
71d0: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
71e0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
71f0: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
7200: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
7210: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7220: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
7230: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
7240: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
7250: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
7260: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
7270: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
7280: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
7290: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
72a0: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
72b0: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
72c0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
72d0: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
72e0: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
72f0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7300: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
7310: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7320: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
7330: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74  Segment);.  nByt
7340: 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65  e = (.      size
7350: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7360: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
7370: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
7380: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7390: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
73a0: 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28  uctureLevel) * (
73b0: 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20  nLevel-1)    /* 
73c0: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
73d0: 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20  /.  );.  pRet = 
73e0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
73f0: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
7400: 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65  cZero(&rc, nByte
7410: 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29  );..  if( pRet )
7420: 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66  {.    pRet->nRef
7430: 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e   = 1;.    pRet->
7440: 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b  nLevel = nLevel;
7450: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d  .    pRet->nSegm
7460: 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a  ent = nSegment;.
7470: 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
7480: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
7490: 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e  Data[i], &pRet->
74a0: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
74b0: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
74c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
74d0: 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69  & iLvl<nLevel; i
74e0: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
74f0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7500: 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e   *pLvl = &pRet->
7510: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
7520: 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d      int nTotal =
7530: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53   0;.      int iS
7540: 65 67 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  eg;..      if( i
7550: 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  >=nData ){.     
7560: 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52     rc = FTS5_COR
7570: 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
7580: 65 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  e{.        i += 
7590: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
75a0: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
75b0: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
75c0: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
75d0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
75e0: 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20  , nTotal);.     
75f0: 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61     assert( nTota
7600: 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  l>=pLvl->nMerge 
7610: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
7620: 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 74 72  >aSeg = (Fts5Str
7630: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73  uctureSegment*)s
7640: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
7650: 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20  Zero(&rc, .     
7660: 20 20 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20         nTotal * 
7670: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7680: 74 75 72 65 53 65 67 6d 65 6e 74 29 0a 20 20 20  tureSegment).   
7690: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
76a0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
76b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
76c0: 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d      pLvl->nSeg =
76d0: 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20   nTotal;.       
76e0: 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
76f0: 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b  g<nTotal; iSeg++
7700: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
7710: 20 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20   i>=nData ){.   
7720: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54           rc = FT
7730: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
7740: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7750: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7760: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
7770: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
7780: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  [i], pLvl->aSeg[
7790: 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20  iSeg].iSegid);. 
77a0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
77b0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
77c0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
77d0: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69  Seg[iSeg].pgnoFi
77e0: 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rst);.          
77f0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7800: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7810: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
7820: 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20  .pgnoLast);.    
7830: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7840: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
7850: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7860: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
7870: 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20  Release(pRet);. 
7880: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
7890: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f     }.  }..  *ppO
78a0: 75 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74  ut = pRet;.  ret
78b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
78c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
78d0: 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
78e0: 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20  Level(int *pRc, 
78f0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
7900: 70 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  ppStruct){.  if(
7910: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
7920: 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
7930: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
7940: 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20   *ppStruct;.    
7950: 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74  int nLevel = pSt
7960: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20  ruct->nLevel;.  
7970: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a    int nByte = (.
7980: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46          sizeof(F
7990: 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b 20  ts5Structure) + 
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79b0: 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75   /* Main structu
79c0: 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 69  re */.        si
79d0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
79e0: 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76  reLevel) * (nLev
79f0: 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c  el+1)  /* aLevel
7a00: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
7a10: 29 3b 0a 0a 20 20 20 20 70 53 74 72 75 63 74 20  );..    pStruct 
7a20: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
7a30: 63 28 70 53 74 72 75 63 74 2c 20 6e 42 79 74 65  c(pStruct, nByte
7a40: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  );.    if( pStru
7a50: 63 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  ct ){.      mems
7a60: 65 74 28 26 70 53 74 72 75 63 74 2d 3e 61 4c 65  et(&pStruct->aLe
7a70: 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20  vel[nLevel], 0, 
7a80: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7a90: 74 75 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20  tureLevel));.   
7aa0: 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76     pStruct->nLev
7ab0: 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53  el++;.      *ppS
7ac0: 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b  truct = pStruct;
7ad0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7ae0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
7af0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
7b00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64  .}../*.** Extend
7b10: 20 6c 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74   level iLvl so t
7b20: 68 61 74 20 74 68 65 72 65 20 69 73 20 72 6f 6f  hat there is roo
7b30: 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e  m for at least n
7b40: 45 78 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65  Extra more.** se
7b50: 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  gments..*/.stati
7b60: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
7b70: 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
7b80: 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
7b90: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7ba0: 53 74 72 75 63 74 2c 20 0a 20 20 69 6e 74 20 69  Struct, .  int i
7bb0: 4c 76 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74  Lvl, .  int nExt
7bc0: 72 61 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73 65  ra, .  int bInse
7bd0: 72 74 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  rt.){.  if( *pRc
7be0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7bf0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
7c00: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
7c10: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
7c20: 4c 76 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53 74  Lvl];.    Fts5St
7c30: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
7c40: 61 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42  aNew;.    int nB
7c50: 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20  yte;..    nByte 
7c60: 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20  = (pLvl->nSeg + 
7c70: 6e 45 78 74 72 61 29 20 2a 20 73 69 7a 65 6f 66  nExtra) * sizeof
7c80: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7c90: 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77  gment);.    aNew
7ca0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
7cb0: 6f 63 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e  oc(pLvl->aSeg, n
7cc0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61  Byte);.    if( a
7cd0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  New ){.      if(
7ce0: 20 62 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20   bInsert==0 ){. 
7cf0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61         memset(&a
7d00: 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c  New[pLvl->nSeg],
7d10: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
7d20: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
7d30: 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20   * nExtra);.    
7d40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7d50: 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76   int nMove = pLv
7d60: 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66  l->nSeg * sizeof
7d70: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7d80: 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  gment);.        
7d90: 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45  memmove(&aNew[nE
7da0: 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f  xtra], aNew, nMo
7db0: 76 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ve);.        mem
7dc0: 73 65 74 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a  set(aNew, 0, siz
7dd0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
7de0: 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74  eSegment) * nExt
7df0: 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra);.      }.   
7e00: 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
7e10: 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  aNew;.    }else{
7e20: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
7e30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7e40: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
7e50: 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65  ead, deserialize
7e60: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
7e70: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
7e80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
7e90: 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c  Structure.aLevel
7ea0: 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35  [] and each Fts5
7eb0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61  StructureLevel.a
7ec0: 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  Seg[] array.** a
7ed0: 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65  re over-allocate
7ee0: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66  d as described f
7ef0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  or function fts5
7f00: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7f10: 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a  ) .** above..**.
7f20: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
7f30: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
7f40: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
7f50: 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69  rror code left i
7f60: 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64  n the.** Fts5Ind
7f70: 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e  ex handle. If an
7f80: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
7f90: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
7fa0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
7fb0: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  * is called, it 
7fc0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
7fd0: 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74  tatic Fts5Struct
7fe0: 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75  ure *fts5Structu
7ff0: 72 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  reRead(Fts5Index
8000: 20 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66   *p){.  Fts5Conf
8010: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
8020: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35  >pConfig;.  Fts5
8030: 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74 20  Structure *pRet 
8040: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  = 0;        /* O
8050: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
8060: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  */.  int iCookie
8070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8080: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
8090: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
80a0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
80b0: 61 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 66 74  a;..  pData = ft
80c0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
80d0: 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57  S5_STRUCTURE_ROW
80e0: 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ID);.  if( p->rc
80f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2f   ) return 0;.  /
8100: 2a 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65  * TODO: Do we ne
8110: 65 64 20 74 68 69 73 20 69 66 20 74 68 65 20 6c  ed this if the l
8120: 65 61 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70  eaf-index is app
8130: 65 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e  ended? Probably.
8140: 2e 2e 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .. */.  memset(&
8150: 70 44 61 74 61 2d 3e 70 5b 70 44 61 74 61 2d 3e  pData->p[pData->
8160: 6e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41 54  nn], 0, FTS5_DAT
8170: 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 70 2d  A_PADDING);.  p-
8180: 3e 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74  >rc = fts5Struct
8190: 75 72 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d  ureDecode(pData-
81a0: 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 6e 2c 20 26  >p, pData->nn, &
81b0: 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b  iCookie, &pRet);
81c0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
81d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66  LITE_OK && pConf
81e0: 69 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f  ig->iCookie!=iCo
81f0: 6f 6b 69 65 20 29 7b 0a 20 20 20 20 70 2d 3e 72  okie ){.    p->r
8200: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43  c = sqlite3Fts5C
8210: 6f 6e 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69  onfigLoad(pConfi
8220: 67 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d  g, iCookie);.  }
8230: 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
8240: 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 69 66  ase(pData);.  if
8250: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
8260: 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74  OK ){.    fts5St
8270: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
8280: 52 65 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  Ret);.    pRet =
8290: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
82a0: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
82b0: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
82c0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
82d0: 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72  nts in index str
82e0: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
82f0: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
8300: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73   is only ever us
8310: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
8320: 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e  sert() condition
8330: 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
8340: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
8350: 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75   int fts5Structu
8360: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
8370: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8380: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e  Struct){.  int n
8390: 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20  Segment = 0;    
83a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
83b0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
83c0: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20  gments */.  if( 
83d0: 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69  pStruct ){.    i
83e0: 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8400: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
8410: 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
8420: 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  /.    for(iLvl=0
8430: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
8440: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
8450: 0a 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74 20  .      nSegment 
8460: 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  += pStruct->aLev
8470: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20  el[iLvl].nSeg;. 
8480: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
8490: 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23  rn nSegment;.}.#
84a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66  endif..#define f
84b0: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
84c0: 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 42  endBlob(pBuf, pB
84d0: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 20 20  lob, nBlob) {   
84e0: 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70    \.  assert( (p
84f0: 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 28  Buf)->nSpace>=((
8500: 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29 20  pBuf)->n+nBlob) 
8510: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  );             \
8520: 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42 75 66  .  memcpy(&(pBuf
8530: 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c  )->p[(pBuf)->n],
8540: 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20   pBlob, nBlob); 
8550: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
8560: 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42 6c  (pBuf)->n += nBl
8570: 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64           \.}..#d
85a0: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
85b0: 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
85c0: 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b 20 20  (pBuf, iVal) {  
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
85e0: 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 73    (pBuf)->n += s
85f0: 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
8600: 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70 5b 28  int(&(pBuf)->p[(
8610: 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56 61 6c  pBuf)->n], (iVal
8620: 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72 74 28  ));  \.  assert(
8630: 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e   (pBuf)->nSpace>
8640: 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20 20 20  =(pBuf)->n );   
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a         \.}.../*.
8670: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64  ** Serialize and
8680: 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75   store the "stru
8690: 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a  cture" record..*
86a0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
86b0: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
86c0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  n error code in 
86d0: 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62  the Fts5Index ob
86e0: 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65  ject. If an.** e
86f0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
8700: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
8710: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
8720: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
8730: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
8740: 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  eWrite(Fts5Index
8750: 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75   *p, Fts5Structu
8760: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
8770: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8780: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
8790: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
87b0: 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65  fer to serialize
87c0: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a   record into */.
87d0: 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
8800: 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
8810: 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  els */.    int i
8820: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
8830: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b           /* Cook
8840: 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72  ie value to stor
8850: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
8860: 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
8870: 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
8880: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
8890: 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
88a0: 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
88b0: 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
88c0: 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  r));..    /* App
88d0: 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  end the current 
88e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  configuration co
88f0: 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f  okie */.    iCoo
8900: 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  kie = p->pConfig
8910: 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69  ->iCookie;.    i
8920: 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69  f( iCookie<0 ) i
8930: 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a 20 20 20  Cookie = 0;..   
8940: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 46   if( 0==sqlite3F
8950: 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
8960: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 2b 39 2b  ->rc, &buf, 4+9+
8970: 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20 73 71  9+9) ){.      sq
8980: 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 62  lite3Fts5Put32(b
8990: 75 66 2e 70 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a  uf.p, iCookie);.
89a0: 20 20 20 20 20 20 62 75 66 2e 6e 20 3d 20 34 3b        buf.n = 4;
89b0: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
89c0: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
89d0: 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d  t(&buf, pStruct-
89e0: 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  >nLevel);.      
89f0: 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
8a00: 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c  pendVarint(&buf,
8a10: 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
8a20: 6e 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  nt);.      fts5B
8a30: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
8a40: 61 72 69 6e 74 28 26 62 75 66 2c 20 28 69 36 34  arint(&buf, (i64
8a50: 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65  )pStruct->nWrite
8a60: 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 7d 0a  Counter);.    }.
8a70: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
8a80: 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
8a90: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
8aa0: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 20        int iSeg; 
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
8ad0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
8ae0: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  egments */.     
8af0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
8b00: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
8b10: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
8b20: 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  l];.      fts5Bu
8b30: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8b40: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
8b50: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20  Lvl->nMerge);.  
8b60: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
8b70: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
8b80: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
8b90: 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Seg);.      asse
8ba0: 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
8bb0: 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
8bc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d  .      for(iSeg=
8bd0: 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53  0; iSeg<pLvl->nS
8be0: 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
8bf0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
8c00: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
8c10: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
8c20: 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69  aSeg[iSeg].iSegi
8c30: 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
8c40: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8c50: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8c60: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
8c70: 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20  ].pgnoFirst);.  
8c80: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
8c90: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
8ca0: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
8cb0: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
8cc0: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Last);.      }. 
8cd0: 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44 61     }..    fts5Da
8ce0: 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
8cf0: 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c  STRUCTURE_ROWID,
8d00: 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a   buf.p, buf.n);.
8d10: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
8d20: 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a  ee(&buf);.  }.}.
8d30: 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f  .#if 0.static vo
8d40: 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72 75  id fts5DebugStru
8d50: 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73 35 42  cture(int*,Fts5B
8d60: 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72 75 63  uffer*,Fts5Struc
8d70: 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63 20 76  ture*);.static v
8d80: 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53 74 72  oid fts5PrintStr
8d90: 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63 68 61  ucture(const cha
8da0: 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73  r *zCaption, Fts
8db0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8dc0: 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  uct){.  int rc =
8dd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74   SQLITE_OK;.  Ft
8de0: 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20  s5Buffer buf;.  
8df0: 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
8e00: 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20 20  sizeof(buf));.  
8e10: 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
8e20: 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20 70 53  re(&rc, &buf, pS
8e30: 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69 6e 74  truct);.  fprint
8e40: 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a 20 25  f(stdout, "%s: %
8e50: 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20  s\n", zCaption, 
8e60: 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68  buf.p);.  fflush
8e70: 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74 73 35  (stdout);.  fts5
8e80: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
8e90: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
8ea0: 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74 72 75  ne fts5PrintStru
8eb0: 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e 64 69  cture(x,y).#endi
8ec0: 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  f..static int ft
8ed0: 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 46 74  s5SegmentSize(Ft
8ee0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8ef0: 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72 65 74  nt *pSeg){.  ret
8f00: 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70 67  urn 1 + pSeg->pg
8f10: 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70  noLast - pSeg->p
8f20: 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a  gnoFirst;.}../*.
8f30: 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79  ** Return a copy
8f40: 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74   of index struct
8f50: 75 72 65 20 70 53 74 72 75 63 74 2e 20 45 78 63  ure pStruct. Exc
8f60: 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20  ept, promote as 
8f70: 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  many .** segment
8f80: 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  s as possible to
8f90: 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e   level iPromote.
8fa0: 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
8fb0: 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20 72  s, NULL is .** r
8fc0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
8fd0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
8fe0: 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a  cturePromoteTo(.
8ff0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
9000: 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a    int iPromote,.
9010: 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c    int szPromote,
9020: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
9030: 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20 69   *pStruct.){.  i
9040: 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46 74 73  nt il, is;.  Fts
9050: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9060: 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  *pOut = &pStruct
9070: 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f 74  ->aLevel[iPromot
9080: 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75 74 2d  e];..  if( pOut-
9090: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  >nMerge==0 ){.  
90a0: 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74    for(il=iPromot
90b0: 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d  e+1; il<pStruct-
90c0: 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a  >nLevel; il++){.
90d0: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
90e0: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
90f0: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
9100: 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  l[il];.      if(
9110: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20   pLvl->nMerge ) 
9120: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
9130: 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d  r(is=pLvl->nSeg-
9140: 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b  1; is>=0; is--){
9150: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
9160: 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a  = fts5SegmentSiz
9170: 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73  e(&pLvl->aSeg[is
9180: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
9190: 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72  sz>szPromote ) r
91a0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 66  eturn;.        f
91b0: 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
91c0: 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
91d0: 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d 6f 74  pStruct, iPromot
91e0: 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 1, 1);.      
91f0: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
9200: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 6d 65  turn;.        me
9210: 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c  mcpy(pOut->aSeg,
9220: 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d   &pLvl->aSeg[is]
9230: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
9240: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29 3b  uctureSegment));
9250: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e  .        pOut->n
9260: 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  Seg++;.        p
9270: 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20  Lvl->nSeg--;.   
9280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
9290: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20 73 65  ../*.** A new se
92a0: 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20 62  gment has just b
92b0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6c  een written to l
92c0: 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69 6e 64  evel iLvl of ind
92d0: 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ex structure.** 
92e0: 70 53 74 72 75 63 74 2e 20 54 68 69 73 20 66 75  pStruct. This fu
92f0: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
9300: 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65 6e 74  s if any segment
9310: 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 6d  s should be prom
9320: 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72 65 73  oted.** as a res
9330: 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20 61 72  ult. Segments ar
9340: 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20 74 77  e promoted in tw
9350: 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  o scenarios:.**.
9360: 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65 20 73  **   a) If the s
9370: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
9380: 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ten is smaller t
9390: 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  han one or more 
93a0: 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  segments.**     
93b0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 72 65 76   within the prev
93c0: 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64 20 6c  ious populated l
93d0: 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72 6f 6d  evel, it is prom
93e0: 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72 65 76  oted to the prev
93f0: 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70 6f 70  ious.**      pop
9400: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a  ulated level..**
9410: 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68 65 20  .**   b) If the 
9420: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
9430: 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72 20 74  tten is larger t
9440: 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74 20 73  han the newest s
9450: 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20  egment on.**    
9460: 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70 75 6c    the next popul
9470: 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68 65 6e  ated level, then
9480: 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c 20 61   that segment, a
9490: 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61 64 6a  nd any other adj
94a0: 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20 73 65  acent.**      se
94b0: 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  gments that are 
94c0: 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74 68 61  also smaller tha
94d0: 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74 20 77  n the one just w
94e0: 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a 2a 20  ritten, are .** 
94f0: 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e 20 0a       promoted. .
9500: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f 72 20  **.** If one or 
9510: 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 61 72  more segments ar
9520: 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68 65 20  e promoted, the 
9530: 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
9540: 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a 20 74   is updated.** t
9550: 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  o reflect this..
9560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
9570: 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
9580: 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ote(.  Fts5Index
9590: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
95a0: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
95b0: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
95c0: 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20  .  int iLvl,    
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65 76 65     /* Index leve
95f0: 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 2a  l just updated *
9600: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
9610: 65 20 2a 70 53 74 72 75 63 74 20 20 20 20 20 20  e *pStruct      
9620: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
9630: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ucture */.){.  i
9640: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
9650: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
9660: 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 50 72  Tst;.    int iPr
9670: 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20 20 20  omote = -1;.    
9680: 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20  int szPromote = 
9690: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
96a0: 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68 69 6e   Promote anythin
96b0: 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72 20 73  g this size or s
96c0: 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 46 74  maller */.    Ft
96d0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
96e0: 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 53  nt *pSeg;   /* S
96f0: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
9700: 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ten */.    int s
9710: 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  zSeg;           
9720: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9730: 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73 74   of segment just
9740: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
9750: 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72 75  int nSeg = pStru
9760: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
9770: 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66 28 20  .nSeg;..    if( 
9780: 6e 53 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSeg==0 ) return
9790: 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 53  ;.    pSeg = &pS
97a0: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
97b0: 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74  vl].aSeg[pStruct
97c0: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
97d0: 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65  Seg-1];.    szSe
97e0: 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70  g = (1 + pSeg->p
97f0: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
9800: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20  pgnoFirst);..   
9810: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
9820: 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20  ndition (a) */. 
9830: 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c     for(iTst=iLvl
9840: 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70  -1; iTst>=0 && p
9850: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9860: 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54  Tst].nSeg==0; iT
9870: 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20 69  st--);.    if( i
9880: 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tst>=0 ){.      
9890: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
98a0: 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20   szMax = 0;.    
98b0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
98c0: 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70 53  evel *pTst = &pS
98d0: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54  truct->aLevel[iT
98e0: 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st];.      asser
98f0: 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d  t( pTst->nMerge=
9900: 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
9910: 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65  i=0; i<pTst->nSe
9920: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
9930: 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e   int sz = pTst->
9940: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74  aSeg[i].pgnoLast
9950: 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   - pTst->aSeg[i]
9960: 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a  .pgnoFirst + 1;.
9970: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
9980: 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73  zMax ) szMax = s
9990: 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
99a0: 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65   if( szMax>=szSe
99b0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g ){.        /* 
99c0: 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  Condition (a) is
99d0: 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74   true. Promote t
99e0: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
99f0: 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20  t on level .    
9a00: 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c      ** iLvl to l
9a10: 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20  evel iTst.  */. 
9a20: 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20         iPromote 
9a30: 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20  = iTst;.        
9a40: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61  szPromote = szMa
9a50: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
9a60: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64  ..    /* If cond
9a70: 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74  ition (a) is not
9a80: 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62 29   met, assume (b)
9a90: 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63 74   is true. Struct
9aa0: 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20  urePromoteTo(). 
9ab0: 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70     ** is a no-op
9ac0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 20   if it is not.  
9ad0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d  */.    if( iProm
9ae0: 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ote<0 ){.      i
9af0: 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a  Promote = iLvl;.
9b00: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
9b10: 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20  = szSeg;.    }. 
9b20: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
9b30: 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72  PromoteTo(p, iPr
9b40: 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65  omote, szPromote
9b50: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
9b60: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  }.../*.** Advanc
9b70: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
9b80: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
9b90: 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 74  y argument. If t
9ba0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a  he end of the .*
9bb0: 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * doclist-index 
9bc0: 70 61 67 65 20 69 73 20 72 65 61 63 68 65 64 2c  page is reached,
9bd0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
9be0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9bf0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
9c00: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70  (Fts5DlidxLvl *p
9c10: 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74 61  Lvl){.  Fts5Data
9c20: 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e   *pData = pLvl->
9c30: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c  pData;..  if( pL
9c40: 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  vl->iOff==0 ){. 
9c50: 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
9c60: 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >bEof==0 );.    
9c70: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a  pLvl->iOff = 1;.
9c80: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b      pLvl->iOff +
9c90: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
9ca0: 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20  2(&pData->p[1], 
9cb0: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pLvl->iLeafPgno)
9cc0: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
9cd0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
9ce0: 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c  t(&pData->p[pLvl
9cf0: 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  ->iOff], (u64*)&
9d00: 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  pLvl->iRowid);. 
9d10: 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f     pLvl->iFirstO
9d20: 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b  ff = pLvl->iOff;
9d30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
9d40: 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28  t iOff;.    for(
9d50: 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b  iOff=pLvl->iOff;
9d60: 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b   iOff<pData->nn;
9d70: 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20   iOff++){.      
9d80: 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66  if( pData->p[iOf
9d90: 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20 20  f] ) break; .   
9da0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66   }..    if( iOff
9db0: 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20  <pData->nn ){.  
9dc0: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
9dd0: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
9de0: 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70  gno += (iOff - p
9df0: 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a  Lvl->iOff) + 1;.
9e00: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
9e10: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
9e20: 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  ta->p[iOff], (u6
9e30: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 20  4*)&iVal);.     
9e40: 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d   pLvl->iRowid +=
9e50: 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76   iVal;.      pLv
9e60: 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  l->iOff = iOff;.
9e70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9e80: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b   pLvl->bEof = 1;
9e90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
9ea0: 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b  turn pLvl->bEof;
9eb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
9ec0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
9ed0: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
9ee0: 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
9ef0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
9f00: 69 64 78 49 74 65 72 4e 65 78 74 52 28 46 74 73  idxIterNextR(Fts
9f10: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
9f20: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c  lidxIter *pIter,
9f30: 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74   int iLvl){.  Ft
9f40: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
9f50: 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   = &pIter->aLvl[
9f60: 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iLvl];..  assert
9f70: 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c  ( iLvl<pIter->nL
9f80: 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35  vl );.  if( fts5
9f90: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
9fa0: 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69  l) ){.    if( (i
9fb0: 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e  Lvl+1) < pIter->
9fc0: 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74  nLvl ){.      ft
9fd0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
9fe0: 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b  (p, pIter, iLvl+
9ff0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  1);.      if( pL
a000: 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b  vl[1].bEof==0 ){
a010: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
a020: 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70  aRelease(pLvl->p
a030: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d  Data);.        m
a040: 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73  emset(pLvl, 0, s
a050: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
a060: 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  vl));.        pL
a070: 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
a080: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
a090: 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
a0a0: 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  IDX_ROWID(pIter-
a0b0: 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70  >iSegid, iLvl, p
a0c0: 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f  Lvl[1].iLeafPgno
a0d0: 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
a0e0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
a0f0: 44 61 74 61 20 29 20 66 74 73 35 44 6c 69 64 78  Data ) fts5Dlidx
a100: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b 0a 20  LvlNext(pLvl);. 
a110: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a120: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ..  return pIter
a130: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
a140: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
a150: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 46  5DlidxIterNext(F
a160: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
a170: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
a180: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  r){.  return fts
a190: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28  5DlidxIterNextR(
a1a0: 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a  p, pIter, 0);.}.
a1b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  ./*.** The itera
a1c0: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
a1d0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
a1e0: 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69   has the followi
a1f0: 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a  ng fields set.**
a200: 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69   as follows. Thi
a210: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
a220: 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  up the rest of t
a230: 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
a240: 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73  hat it.** points
a250: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
a260: 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
a270: 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  st-index..**.** 
a280: 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 20 20    pData:.**     
a290: 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69  pointer to docli
a2a0: 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  st-index record,
a2b0: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69   .**.** When thi
a2c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
a2d0: 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c 65 61  lled pIter->iLea
a2e0: 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70 61 67  fPgno is the pag
a2f0: 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a 2a 20  e number the.** 
a300: 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73 6f 63  doclist is assoc
a310: 69 61 74 65 64 20 77 69 74 68 20 28 74 68 65 20  iated with (the 
a320: 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20 74 68  one featuring th
a330: 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74  e term)..*/.stat
a340: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
a350: 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44 6c  IterFirst(Fts5Dl
a360: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
a370: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
a380: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
a390: 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74  vl; i++){.    ft
a3a0: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
a3b0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b  pIter->aLvl[i]);
a3c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
a3d0: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
a3e0: 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e  f;.}...static in
a3f0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  t fts5DlidxIterE
a400: 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
a410: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
a420: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
a430: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
a440: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c 76 6c  K || pIter->aLvl
a450: 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61  [0].bEof;.}..sta
a460: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
a470: 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35 49  dxIterLast(Fts5I
a480: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
a490: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
a4a0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
a4b0: 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65 76 65  dvance each leve
a4c0: 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  l to the last en
a4d0: 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73 74 20  try on the last 
a4e0: 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  page */.  for(i=
a4f0: 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70  pIter->nLvl-1; p
a500: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a510: 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  && i>=0; i--){. 
a520: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
a530: 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
a540: 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77 68 69  aLvl[i];.    whi
a550: 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  le( fts5DlidxLvl
a560: 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b  Next(pLvl)==0 );
a570: 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20  .    pLvl->bEof 
a580: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 3e  = 0;..    if( i>
a590: 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44  0 ){.      Fts5D
a5a0: 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c 64 20  lidxLvl *pChild 
a5b0: 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20  = &pLvl[-1];.   
a5c0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
a5d0: 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61 74 61  se(pChild->pData
a5e0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
a5f0: 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a 65 6f  pChild, 0, sizeo
a600: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
a610: 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e  ;.      pChild->
a620: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
a630: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
a640: 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
a650: 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69  WID(pIter->iSegi
a660: 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c  d, i-1, pLvl->iL
a670: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 29  eafPgno).      )
a680: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
a690: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
a6a0: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a6b0: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a6c0: 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  nt to the previo
a6d0: 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  us entry..*/.sta
a6e0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a6f0: 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44 6c 69  xLvlPrev(Fts5Dli
a700: 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  dxLvl *pLvl){.  
a710: 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76 6c 2d  int iOff = pLvl-
a720: 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74  >iOff;..  assert
a730: 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20  ( pLvl->bEof==0 
a740: 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d 70  );.  if( iOff<=p
a750: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29  Lvl->iFirstOff )
a760: 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66  {.    pLvl->bEof
a770: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
a780: 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76 6c 2d     u8 *a = pLvl-
a790: 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69  >pData->p;.    i
a7a0: 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74  64 iVal;.    int
a7b0: 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 6e 74   iLimit;.    int
a7c0: 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 5a 65   ii;.    int nZe
a7d0: 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ro = 0;..    /* 
a7e0: 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70  Currently iOff p
a7f0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
a800: 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61 72  st byte of a var
a810: 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  int. This block 
a820: 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e  .    ** decremen
a830: 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74  ts iOff until it
a840: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
a850: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
a860: 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a   previous .    *
a870: 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67  * varint. Taking
a880: 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61   care not to rea
a890: 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63  d any memory loc
a8a0: 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75  ations that occu
a8b0: 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  r.    ** before 
a8c0: 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65  the buffer in me
a8d0: 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c  mory.  */.    iL
a8e0: 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f  imit = (iOff>9 ?
a8f0: 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20   iOff-9 : 0);.  
a900: 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f    for(iOff--; iO
a910: 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d  ff>iLimit; iOff-
a920: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61  -){.      if( (a
a930: 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29  [iOff-1] & 0x80)
a940: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
a950: 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65 74 56   }..    fts5GetV
a960: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
a970: 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20  (u64*)&iVal);.  
a980: 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d    pLvl->iRowid -
a990: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c  = iVal;.    pLvl
a9a0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a  ->iLeafPgno--;..
a9b0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b      /* Skip back
a9c0: 77 61 72 64 73 20 70 61 73 74 20 61 6e 79 20 30  wards past any 0
a9d0: 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a  x00 varints. */.
a9e0: 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d      for(ii=iOff-
a9f0: 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69  1; ii>=pLvl->iFi
aa00: 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d  rstOff && a[ii]=
aa10: 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20  =0x00; ii--){.  
aa20: 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20      nZero++;.   
aa30: 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d 70   }.    if( ii>=p
aa40: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26  Lvl->iFirstOff &
aa50: 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30 29  & (a[ii] & 0x80)
aa60: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
aa70: 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c   byte immediatel
aa80: 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  y before the las
aa90: 74 20 30 78 30 30 20 62 79 74 65 20 68 61 73 20  t 0x00 byte has 
aaa0: 74 68 65 20 30 78 38 30 20 62 69 74 0a 20 20 20  the 0x80 bit.   
aab0: 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68     ** set. So th
aac0: 65 20 6c 61 73 74 20 30 78 30 30 20 69 73 20 6f  e last 0x00 is o
aad0: 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20 69  nly a varint 0 i
aae0: 66 20 74 68 65 72 65 20 61 72 65 20 38 20 6d 6f  f there are 8 mo
aaf0: 72 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a 2a  re 0x80.      **
ab00: 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 61 5b   bytes before a[
ab10: 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ii]. */.      in
ab20: 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20  t bZero = 0;    
ab30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
ab40: 65 20 69 66 20 6c 61 73 74 20 30 78 30 30 20 63  e if last 0x00 c
ab50: 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ounts */.      i
ab60: 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d  f( (ii-8)>=pLvl-
ab70: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
ab80: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
ab90: 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
aba0: 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26  =8 && (a[ii-j] &
abb0: 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20   0x80); j++);.  
abc0: 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a        bZero = (j
abd0: 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >8);.      }.   
abe0: 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20     if( bZero==0 
abf0: 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d  ) nZero--;.    }
ac00: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  .    pLvl->iLeaf
ac10: 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20  Pgno -= nZero;. 
ac20: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20     pLvl->iOff = 
ac30: 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20  iOff - nZero;.  
ac40: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c  }..  return pLvl
ac50: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69  ->bEof;.}..stati
ac60: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
ac70: 74 65 72 50 72 65 76 52 28 46 74 73 35 49 6e 64  terPrevR(Fts5Ind
ac80: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
ac90: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
aca0: 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c   iLvl){.  Fts5Dl
acb0: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
acc0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c  pIter->aLvl[iLvl
acd0: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  ];..  assert( iL
ace0: 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29  vl<pIter->nLvl )
acf0: 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64  ;.  if( fts5Dlid
ad00: 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20 29  xLvlPrev(pLvl) )
ad10: 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b  {.    if( (iLvl+
ad20: 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c  1) < pIter->nLvl
ad30: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
ad40: 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20  idxIterPrevR(p, 
ad50: 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a  pIter, iLvl+1);.
ad60: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31        if( pLvl[1
ad70: 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  ].bEof==0 ){.   
ad80: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
ad90: 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
ada0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
adb0: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
adc0: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
add0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
ade0: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
adf0: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
ae00: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
ae10: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
ae20: 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b  gid, iLvl, pLvl[
ae30: 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  1].iLeafPgno).  
ae40: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
ae50: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
ae60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
ae70: 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76  ile( fts5DlidxLv
ae80: 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29  lNext(pLvl)==0 )
ae90: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c  ;.          pLvl
aea0: 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20  ->bEof = 0;.    
aeb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
aec0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
aed0: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
aee0: 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20  .bEof;.}.static 
aef0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
af00: 72 50 72 65 76 28 46 74 73 35 49 6e 64 65 78 20  rPrev(Fts5Index 
af10: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
af20: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
af30: 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65  urn fts5DlidxIte
af40: 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c  rPrevR(p, pIter,
af50: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   0);.}../*.** Fr
af60: 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  ee a doclist-ind
af70: 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  ex iterator obje
af80: 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ct allocated by 
af90: 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
afa0: 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t()..*/.static v
afb0: 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65  oid fts5DlidxIte
afc0: 72 46 72 65 65 28 46 74 73 35 44 6c 69 64 78 49  rFree(Fts5DlidxI
afd0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
afe0: 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
aff0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
b000: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76  =0; i<pIter->nLv
b010: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
b020: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
b030: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44  Iter->aLvl[i].pD
b040: 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
b050: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
b060: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  er);.  }.}..stat
b070: 69 63 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ic Fts5DlidxIter
b080: 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72 49   *fts5DlidxIterI
b090: 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
b0a0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b0b0: 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42         /* Fts5 B
b0c0: 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
b0d0: 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e  e within */.  in
b0e0: 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b100: 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20   True for ORDER 
b110: 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20  BY ASC */.  int 
b120: 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
b130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b140: 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69  egment id */.  i
b150: 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20 20 20  nt iLeafPg      
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b170: 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  * Leaf page numb
b180: 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78  er to load dlidx
b190: 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73   for */.){.  Fts
b1a0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
b1b0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
b1c0: 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
b1d0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e  ..  for(i=0; p->
b1e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
b1f0: 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b   bDone==0; i++){
b200: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
b210: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
b220: 78 49 74 65 72 29 20 2b 20 69 20 2a 20 73 69 7a  xIter) + i * siz
b230: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
b240: 29 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  );.    Fts5Dlidx
b250: 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20  Iter *pNew;..   
b260: 20 70 4e 65 77 20 3d 20 28 46 74 73 35 44 6c 69   pNew = (Fts5Dli
b270: 64 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 5f  dxIter*)sqlite3_
b280: 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e  realloc(pIter, n
b290: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
b2a0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
b2b0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
b2c0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
b2d0: 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
b2e0: 64 20 3d 20 46 54 53 35 5f 44 4c 49 44 58 5f 52  d = FTS5_DLIDX_R
b2f0: 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 2c 20  OWID(iSegid, i, 
b300: 69 4c 65 61 66 50 67 29 3b 0a 20 20 20 20 20 20  iLeafPg);.      
b310: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
b320: 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c  vl = &pNew->aLvl
b330: 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49 74 65 72  [i];.      pIter
b340: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d   = pNew;.      m
b350: 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73  emset(pLvl, 0, s
b360: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
b370: 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  vl));.      pLvl
b380: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
b390: 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64  taRead(p, iRowid
b3a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  );.      if( pLv
b3b0: 6c 2d 3e 70 44 61 74 61 20 26 26 20 28 70 4c 76  l->pData && (pLv
b3c0: 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26  l->pData->p[0] &
b3d0: 20 30 78 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20   0x0001)==0 ){. 
b3e0: 20 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31         bDone = 1
b3f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b400: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b  pIter->nLvl = i+
b410: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
b420: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
b430: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65  E_OK ){.    pIte
b440: 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  r->iSegid = iSeg
b450: 69 64 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  id;.    if( bRev
b460: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
b470: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
b480: 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73  pIter);.    }els
b490: 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  e{.      fts5Dli
b4a0: 64 78 49 74 65 72 4c 61 73 74 28 70 2c 20 70 49  dxIterLast(p, pI
b4b0: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
b4c0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
b4d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
b4e0: 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
b4f0: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74  (pIter);.    pIt
b500: 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  er = 0;.  }..  r
b510: 65 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a  eturn pIter;.}..
b520: 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44  static i64 fts5D
b530: 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 46 74  lidxIterRowid(Ft
b540: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b550: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49  er){.  return pI
b560: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f  ter->aLvl[0].iRo
b570: 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  wid;.}.static in
b580: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  t fts5DlidxIterP
b590: 67 6e 6f 28 46 74 73 35 44 6c 69 64 78 49 74 65  gno(Fts5DlidxIte
b5a0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
b5b0: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
b5c0: 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a  0].iLeafPgno;.}.
b5d0: 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
b5e0: 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65 20 69  next leaf page i
b5f0: 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20  nto the segment 
b600: 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  iterator..*/.sta
b610: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
b620: 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20 20  IterNextPage(.  
b630: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
b660: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
b670: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
b680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b690: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
b6a0: 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65 20  ce to next page 
b6b0: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61  */.){.  Fts5Data
b6c0: 20 2a 70 4c 65 61 66 3b 0a 20 20 46 74 73 35 53   *pLeaf;.  Fts5S
b6d0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
b6e0: 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70  *pSeg = pIter->p
b6f0: 53 65 67 3b 0a 20 20 66 74 73 35 44 61 74 61 52  Seg;.  fts5DataR
b700: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
b710: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  eaf);.  pIter->i
b720: 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66  LeafPgno++;.  if
b730: 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
b740: 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  af ){.    pIter-
b750: 3e 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  >pLeaf = pIter->
b760: 70 4e 65 78 74 4c 65 61 66 3b 0a 20 20 20 20 70  pNextLeaf;.    p
b770: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
b780: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
b790: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b7a0: 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  o<=pSeg->pgnoLas
b7b0: 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  t ){.    pIter->
b7c0: 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
b7d0: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
b7e0: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
b7f0: 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
b800: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  , pIter->iLeafPg
b810: 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  no).    );.  }el
b820: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  se{.    pIter->p
b830: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Leaf = 0;.  }.  
b840: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
b850: 4c 65 61 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65  Leaf;..  if( pLe
b860: 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  af ){.    pIter-
b870: 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65  >iPgidxOff = pLe
b880: 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20  af->szLeaf;.    
b890: 69 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65  if( fts5LeafIsTe
b8a0: 72 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29 7b  rmless(pLeaf) ){
b8b0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
b8c0: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c  ndofDoclist = pL
b8d0: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d  eaf->nn+1;.    }
b8e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
b8f0: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d 20  r->iPgidxOff += 
b900: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
b910: 26 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d  &pLeaf->p[pIter-
b920: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20  >iPgidxOff],.   
b930: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45         pIter->iE
b940: 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20  ndofDoclist.    
b950: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
b960: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
b970: 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62   p points to a b
b980: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
b990: 20 61 20 76 61 72 69 6e 74 20 74 6f 20 62 65 20   a varint to be 
b9a0: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
b9b0: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  .** position lis
b9c0: 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65  t size field. Re
b9d0: 61 64 20 74 68 65 20 76 61 72 69 6e 74 20 61 6e  ad the varint an
b9e0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  d return the num
b9f0: 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20  ber of bytes.** 
ba00: 72 65 61 64 2e 20 42 65 66 6f 72 65 20 72 65 74  read. Before ret
ba10: 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53  urning, set *pnS
ba20: 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  z to the number 
ba30: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
ba40: 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74  position.** list
ba50: 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20  , and *pbDel to 
ba60: 74 72 75 65 20 69 66 20 74 68 65 20 64 65 6c 65  true if the dele
ba70: 74 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  te flag is set, 
ba80: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
ba90: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
baa0: 74 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  t fts5GetPoslist
bab0: 53 69 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a 70  Size(const u8 *p
bac0: 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74  , int *pnSz, int
bad0: 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20   *pbDel){.  int 
bae0: 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  nSz;.  int n = 0
baf0: 3b 0a 20 20 66 74 73 35 46 61 73 74 47 65 74 56  ;.  fts5FastGetV
bb00: 61 72 69 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53  arint32(p, n, nS
bb10: 7a 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28  z);.  assert_nc(
bb20: 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e   nSz>=0 );.  *pn
bb30: 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70  Sz = nSz/2;.  *p
bb40: 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30  bDel = nSz & 0x0
bb50: 30 30 31 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  001;.  return n;
bb60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65  .}../*.** Fts5Se
bb70: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
bb80: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
bb90: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
bba0: 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73  byte of a.** pos
bbb0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
bbc0: 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20  field. Read the 
bbd0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69 65  value of the fie
bbe0: 6c 64 20 61 6e 64 20 73 74 6f 72 65 20 69 74 0a  ld and store it.
bbf0: 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
bc00: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a  ing variables:.*
bc10: 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  *.**   Fts5SegIt
bc20: 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73  er.nPos.**   Fts
bc30: 35 53 65 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a  5SegIter.bDel.**
bc40: 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73 35 53 65  .** Leave Fts5Se
bc50: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
bc60: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
bc70: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
bc80: 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  the .** position
bc90: 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 28 69   list content (i
bca0: 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69  f any)..*/.stati
bcb0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
bcc0: 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74 73 35 49  erLoadNPos(Fts5I
bcd0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
bce0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
bcf0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
bd00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
bd10: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
bd20: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
bd30: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
bd40: 20 2a 2f 0a 20 20 20 20 41 53 53 45 52 54 5f 53   */.    ASSERT_S
bd50: 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e  ZLEAF_OK(pIter->
bd60: 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
bd70: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
bd80: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
bd90: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
bda0: 6e 74 20 69 45 6f 64 20 3d 20 4d 49 4e 28 70 49  nt iEod = MIN(pI
bdb0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
bdc0: 73 74 2c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  st, pIter->pLeaf
bdd0: 2d 3e 73 7a 4c 65 61 66 29 3b 0a 20 20 20 20 20  ->szLeaf);.     
bde0: 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 30   pIter->bDel = 0
bdf0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
be00: 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Pos = 1;.      i
be10: 66 28 20 69 4f 66 66 3c 69 45 6f 64 20 26 26 20  f( iOff<iEod && 
be20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
be30: 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iOff]==0 ){.    
be40: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20      pIter->bDel 
be50: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  = 1;.        iOf
be60: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f++;.        if(
be70: 20 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49   iOff<iEod && pI
be80: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f  ter->pLeaf->p[iO
be90: 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ff]==0 ){.      
bea0: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
beb0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 1;.          i
bec0: 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Off++;.        }
bed0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
bee0: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b  pIter->nPos = 0;
bef0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bf00: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
bf10: 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20      int nSz;.   
bf20: 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
bf30: 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c  rint32(pIter->pL
bf40: 65 61 66 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53  eaf->p, iOff, nS
bf50: 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  z);.      pIter-
bf60: 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30  >bDel = (nSz & 0
bf70: 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49  x0001);.      pI
bf80: 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e  ter->nPos = nSz>
bf90: 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  >1;.      assert
bfa0: 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73  _nc( pIter->nPos
bfb0: 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >=0 );.    }.   
bfc0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
bfd0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a  set = iOff;.  }.
bfe0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
bff0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
c000: 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  wid(Fts5Index *p
c010: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
c020: 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d  Iter){.  u8 *a =
c030: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
c040: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66  ;        /* Buff
c050: 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20  er to read data 
c060: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  from */.  int iO
c070: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
c080: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53 53 45  fOffset;..  ASSE
c090: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
c0a0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66  er->pLeaf);.  if
c0b0: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  ( iOff>=pIter->p
c0c0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
c0d0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
c0e0: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
c0f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
c100: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
c110: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
c120: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
c130: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
c140: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
c150: 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20     }.    iOff = 
c160: 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72  4;.    a = pIter
c170: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a  ->pLeaf->p;.  }.
c180: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
c190: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
c1a0: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
c1b0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
c1c0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
c1d0: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a  fset = iOff;.}..
c1e0: 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  /*.** Fts5SegIte
c1f0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75  r.iLeafOffset cu
c200: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
c210: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
c220: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75   of the .** "nSu
c230: 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20 61  ffix" field of a
c240: 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20   term. Function 
c250: 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70 20  parameter nKeep 
c260: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
c270: 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50  ue.** of the "nP
c280: 72 65 66 69 78 22 20 66 69 65 6c 64 20 28 69 66  refix" field (if
c290: 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20 2d   there was one -
c2a0: 20 69 74 20 69 73 20 70 61 73 73 65 64 20 30 20   it is passed 0 
c2b0: 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74 68  if this is.** th
c2c0: 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20  e first term in 
c2d0: 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a  the segment)..**
c2e0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c2f0: 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a  n populates:.**.
c300: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
c310: 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53  .term.**   Fts5S
c320: 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a  egIter.rowid.**.
c330: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  ** accordingly a
c340: 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73 35 53  nd leaves (Fts5S
c350: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c360: 65 74 29 20 73 65 74 20 74 6f 20 74 68 65 20 63  et) set to the c
c370: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65  ontent of.** the
c380: 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e 20   first position 
c390: 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69  list. The positi
c3a0: 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e  on list belongin
c3b0: 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a  g to document .*
c3c0: 2a 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  * (Fts5SegIter.i
c3d0: 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  Rowid)..*/.stati
c3e0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c3f0: 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49  erLoadTerm(Fts5I
c400: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
c410: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
c420: 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61   nKeep){.  u8 *a
c430: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
c440: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
c450: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
c460: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
c470: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
c480: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
c490: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
c4a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
c4d0: 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20  f new data */.. 
c4e0: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
c4f0: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
c500: 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20  ], nNew);.  if( 
c510: 69 4f 66 66 2b 6e 4e 65 77 3e 70 49 74 65 72 2d  iOff+nNew>pIter-
c520: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20  >pLeaf->nn ){.  
c530: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
c540: 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75  ORRUPT;.    retu
c550: 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d  rn;.  }.  pIter-
c560: 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b  >term.n = nKeep;
c570: 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
c580: 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
c590: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e  &pIter->term, nN
c5a0: 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  ew, &a[iOff]);. 
c5b0: 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20   iOff += nNew;. 
c5c0: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
c5d0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
c5e0: 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
c5f0: 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e  afPgno = pIter->
c600: 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70 49 74  iLeafPgno;.  pIt
c610: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
c620: 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70  = iOff;..  if( p
c630: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 3e  Iter->iPgidxOff>
c640: 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e  =pIter->pLeaf->n
c650: 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  n ){.    pIter->
c660: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
c670: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
c680: 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  +1;.  }else{.   
c690: 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20   int nExtra;.   
c6a0: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
c6b0: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
c6c0: 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d 3e 69  nt32(&a[pIter->i
c6d0: 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78 74 72  PgidxOff], nExtr
c6e0: 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
c6f0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b 3d 20  EndofDoclist += 
c700: 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20 20 66  nExtra;.  }..  f
c710: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
c720: 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  wid(p, pIter);.}
c730: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
c740: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 46 74  s5SegIterNext(Ft
c750: 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65  s5Index*, Fts5Se
c760: 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73  gIter*, int*);.s
c770: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
c780: 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72  egIterNext_Rever
c790: 73 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46  se(Fts5Index*, F
c7a0: 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74  ts5SegIter*, int
c7b0: 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
c7c0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
c7d0: 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65 78 2a 2c  None(Fts5Index*,
c7e0: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
c7f0: 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f  nt*);..static vo
c800: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 53 65  id fts5SegIterSe
c810: 74 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20  tNext(Fts5Index 
c820: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
c830: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
c840: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
c850: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
c860: 53 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  SE ){.    pIter-
c870: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67  >xNext = fts5Seg
c880: 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65  IterNext_Reverse
c890: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
c8a0: 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
c8b0: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
c8c0: 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ONE ){.    pIter
c8d0: 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65  ->xNext = fts5Se
c8e0: 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a  gIterNext_None;.
c8f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
c900: 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  er->xNext = fts5
c910: 53 65 67 49 74 65 72 4e 65 78 74 3b 0a 20 20 7d  SegIterNext;.  }
c920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
c930: 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f  lize the iterato
c940: 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  r object pIter t
c950: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
c960: 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  h the entries in
c970: 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67  .** segment pSeg
c980: 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  . The iterator i
c990: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
c9a0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
c9b0: 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73  ry when .** this
c9c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
c9d0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
c9e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
c9f0: 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
ca00: 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
ca10: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
ca20: 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
ca30: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
ca40: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
ca50: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
ca60: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
ca70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ca80: 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
ca90: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
cac0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
cad0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
cae0: 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
caf0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
cb00: 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
cb10: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
cb20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
cb30: 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
cb40: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65   */.){.  if( pSe
cb50: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
cb60: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
cb70: 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65  appens if the se
cb80: 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75  gment is being u
cb90: 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20  sed as an input 
cba0: 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  to an incrementa
cbb0: 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61  l.    ** merge a
cbc0: 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  nd all data has 
cbd0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72  already been "tr
cbe0: 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63  immed". See func
cbf0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35  tion.    ** fts5
cc00: 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66  TrimSegments() f
cc10: 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74  or details. In t
cc20: 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74  his case leave t
cc30: 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74  he iterator empt
cc40: 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  y..    ** The ca
cc50: 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68  ller will see th
cc60: 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  e (pIter->pLeaf=
cc70: 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74  =0) and assume t
cc80: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20  he iterator is. 
cc90: 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72     ** at EOF alr
cca0: 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  eady. */.    ass
ccb0: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
ccc0: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  f==0 );.    retu
ccd0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
cce0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
ccf0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ){.    memset(pI
cd00: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
cd10: 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66 74 73  pIter));.    fts
cd20: 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
cd30: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70  p, pIter);.    p
cd40: 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
cd50: 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  g;.    pIter->iL
cd60: 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  eafPgno = pSeg->
cd70: 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20  pgnoFirst-1;.   
cd80: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
cd90: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
cda0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
cdb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
cdc0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
cdd0: 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61  ffset = 4;.    a
cde0: 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d  ssert_nc( pIter-
cdf0: 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a  >pLeaf->nn>4 );.
ce00: 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
ce10: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
ce20: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d  (pIter->pLeaf)==
ce30: 34 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  4 );.    pIter->
ce40: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65  iPgidxOff = pIte
ce50: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
ce60: 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  +1;.    fts5SegI
ce70: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
ce80: 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74  Iter, 0);.    ft
ce90: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
cea0: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  s(p, pIter);.  }
ceb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
cec0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
ced0: 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69  ever called on i
cee0: 74 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64  terators created
cef0: 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20   by calls to.** 
cf00: 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
cf10: 20 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e   with the FTS5IN
cf20: 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66  DEX_QUERY_DESC f
cf30: 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54  lag set..**.** T
cf40: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69  he iterator is i
cf50: 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61  n an unusual sta
cf60: 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
cf70: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a  ction is called:
cf80: 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49   the.** Fts5SegI
cf90: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
cfa0: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
cfb0: 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  to the offset of
cfc0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
cfd0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
cfe0: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f  st size field fo
cff0: 72 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65  r the first rele
d000: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
d010: 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53  e page..** Fts5S
d020: 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20  egIter.rowid is 
d030: 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e  set, but nPos an
d040: 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a  d bDel are not..
d050: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d060: 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65  ion advances the
d070: 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61   iterator so tha
d080: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
d090: 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65  he last .** rele
d0a0: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
d0b0: 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e  e page and, if n
d0c0: 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61  ecessary, initia
d0d0: 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52  lizes the .** aR
d0e0: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64  owidOffset[] and
d0f0: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61   iRowidOffset va
d100: 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73  riables. At this
d110: 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61   point the itera
d120: 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73  tor.** is in its
d130: 20 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d   regular state -
d140: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
d150: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20  afOffset points 
d160: 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
d170: 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69  byte of the posi
d180: 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e  tion list conten
d190: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
d1a0: 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f  h said rowid..*/
d1b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d1c0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
d1d0: 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65  nitPage(Fts5Inde
d1e0: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
d1f0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
d200: 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
d210: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
d220: 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d    int n = pIter-
d230: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a  >pLeaf->szLeaf;.
d240: 20 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d    int i = pIter-
d250: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
d260: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
d270: 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69  Leaf->p;.  int i
d280: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b  RowidOffset = 0;
d290: 0a 0a 20 20 69 66 28 20 6e 3e 70 49 74 65 72 2d  ..  if( n>pIter-
d2a0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29  >iEndofDoclist )
d2b0: 7b 0a 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d  {.    n = pIter-
d2c0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a  >iEndofDoclist;.
d2d0: 20 20 7d 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a    }..  ASSERT_SZ
d2e0: 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70  LEAF_OK(pIter->p
d2f0: 4c 65 61 66 29 3b 0a 20 20 77 68 69 6c 65 28 20  Leaf);.  while( 
d300: 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65  1 ){.    i64 iDe
d310: 6c 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  lta = 0;..    if
d320: 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
d330: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
d340: 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a       /* todo */.
d350: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26        if( i<n &&
d360: 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
d370: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
d380: 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d   if( i<n && a[i]
d390: 3d 3d 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  ==0 ) i++;.     
d3a0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d3b0: 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
d3c0: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
d3d0: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
d3e0: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
d3f0: 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  [i], &nPos, &bDu
d400: 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  mmy);.      i +=
d410: 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20   nPos;.    }.   
d420: 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61   if( i>=n ) brea
d430: 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35  k;.    i += fts5
d440: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c  GetVarint(&a[i],
d450: 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
d460: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
d470: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20  id += iDelta;.. 
d480: 20 20 20 2f 2a 20 49 66 20 6e 65 63 65 73 73 61     /* If necessa
d490: 72 79 2c 20 67 72 6f 77 20 74 68 65 20 70 49 74  ry, grow the pIt
d4a0: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
d4b0: 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20  [] array. */.   
d4c0: 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65   if( iRowidOffse
d4d0: 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64  t>=pIter->nRowid
d4e0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
d4f0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72  int nNew = pIter
d500: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b  ->nRowidOffset +
d510: 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   8;.      int *a
d520: 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  New = (int*)sqli
d530: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65  te3_realloc(pIte
d540: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c  r->aRowidOffset,
d550: 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74   nNew*sizeof(int
d560: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e  ));.      if( aN
d570: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
d580: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
d590: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
d5a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d5b0: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
d5c0: 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a  dOffset = aNew;.
d5d0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f        pIter->nRo
d5e0: 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77  widOffset = nNew
d5f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74  ;.    }..    pIt
d600: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
d610: 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d  [iRowidOffset++]
d620: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
d630: 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72  ffset;.    pIter
d640: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d650: 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  i;.  }.  pIter->
d660: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69  iRowidOffset = i
d670: 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66  RowidOffset;.  f
d680: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
d690: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  os(p, pIter);.}.
d6a0: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
d6b0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
d6c0: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
d6d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d6e0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d6f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
d700: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
d710: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
d720: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
d730: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
d740: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
d750: 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61  M );..  fts5Data
d760: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
d770: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
d780: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69  pLeaf = 0;.  whi
d790: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
d7a0: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69  E_OK && pIter->i
d7b0: 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
d7c0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
d7d0: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
d7e0: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
d7f0: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
d800: 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61   pNew = fts5Data
d810: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
d820: 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20  MENT_ROWID(.    
d830: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65        pIter->pSe
d840: 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72  g->iSegid, pIter
d850: 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20  ->iLeafPgno.    
d860: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
d870: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 54 65   ){.      /* iTe
d880: 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 6d 61 79  rmLeafOffset may
d890: 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c   be equal to szL
d8a0: 65 61 66 20 69 66 20 74 68 65 20 74 65 72 6d 20  eaf if the term 
d8b0: 69 73 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  is the last.    
d8c0: 20 20 2a 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68    ** thing on th
d8d0: 65 20 70 61 67 65 20 2d 20 69 2e 65 2e 20 74 68  e page - i.e. th
d8e0: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 73  e first rowid is
d8f0: 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   on the followin
d900: 67 20 70 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a  g page..      **
d910: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65   In this case le
d920: 61 76 65 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ave pIter->pLeaf
d930: 3d 3d 30 2c 20 74 68 69 73 20 69 74 65 72 61 74  ==0, this iterat
d940: 6f 72 20 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f  or is at EOF. */
d950: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
d960: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74  ->iLeafPgno==pIt
d970: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
d980: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  o ){.        ass
d990: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
d9a0: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  f==0 );.        
d9b0: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
d9c0: 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d  LeafOffset<pNew-
d9d0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
d9e0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
d9f0: 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  f = pNew;.      
da00: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
da10: 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Offset = pIter->
da20: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
da30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
da40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
da50: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  int iRowidOff;. 
da60: 20 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66         iRowidOff
da70: 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
da80: 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a  RowidOff(pNew);.
da90: 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
daa0: 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  idOff ){.       
dab0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
dac0: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
dad0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
dae0: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
daf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
db00: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
db10: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
db20: 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26         u8 *a = &
db30: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
db40: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
db50: 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74  et];.        pIt
db60: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
db70: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
db80: 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  (a, (u64*)&pIter
db90: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
dba0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
dbb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
dbc0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
dbd0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
dbe0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
dbf0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
dc00: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
dc10: 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Doclist = pIter-
dc20: 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20  >pLeaf->nn+1;.  
dc30: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
dc40: 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
dc50: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
dc60: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
dc70: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
dc80: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
dc90: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
dca0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
dcb0: 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20 6d  ts to a delete m
dcc0: 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65 20  arker. A delete 
dcd0: 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e 74  marker is an ent
dce0: 72 79 20 77 69 74 68 20 61 20 30 20 62 79 74 65  ry with a 0 byte
dcf0: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
dd00: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
dd10: 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
dd20: 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78 20  Empty(Fts5Index 
dd30: 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
dd40: 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49  ter){.  Fts5SegI
dd50: 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
dd60: 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
dd70: 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
dd80: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  ];.  return (p->
dd90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
dda0: 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20   pSeg->pLeaf && 
ddb0: 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a  pSeg->nPos==0);.
ddc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
ddd0: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
dde0: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
ddf0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65  y..**.** This ve
de00: 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67  rsion of fts5Seg
de10: 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e  IterNext() is on
de20: 6c 79 20 75 73 65 64 20 62 79 20 72 65 76 65 72  ly used by rever
de30: 73 65 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f  se iterators..*/
de40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
de50: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76  5SegIterNext_Rev
de60: 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erse(.  Fts5Inde
de70: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
de80: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
de90: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
dea0: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
deb0: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
dec0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
ded0: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
dee0: 69 6e 74 20 2a 70 62 55 6e 75 73 65 64 20 20 20  int *pbUnused   
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a  /* Unused */.){.
df10: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
df20: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
df30: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
df40: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
df50: 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
df60: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
df70: 28 70 62 55 6e 75 73 65 64 29 3b 0a 0a 20 20 69  (pbUnused);..  i
df80: 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  f( pIter->iRowid
df90: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
dfa0: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
dfb0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74  Leaf->p;.    int
dfc0: 20 69 4f 66 66 3b 0a 20 20 20 20 69 36 34 20 69   iOff;.    i64 i
dfd0: 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 49 74 65  Delta;..    pIte
dfe0: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d  r->iRowidOffset-
dff0: 2d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  -;.    pIter->iL
e000: 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65  eafOffset = pIte
e010: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
e020: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
e030: 73 65 74 5d 3b 0a 20 20 20 20 66 74 73 35 53 65  set];.    fts5Se
e040: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
e050: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 4f 66   pIter);.    iOf
e060: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
e070: 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 66 28 20  Offset;.    if( 
e080: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
e090: 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail!=FTS5_DETAIL
e0a0: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
e0b0: 4f 66 66 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50  Off += pIter->nP
e0c0: 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  os;.    }.    ft
e0d0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
e0e0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
e0f0: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
e100: 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74  >iRowid -= iDelt
e110: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
e120: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
e130: 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
e140: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
e150: 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74  * Advance iterat
e160: 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20  or pIter to the 
e170: 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  next entry..**.*
e180: 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
e190: 66 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  f fts5SegIterNex
e1a0: 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t() is only used
e1b0: 20 69 66 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20   if detail=none 
e1c0: 61 6e 64 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  and the.** itera
e1d0: 74 6f 72 20 69 73 20 6e 6f 74 20 61 20 72 65 76  tor is not a rev
e1e0: 65 72 73 65 20 64 69 72 65 63 74 69 6f 6e 20 69  erse direction i
e1f0: 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  terator..*/.stat
e200: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
e210: 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 0a 20 20  terNext_None(.  
e220: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
e250: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
e260: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
e270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e280: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
e290: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e  ce */.  int *pbN
e2a0: 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
e2b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
e2c0: 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d  Set for new term
e2d0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66   */.){.  int iOf
e2e0: 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  f;..  assert( p-
e2f0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
e300: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 74  ;.  assert( (pIt
e310: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
e320: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
e330: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
e340: 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
e350: 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
e360: 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 41 53  IL_NONE );..  AS
e370: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
e380: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
e390: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
e3a0: 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a  eafOffset;..  /*
e3b0: 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f   Next entry is o
e3c0: 6e 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  n the next page 
e3d0: 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
e3e0: 70 53 65 67 20 26 26 20 69 4f 66 66 3e 3d 70 49  pSeg && iOff>=pI
e3f0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
e400: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
e410: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
e420: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28   pIter);.    if(
e430: 20 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d   p->rc || pIter-
e440: 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75  >pLeaf==0 ) retu
e450: 72 6e 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  rn;.    pIter->i
e460: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 69  Rowid = 0;.    i
e470: 4f 66 66 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20  Off = 4;.  }..  
e480: 69 66 28 20 69 4f 66 66 3c 70 49 74 65 72 2d 3e  if( iOff<pIter->
e490: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
e4a0: 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  .    /* Next ent
e4b0: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
e4c0: 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20  rent page */.   
e4d0: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   i64 iDelta;.   
e4e0: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
e4f0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
e500: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69  Iter->pLeaf->p[i
e510: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
e520: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
e530: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
e540: 4f 66 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Off;.    pIter->
e550: 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
e560: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
e570: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
e580: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
e590: 52 4d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  RM)==0 ){.    if
e5a0: 28 20 70 49 74 65 72 2d 3e 70 53 65 67 20 29 7b  ( pIter->pSeg ){
e5b0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70  .      int nKeep
e5c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
e5d0: 69 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69  iOff!=fts5LeafFi
e5e0: 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72  rstTermOff(pIter
e5f0: 2d 3e 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  ->pLeaf) ){.    
e600: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
e610: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
e620: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  er->pLeaf->p[iOf
e630: 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
e640: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d    }.      pIter-
e650: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
e660: 4f 66 66 3b 0a 20 20 20 20 20 20 66 74 73 35 53  Off;.      fts5S
e670: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
e680: 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b  , pIter, nKeep);
e690: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e6a0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73    const u8 *pLis
e6b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  t = 0;.      con
e6c0: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
e6d0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
e6e0: 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
e6f0: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65  e3Fts5HashScanNe
e700: 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  xt(p->pHash);.  
e710: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
e720: 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e  ashScanEntry(p->
e730: 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
e740: 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
e750: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d        if( pList=
e760: 3d 30 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 6e  =0 ) goto next_n
e770: 6f 6e 65 5f 65 6f 66 3b 0a 20 20 20 20 20 20 70  one_eof;.      p
e780: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d  Iter->pLeaf->p =
e790: 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
e7a0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
e7b0: 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  >nn = nList;.   
e7c0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
e7d0: 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b  >szLeaf = nList;
e7e0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
e7f0: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c  ndofDoclist = nL
e800: 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
e810: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
e820: 26 70 2d 3e 72 63 2c 26 70 49 74 65 72 2d 3e 74  &p->rc,&pIter->t
e830: 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  erm, (int)strlen
e840: 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54  (zTerm), (u8*)zT
e850: 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  erm);.      pIte
e860: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e870: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
e880: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
e890: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
e8a0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 62 4e 65   }..    if( pbNe
e8b0: 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65  wTerm ) *pbNewTe
e8c0: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
e8d0: 0a 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 6e  .    goto next_n
e8e0: 6f 6e 65 5f 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20  one_eof;.  }..  
e8f0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
e900: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  Pos(p, pIter);..
e910: 20 20 72 65 74 75 72 6e 3b 0a 20 6e 65 78 74 5f    return;. next_
e920: 6e 6f 6e 65 5f 65 6f 66 3a 0a 20 20 66 74 73 35  none_eof:.  fts5
e930: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
e940: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74  r->pLeaf);.  pIt
e950: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d  er->pLeaf = 0;.}
e960: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  .../*.** Advance
e970: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
e980: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
e990: 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  y. .**.** If an 
e9a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
e9b0: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
e9c0: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
e9d0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
e9e0: 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  It .** is not co
e9f0: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
ea00: 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
ea10: 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49  r reaches EOF. I
ea20: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
ea30: 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
ea40: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
ea50: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
ea60: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
ea70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ea80: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
ea90: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eab0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
eac0: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
ead0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
eae0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
eaf0: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
eb00: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  vance */.  int *
eb10: 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
eb20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
eb30: 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74  T: Set for new t
eb40: 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  erm */.){.  Fts5
eb50: 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
eb60: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e  ter->pLeaf;.  in
eb70: 74 20 69 4f 66 66 3b 0a 20 20 69 6e 74 20 62 4e  t iOff;.  int bN
eb80: 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 69 6e  ewTerm = 0;.  in
eb90: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75  t nKeep = 0;.  u
eba0: 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  8 *a;.  int n;..
ebb0: 20 20 61 73 73 65 72 74 28 20 70 62 4e 65 77 54    assert( pbNewT
ebc0: 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77  erm==0 || *pbNew
ebd0: 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Term==0 );.  ass
ebe0: 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ert( p->pConfig-
ebf0: 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
ec00: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20  ETAIL_NONE );.. 
ec10: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
ec20: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f  he end of the po
ec30: 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68  sition list with
ec40: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  in the current p
ec50: 61 67 65 2e 20 2a 2f 0a 20 20 61 20 3d 20 70 4c  age. */.  a = pL
ec60: 65 61 66 2d 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c  eaf->p;.  n = pL
ec70: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20  eaf->szLeaf;..  
ec80: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
ec90: 28 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66 66 20  (pLeaf);.  iOff 
eca0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
ecb0: 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50  fset + pIter->nP
ecc0: 6f 73 3b 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c  os;..  if( iOff<
ecd0: 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  n ){.    /* The 
ece0: 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  next entry is on
ecf0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ed00: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
ed10: 5f 6e 63 28 20 69 4f 66 66 3c 3d 70 49 74 65 72  _nc( iOff<=pIter
ed20: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
ed30: 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  );.    if( iOff>
ed40: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
ed50: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 62  clist ){.      b
ed60: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
ed70: 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73     if( iOff!=fts
ed80: 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
ed90: 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  f(pLeaf) ){.    
eda0: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
edb0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
edc0: 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
edd0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
ede0: 0a 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74  .      u64 iDelt
edf0: 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  a;.      iOff +=
ee00: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
ee10: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
ee20: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
ee30: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
ee40: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 61   iDelta;.      a
ee50: 73 73 65 72 74 5f 6e 63 28 20 69 44 65 6c 74 61  ssert_nc( iDelta
ee60: 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
ee70: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ee80: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 7d 65  et = iOff;..  }e
ee90: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
eea0: 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  Seg==0 ){.    co
eeb0: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
eec0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
eed0: 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20  r *zTerm = 0;.  
eee0: 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b    int nList = 0;
eef0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49  .    assert( (pI
ef00: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
ef10: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
ef20: 4d 29 20 7c 7c 20 70 62 4e 65 77 54 65 72 6d 20  M) || pbNewTerm 
ef30: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  );.    if( 0==(p
ef40: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
ef50: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
ef60: 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  RM) ){.      sql
ef70: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
ef80: 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a  Next(p->pHash);.
ef90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
efa0: 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
efb0: 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  ->pHash, &zTerm,
efc0: 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
efd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
efe0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
eff0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f000: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f010: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
f020: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  eaf = 0;.    }el
f030: 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  se{.      pIter-
f040: 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a  >pLeaf->p = (u8*
f050: 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49  )pList;.      pI
f060: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d  ter->pLeaf->nn =
f070: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
f080: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
f090: 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  af = nList;.    
f0a0: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
f0b0: 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 2b 31  oclist = nList+1
f0c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
f0d0: 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
f0e0: 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
f0f0: 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  m, (int)strlen(z
f100: 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20  Term),.         
f110: 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20   (u8*)zTerm);.  
f120: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f130: 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
f140: 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75  Varint(pList, (u
f150: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
f160: 69 64 29 3b 0a 20 20 20 20 20 20 2a 70 62 4e 65  id);.      *pbNe
f170: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d  wTerm = 1;.    }
f180: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4f  .  }else{.    iO
f190: 66 66 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e  ff = 0;.    /* N
f1a0: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  ext entry is not
f1b0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
f1c0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c  page */.    whil
f1d0: 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  e( iOff==0 ){.  
f1e0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
f1f0: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
f200: 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 20 3d  );.      pLeaf =
f210: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
f220: 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d       if( pLeaf==
f230: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
f240: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
f250: 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  K(pLeaf);.      
f260: 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35  if( (iOff = fts5
f270: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
f280: 66 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f 66  f(pLeaf)) && iOf
f290: 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f<pLeaf->szLeaf 
f2a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
f2b0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
f2c0: 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
f2d0: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
f2e0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
f2f0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
f300: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f310: 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  f;..        if( 
f320: 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d  pLeaf->nn>pLeaf-
f330: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
f340: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69       pIter->iPgi
f350: 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73  dxOff = pLeaf->s
f360: 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56  zLeaf + fts5GetV
f370: 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20  arint32(.       
f380: 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70         &pLeaf->p
f390: 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c  [pLeaf->szLeaf],
f3a0: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
f3b0: 63 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20  clist.          
f3c0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
f3d0: 0a 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ..      }.      
f3e0: 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d 3e  else if( pLeaf->
f3f0: 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  nn>pLeaf->szLeaf
f400: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
f410: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70  r->iPgidxOff = p
f420: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66  Leaf->szLeaf + f
f430: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a  ts5GetVarint32(.
f440: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65              &pLe
f450: 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c  af->p[pLeaf->szL
f460: 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20 20 20 20  eaf], iOff.     
f470: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
f480: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
f490: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
f4a0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
f4b0: 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 4f 66 66  ofDoclist = iOff
f4c0: 3b 0a 20 20 20 20 20 20 20 20 62 4e 65 77 54 65  ;.        bNewTe
f4d0: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rm = 1;.      }.
f4e0: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
f4f0: 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c   iOff<pLeaf->szL
f500: 65 61 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eaf );.      if(
f510: 20 69 4f 66 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c   iOff>pLeaf->szL
f520: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eaf ){.        p
f530: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
f540: 55 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74  UPT;.        ret
f550: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
f560: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
f570: 63 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ck if the iterat
f580: 6f 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46  or is now at EOF
f590: 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20  . If so, return 
f5a0: 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20  early. */.  if( 
f5b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
f5c0: 20 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d      if( bNewTerm
f5d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
f5e0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
f5f0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
f600: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  M ){.        fts
f610: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
f620: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
f630: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
f640: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
f650: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  e{.        fts5S
f660: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
f670: 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b  , pIter, nKeep);
f680: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
f690: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
f6a0: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
f6b0: 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20  if( pbNewTerm ) 
f6c0: 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a  *pbNewTerm = 1;.
f6d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
f6e0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
f6f0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20  following could 
f700: 62 65 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69  be done by calli
f710: 6e 67 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  ng fts5SegIterLo
f720: 61 64 4e 50 6f 73 28 29 2e 20 42 75 74 0a 20 20  adNPos(). But.  
f730: 20 20 20 20 2a 2a 20 74 68 69 73 20 62 6c 6f 63      ** this bloc
f740: 6b 20 69 73 20 70 61 72 74 69 63 75 6c 61 72 6c  k is particularl
f750: 79 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 63 72  y performance cr
f760: 69 74 69 63 61 6c 2c 20 73 6f 20 65 71 75 69 76  itical, so equiv
f770: 61 6c 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63  alent.      ** c
f780: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 2e 20  ode is inlined. 
f790: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
f7a0: 2a 2a 20 4c 61 74 65 72 3a 20 53 77 69 74 63 68  ** Later: Switch
f7b0: 65 64 20 62 61 63 6b 20 74 6f 20 66 74 73 35 53  ed back to fts5S
f7c0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29  egIterLoadNPos()
f7d0: 20 62 65 63 61 75 73 65 20 69 74 20 73 75 70 70   because it supp
f7e0: 6f 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  orts.      ** de
f7f0: 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20  tail=none mode. 
f800: 4e 6f 74 20 69 64 65 61 6c 2e 0a 20 20 20 20 20  Not ideal..     
f810: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53   */.      int nS
f820: 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
f830: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
f840: 4b 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 46  K );.      fts5F
f850: 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
f860: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20  Iter->pLeaf->p, 
f870: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f880: 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20  et, nSz);.      
f890: 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e  pIter->bDel = (n
f8a0: 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  Sz & 0x0001);.  
f8b0: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
f8c0: 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20  = nSz>>1;.      
f8d0: 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72  assert_nc( pIter
f8e0: 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20  ->nPos>=0 );.   
f8f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e   }.  }.}..#defin
f900: 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61 2c 20  e SWAPVAL(T, a, 
f910: 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d 70 3d  b) { T tmp; tmp=
f920: 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d  a; a=b; b=tmp; }
f930: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 49 6e  ..#define fts5In
f940: 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28 61 2c  dexSkipVarint(a,
f950: 20 69 4f 66 66 29 20 7b 20 20 20 20 20 20 20 20   iOff) {        
f960: 20 20 20 20 5c 0a 20 20 69 6e 74 20 69 45 6e 64      \.  int iEnd
f970: 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20 20 20 20   = iOff+9;      
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 20 20 20 20 20 5c 0a 20 20 77 68 69 6c          \.  whil
f9a0: 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d 20 26 20  e( (a[iOff++] & 
f9b0: 30 78 38 30 29 20 26 26 20 69 4f 66 66 3c 69 45  0x80) && iOff<iE
f9c0: 6e 64 20 29 3b 20 20 20 20 20 20 20 5c 0a 7d 0a  nd );       \.}.
f9d0: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
f9e0: 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
f9f0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
fa00: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64  rst rowid in a d
fa10: 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20  oclist. This.** 
fa20: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
fa30: 65 20 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f  e iterator up so
fa40: 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 69   that iterates i
fa50: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
fa60: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64  through.** the d
fa70: 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  oclist..*/.stati
fa80: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
fa90: 65 72 52 65 76 65 72 73 65 28 46 74 73 35 49 6e  erReverse(Fts5In
faa0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
fab0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
fac0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
fad0: 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
fae0: 6c 69 64 78 3b 0a 20 20 46 74 73 35 44 61 74 61  lidx;.  Fts5Data
faf0: 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69   *pLast = 0;.  i
fb00: 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
fb10: 0a 0a 20 20 69 66 28 20 70 44 6c 69 64 78 20 29  ..  if( pDlidx )
fb20: 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64  {.    int iSegid
fb30: 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e   = pIter->pSeg->
fb40: 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e 6f  iSegid;.    pgno
fb50: 4c 61 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78  Last = fts5Dlidx
fb60: 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
fb70: 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74  ;.    pLast = ft
fb80: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
fb90: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
fba0: 28 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61 73  (iSegid, pgnoLas
fbb0: 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t));.  }else{.  
fbc0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
fbd0: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
fbe0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
fbf0: 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a  rent leaf data *
fc00: 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  /..    /* Curren
fc10: 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65 72  tly, Fts5SegIter
fc20: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69  .iLeafOffset poi
fc30: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
fc40: 20 62 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20   byte of.    ** 
fc50: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f  position-list co
fc60: 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75  ntent for the cu
fc70: 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63  rrent rowid. Bac
fc80: 6b 20 69 74 20 75 70 20 73 6f 20 74 68 61 74 20  k it up so that 
fc90: 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73  it.    ** points
fca0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
fcb0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
fcc0: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a  st size field. *
fcd0: 2f 0a 20 20 20 20 69 6e 74 20 69 50 6f 73 6c 69  /.    int iPosli
fce0: 73 74 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  st;.    if( pIte
fcf0: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
fd00: 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ==pIter->iLeafPg
fd10: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 69 50 6f 73  no ){.      iPos
fd20: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 69 54  list = pIter->iT
fd30: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ermLeafOffset;. 
fd40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd50: 69 50 6f 73 6c 69 73 74 20 3d 20 34 3b 0a 20 20  iPoslist = 4;.  
fd60: 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e 64 65    }.    fts5Inde
fd70: 78 53 6b 69 70 56 61 72 69 6e 74 28 70 4c 65 61  xSkipVarint(pLea
fd80: 66 2d 3e 70 2c 20 69 50 6f 73 6c 69 73 74 29 3b  f->p, iPoslist);
fd90: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
fda0: 66 4f 66 66 73 65 74 20 3d 20 69 50 6f 73 6c 69  fOffset = iPosli
fdb0: 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  st;..    /* If t
fdc0: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
fdd0: 20 74 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c   true then the l
fde0: 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72  argest rowid for
fdf0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
fe00: 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74   ** term may not
fe10: 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68   be stored on th
fe20: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
fe30: 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61 72  So search forwar
fe40: 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20  d to.    ** see 
fe50: 77 68 65 72 65 20 73 61 69 64 20 72 6f 77 69 64  where said rowid
fe60: 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a   really is.  */.
fe70: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
fe80: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3e 3d 70 4c  EndofDoclist>=pL
fe90: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
fea0: 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20       int pgno;. 
feb0: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
fec0: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
fed0: 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a  = pIter->pSeg;..
fee0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73        /* The las
fef0: 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64  t rowid in the d
ff00: 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62  oclist may not b
ff10: 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e on the current
ff20: 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20   page. Search.  
ff30: 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74      ** forward t
ff40: 6f 20 66 69 6e 64 20 74 68 65 20 70 61 67 65 20  o find the page 
ff50: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
ff60: 61 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20  ast rowid.  */. 
ff70: 20 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49       for(pgno=pI
ff80: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31  ter->iLeafPgno+1
ff90: 3b 20 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f  ; !p->rc && pgno
ffa0: 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  <=pSeg->pgnoLast
ffb0: 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20  ; pgno++){.     
ffc0: 20 20 20 69 36 34 20 69 41 62 73 20 3d 20 46 54     i64 iAbs = FT
ffd0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
ffe0: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
fff0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74  gno);.        Ft
10000 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66  s5Data *pNew = f
10010 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
10020 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Abs);.        if
10030 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
10040 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20      int iRowid, 
10050 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20 20 20  bTermless;.     
10060 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74       iRowid = ft
10070 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
10080 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  Off(pNew);.     
10090 20 20 20 20 20 62 54 65 72 6d 6c 65 73 73 20 3d       bTermless =
100a0 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
100b0 65 73 73 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ess(pNew);.     
100c0 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 20       if( iRowid 
100d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
100e0 57 41 50 56 41 4c 28 46 74 73 35 44 61 74 61 2a  WAPVAL(Fts5Data*
100f0 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a  , pNew, pLast);.
10100 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f              pgno
10110 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Last = pgno;.   
10120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10130 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
10140 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  se(pNew);.      
10150 20 20 20 20 69 66 28 20 62 54 65 72 6d 6c 65 73      if( bTermles
10160 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s==0 ) break;.  
10170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10180 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10190 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c  If pLast is NULL
101a0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
101b0 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
101c0 77 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63  wid for this doc
101d0 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f  list.  ** lies o
101e0 6e 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  n the page curre
101f0 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
10200 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20  y the iterator. 
10210 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20 20  In this case .  
10220 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  ** pIter->iLeafO
10230 66 66 73 65 74 20 69 73 20 61 6c 72 65 61 64 79  ffset is already
10240 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
10250 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
10260 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65  st size.  ** fie
10270 6c 64 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ld associated wi
10280 74 68 20 74 68 65 20 66 69 72 73 74 20 72 65 6c  th the first rel
10290 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74  evant rowid on t
102a0 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  he page..  **.  
102b0 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73 74 20  ** Or, if pLast 
102c0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
102d0 6e 20 69 74 20 69 73 20 74 68 65 20 70 61 67 65  n it is the page
102e0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
102f0 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77  he last.  ** row
10300 69 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  id. In this case
10310 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69   configure the i
10320 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
10330 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
10340 0a 20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69  .  ** first rowi
10350 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 0a  d on this page..
10360 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74    */.  if( pLast
10370 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
10380 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
10390 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
103a0 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
103b0 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20  pLeaf = pLast;. 
103c0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
103d0 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a  gno = pgnoLast;.
103e0 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c      iOff = fts5L
103f0 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
10400 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 69 4f 66  (pLast);.    iOf
10410 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
10420 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66  nt(&pLast->p[iOf
10430 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
10440 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  ->iRowid);.    p
10450 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10460 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 69  t = iOff;..    i
10470 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  f( fts5LeafIsTer
10480 6d 6c 65 73 73 28 70 4c 61 73 74 29 20 29 7b 0a  mless(pLast) ){.
10490 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
104a0 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 61  dofDoclist = pLa
104b0 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65  st->nn+1;.    }e
104c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72  lse{.      pIter
104d0 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
104e0 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  = fts5LeafFirstT
104f0 65 72 6d 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20  ermOff(pLast);. 
10500 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74 73     }..  }..  fts
10510 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
10520 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
10530 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  );.}../*.** Iter
10540 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
10550 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
10560 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
10570 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20  f a doclist..** 
10580 54 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  There is a docli
10590 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61  st-index associa
105a0 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6e  ted with the fin
105b0 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 63  al term on the c
105c0 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e  urrent .** page.
105d0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
105e0 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74  term is the last
105f0 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70 61 67   term on the pag
10600 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20  e, load the .** 
10610 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72  doclist-index fr
10620 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e 69 74  om disk and init
10630 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74  ialize an iterat
10640 6f 72 20 61 74 20 28 70 49 74 65 72 2d 3e 70 44  or at (pIter->pD
10650 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lidx)..*/.static
10660 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
10670 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49  rLoadDlidx(Fts5I
10680 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
10690 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
106a0 69 6e 74 20 69 53 65 67 20 3d 20 70 49 74 65 72  int iSeg = pIter
106b0 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
106c0 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
106d0 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
106e0 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
106f0 45 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  E);.  Fts5Data *
10700 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
10710 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74  Leaf; /* Current
10720 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20   leaf data */.. 
10730 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
10740 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
10750 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
10760 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
10770 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20  >pDlidx==0 );.. 
10780 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
10790 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
107a0 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61   ends on this pa
107b0 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ge. If it does, 
107c0 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c  return.  ** earl
107d0 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e  y without loadin
107e0 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  g the doclist-in
107f0 64 65 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e  dex (as it belon
10800 67 73 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  gs to a differen
10810 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a  t.  ** term. */.
10820 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
10830 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  rmLeafPgno==pIte
10840 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 0a 20 20  r->iLeafPgno .  
10850 20 26 26 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f   && pIter->iEndo
10860 66 44 6f 63 6c 69 73 74 3c 70 4c 65 61 66 2d 3e  fDoclist<pLeaf->
10870 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a 20 20 20  szLeaf .  ){.   
10880 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
10890 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20  pIter->pDlidx = 
108a0 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
108b0 74 28 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c  t(p, bRev, iSeg,
108c0 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
108d0 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  fPgno);.}../*.**
108e0 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   The iterator ob
108f0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
10900 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
10910 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  nt currently con
10920 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69  tains.** no vali
10930 64 20 76 61 6c 75 65 73 20 65 78 63 65 70 74 20  d values except 
10940 66 6f 72 20 74 68 65 20 46 74 73 35 53 65 67 49  for the Fts5SegI
10950 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62 65 72  ter.pLeaf member
10960 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 0a   variable. This.
10970 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  ** function sear
10980 63 68 65 73 20 74 68 65 20 6c 65 61 66 20 70 61  ches the leaf pa
10990 67 65 20 66 6f 72 20 61 20 74 65 72 6d 20 6d 61  ge for a term ma
109a0 74 63 68 69 6e 67 20 28 70 54 65 72 6d 2f 6e 54  tching (pTerm/nT
109b0 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  erm)..**.** If t
109c0 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
109d0 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20 74 68  m is found on th
109e0 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
109f0 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
10a00 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t.** pointing to
10a10 20 69 74 2e 20 49 66 20 61 72 67 75 6d 65 6e 74   it. If argument
10a20 20 62 47 65 20 69 73 20 7a 65 72 6f 20 61 6e 64   bGe is zero and
10a30 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
10a40 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65 20 69   found,.** the i
10a50 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
10a60 70 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f 46 2e  pointing at EOF.
10a70 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20 69 73  .**.** If bGe is
10a80 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
10a90 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
10aa0 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
10ab0 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  hen the.** itera
10ac0 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
10ad0 74 69 6e 67 20 74 6f 20 74 68 65 20 73 6d 61 6c  ting to the smal
10ae0 6c 65 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  lest term in the
10af0 20 73 65 67 6d 65 6e 74 20 74 68 61 74 0a 2a 2a   segment that.**
10b00 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
10b10 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
10b20 72 6d 2c 20 65 76 65 6e 20 69 66 20 74 68 69 73  rm, even if this
10b30 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f 6e 20   term is not on 
10b40 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70  the.** current p
10b50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
10b60 6f 69 64 20 66 74 73 35 4c 65 61 66 53 65 65 6b  oid fts5LeafSeek
10b70 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
10b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10b90 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79      /* Leave any
10ba0 20 65 72 72 6f 72 20 63 6f 64 65 20 68 65 72 65   error code here
10bb0 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c 20 20   */.  int bGe,  
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
10be0 72 20 61 20 3e 3d 20 73 65 61 72 63 68 20 2a 2f  r a >= search */
10bf0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
10c00 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
10c10 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
10c20 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73  o seek */.  cons
10c30 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
10c40 20 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 54   nTerm      /* T
10c50 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66 6f  erm to search fo
10c60 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f  r */.){.  int iO
10c70 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ff;.  const u8 *
10c80 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
10c90 2d 3e 70 3b 0a 20 20 69 6e 74 20 73 7a 4c 65 61  ->p;.  int szLea
10ca0 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
10cb0 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20  ->szLeaf;.  int 
10cc0 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
10cd0 2d 3e 6e 6e 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61  ->nn;..  int nMa
10ce0 74 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  tch = 0;.  int n
10cf0 4b 65 65 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Keep = 0;.  int 
10d00 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nNew = 0;.  int 
10d10 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 6e 74 20  iTermOff;.  int 
10d20 69 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20  iPgidx;         
10d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10d40 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e  urrent offset in
10d50 20 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20   pgidx */.  int 
10d60 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 30 3b 0a  bEndOfPage = 0;.
10d70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
10d80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
10d90 20 20 69 50 67 69 64 78 20 3d 20 73 7a 4c 65 61    iPgidx = szLea
10da0 66 3b 0a 20 20 69 50 67 69 64 78 20 2b 3d 20 66  f;.  iPgidx += f
10db0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
10dc0 61 5b 69 50 67 69 64 78 5d 2c 20 69 54 65 72 6d  a[iPgidx], iTerm
10dd0 4f 66 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 69  Off);.  iOff = i
10de0 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 77 68 69 6c  TermOff;..  whil
10df0 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
10e00 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
10e10 61 6e 79 20 6e 65 77 20 62 79 74 65 73 20 61 72  any new bytes ar
10e20 65 20 69 6e 20 74 68 69 73 20 74 65 72 6d 20 2a  e in this term *
10e30 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74 47 65  /.    fts5FastGe
10e40 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66  tVarint32(a, iOf
10e50 66 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66  f, nNew);.    if
10e60 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29  ( nKeep<nMatch )
10e70 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61  {.      goto sea
10e80 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  rch_failed;.    
10e90 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  }..    assert( n
10ea0 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a  Keep>=nMatch );.
10eb0 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3d 3d 6e      if( nKeep==n
10ec0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 69  Match ){.      i
10ed0 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 20 20 69  nt nCmp;.      i
10ee0 6e 74 20 69 3b 0a 20 20 20 20 20 20 6e 43 6d 70  nt i;.      nCmp
10ef0 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20 6e 54 65   = MIN(nNew, nTe
10f00 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20 20 20  rm-nMatch);.    
10f10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6d    for(i=0; i<nCm
10f20 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
10f30 20 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d 21 3d   if( a[iOff+i]!=
10f40 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20  pTerm[nMatch+i] 
10f50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
10f60 0a 20 20 20 20 20 20 6e 4d 61 74 63 68 20 2b 3d  .      nMatch +=
10f70 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e   i;..      if( n
10f80 54 65 72 6d 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a  Term==nMatch ){.
10f90 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e          if( i==n
10fa0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
10fb0 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 73 75 63   goto search_suc
10fc0 63 65 73 73 3b 0a 20 20 20 20 20 20 20 20 7d 65  cess;.        }e
10fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
10fe0 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65  oto search_faile
10ff0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
11000 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3c 6e     }else if( i<n
11010 4e 65 77 20 26 26 20 61 5b 69 4f 66 66 2b 69 5d  New && a[iOff+i]
11020 3e 70 54 65 72 6d 5b 6e 4d 61 74 63 68 5d 20 29  >pTerm[nMatch] )
11030 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
11040 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20  earch_failed;.  
11050 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11060 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29   if( iPgidx>=n )
11070 7b 0a 20 20 20 20 20 20 62 45 6e 64 4f 66 50 61  {.      bEndOfPa
11080 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  ge = 1;.      br
11090 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
110a0 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
110b0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
110c0 69 64 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  idx], nKeep);.  
110d0 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b    iTermOff += nK
110e0 65 65 70 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20  eep;.    iOff = 
110f0 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 2f  iTermOff;..    /
11100 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65 65 70  * Read the nKeep
11110 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65   field of the ne
11120 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  xt term. */.    
11130 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
11140 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4b 65  t32(a, iOff, nKe
11150 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  ep);.  }.. searc
11160 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  h_failed:.  if( 
11170 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  bGe==0 ){.    ft
11180 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
11190 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
111a0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
111b0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  0;.    return;. 
111c0 20 7d 65 6c 73 65 20 69 66 28 20 62 45 6e 64 4f   }else if( bEndO
111d0 66 50 61 67 65 20 29 7b 0a 20 20 20 20 64 6f 20  fPage ){.    do 
111e0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
111f0 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
11200 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Iter);.      if(
11210 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
11220 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
11230 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   a = pIter->pLea
11240 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66 28 20  f->p;.      if( 
11250 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
11260 73 73 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ss(pIter->pLeaf)
11270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
11280 50 67 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Pgidx = pIter->p
11290 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
112a0 20 20 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20        iPgidx += 
112b0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
112c0 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
112d0 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66 66 29 3b  [iPgidx], iOff);
112e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
112f0 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70 49 74  f<4 || iOff>=pIt
11300 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
11310 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
11320 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
11330 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  UPT;.        }el
11340 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4b  se{.          nK
11350 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eep = 0;.       
11360 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 69 4f     iTermOff = iO
11370 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20  ff;.          n 
11380 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
11390 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  nn;.          iO
113a0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
113b0 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
113c0 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  nNew);.         
113d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
113e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
113f0 68 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a  hile( 1 );.  }..
11400 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73 3a   search_success:
11410 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ..  pIter->iLeaf
11420 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20 2b 20  Offset = iOff + 
11430 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69  nNew;.  pIter->i
11440 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d  TermLeafOffset =
11450 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
11460 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54  set;.  pIter->iT
11470 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49  ermLeafPgno = pI
11480 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  ter->iLeafPgno;.
11490 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74  .  fts5BufferSet
114a0 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
114b0 3e 74 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54  >term, nKeep, pT
114c0 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66  erm);.  fts5Buff
114d0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
114e0 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
114f0 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66  m, nNew, &a[iOff
11500 5d 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 69 64  ]);..  if( iPgid
11510 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  x>=n ){.    pIte
11520 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
11530 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
11540 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >nn+1;.  }else{.
11550 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a      int nExtra;.
11560 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74      iPgidx += ft
11570 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
11580 5b 69 50 67 69 64 78 5d 2c 20 6e 45 78 74 72 61  [iPgidx], nExtra
11590 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45  );.    pIter->iE
115a0 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 54  ndofDoclist = iT
115b0 65 72 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61 3b  ermOff + nExtra;
115c0 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 50  .  }.  pIter->iP
115d0 67 69 64 78 4f 66 66 20 3d 20 69 50 67 69 64 78  gidxOff = iPgidx
115e0 3b 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  ;..  fts5SegIter
115f0 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74  LoadRowid(p, pIt
11600 65 72 29 3b 0a 20 20 66 74 73 35 53 65 67 49 74  er);.  fts5SegIt
11610 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
11620 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ter);.}../*.** I
11630 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62  nitialize the ob
11640 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f  ject pIter to po
11650 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72  int to term pTer
11660 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73  m/nTerm within s
11670 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20  egment.** pSeg. 
11680 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
11690 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
116a0 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72 61  index, the itera
116b0 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f  tor is set to EO
116c0 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  F..**.** If an e
116d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
116e0 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
116f0 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
11700 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
11710 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
11720 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
11730 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
11740 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11750 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
11760 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11770 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
11780 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
11790 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
117a0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
117b0 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  ackend */.  cons
117c0 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
117d0 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
117e0 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a  erm to seek to *
117f0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
11820 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61  TS5INDEX_XXX fla
11830 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  gs */.  Fts5Stru
11840 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
11850 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  eg,     /* Descr
11860 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e  iption of segmen
11870 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
11880 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
11890 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
118a0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
118b0 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20 31  ){.  int iPg = 1
118c0 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28 66  ;.  int bGe = (f
118d0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
118e0 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20  _QUERY_SCAN);.  
118f0 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b 20  int bDlidx = 0; 
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
11920 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
11930 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dex */..  assert
11940 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61  ( bGe==0 || (fla
11950 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
11960 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b  UERY_DESC)==0 );
11970 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d  .  assert( pTerm
11980 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d   && nTerm );.  m
11990 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
119a0 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
119b0 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d  .  pIter->pSeg =
119c0 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54 68 69   pSeg;..  /* Thi
119d0 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74 61  s block sets sta
119e0 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67 20  ck variable iPg 
119f0 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  to the leaf page
11a00 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 79   number that may
11a10 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65  .  ** contain te
11a20 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  rm (pTerm/nTerm)
11a30 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
11a40 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  nt in the segmen
11a50 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
11a60 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  IdxSelect==0 ){.
11a70 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
11a80 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
11a90 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e  nfig;.    fts5In
11aa0 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
11ab0 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  , &p->pIdxSelect
11ac0 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
11ad0 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  f(.          "SE
11ae0 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 27  LECT pgno FROM '
11af0 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45  %q'.'%q_idx' WHE
11b00 52 45 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  RE ".          "
11b10 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65 72 6d  segid=? AND term
11b20 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74 65 72  <=? ORDER BY ter
11b30 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c  m DESC LIMIT 1",
11b40 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
11b50 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
11b60 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
11b70 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 20    }.  if( p->rc 
11b80 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
11b90 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
11ba0 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20 70  pIdxSelect, 1, p
11bb0 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20  Seg->iSegid);.  
11bc0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
11bd0 62 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c  b(p->pIdxSelect,
11be0 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d   2, pTerm, nTerm
11bf0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
11c00 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52  ;.  if( SQLITE_R
11c10 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
11c20 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 20  (p->pIdxSelect) 
11c30 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 20 3d  ){.    i64 val =
11c40 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11c50 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  int(p->pIdxSelec
11c60 74 2c 20 30 29 3b 0a 20 20 20 20 69 50 67 20 3d  t, 0);.    iPg =
11c70 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29 3b 0a   (int)(val>>1);.
11c80 20 20 20 20 62 44 6c 69 64 78 20 3d 20 28 76 61      bDlidx = (va
11c90 6c 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 7d  l & 0x0001);.  }
11ca0 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
11cb0 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78  e3_reset(p->pIdx
11cc0 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66 28 20  Select);..  if( 
11cd0 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  iPg<pSeg->pgnoFi
11ce0 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d  rst ){.    iPg =
11cf0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
11d00 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30  ;.    bDlidx = 0
11d10 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  ;.  }..  pIter->
11d20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20  iLeafPgno = iPg 
11d30 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74  - 1;.  fts5SegIt
11d40 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
11d50 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74  ter);..  if( pIt
11d60 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
11d70 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70 2c   fts5LeafSeek(p,
11d80 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54 65   bGe, pIter, pTe
11d90 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a  rm, nTerm);.  }.
11da0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
11db0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d  LITE_OK && bGe==
11dc0 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  0 ){.    pIter->
11dd0 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
11de0 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
11df0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
11e00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28  eaf ){.      if(
11e10 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
11e20 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
11e30 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
11e40 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
11e50 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
11e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11e70 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20   bDlidx ){.     
11e80 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
11e90 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65 72  adDlidx(p, pIter
11ea0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11eb0 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
11ec0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
11ed0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  C ){.        fts
11ee0 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
11ef0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
11f00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
11f10 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
11f20 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  xt(p, pIter);.. 
11f30 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a   /* Either:.  **
11f40 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72  .  **   1) an er
11f50 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
11f60 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74  , or.  **   2) t
11f70 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
11f80 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20  ts to EOF, or.  
11f90 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72  **   3) the iter
11fa0 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ator points to a
11fb0 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72  n entry with ter
11fc0 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
11fd0 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68   or.  **   4) th
11fe0 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
11ff0 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20  Y_SCAN flag was 
12000 73 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72  set and the iter
12010 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  ator points.  **
12020 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72        to an entr
12030 79 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72  y with a term gr
12040 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
12050 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54  ual to (pTerm/nT
12060 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  erm)..  */.  ass
12070 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
12080 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  TE_OK           
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
120b0 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74  * 1 */.   || pIt
120c0 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20  er->pLeaf==0    
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20             /* 2 
12100 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66  */.   || fts5Buf
12110 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
12120 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
12130 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20  rm, nTerm)==0   
12140 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20         /* 3 */. 
12150 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73    || (bGe && fts
12160 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
12170 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
12180 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30   pTerm, nTerm)>0
12190 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a  )  /* 4 */.  );.
121a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
121b0 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
121c0 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
121d0 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
121e0 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
121f0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
12200 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  able. If there i
12210 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
12220 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
12230 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
12240 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
12250 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
12260 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
12270 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
12280 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
12290 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
122a0 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
122b0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
122c0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
122d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
122e0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
122f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12300 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
12310 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
12320 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12330 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
12340 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ckend */.  const
12350 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
12360 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
12370 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
12380 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123a0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
123b0 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
123c0 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
123d0 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
123e0 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
123f0 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
12400 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  ){.  const u8 *p
12410 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  List = 0;.  int 
12420 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  nList = 0;.  con
12430 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20  st u8 *z = 0;.  
12440 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73  int n = 0;..  as
12450 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29  sert( p->pHash )
12460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
12470 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
12480 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
12490 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
124a0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
124b0 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
124c0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
124d0 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73  ScanInit(p->pHas
124e0 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
124f0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
12500 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
12510 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
12520 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
12530 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
12540 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
12550 20 28 7a 20 3f 20 28 69 6e 74 29 73 74 72 6c 65   (z ? (int)strle
12560 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  n((const char*)z
12570 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ) : 0);.  }else{
12580 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
12590 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
125a0 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73  R_ONETERM;.    s
125b0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75  qlite3Fts5HashQu
125c0 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63  ery(p->pHash, (c
125d0 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d  onst char*)pTerm
125e0 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c  , nTerm, &pList,
125f0 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20   &nList);.    z 
12600 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d  = pTerm;.    n =
12610 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69   nTerm;.  }..  i
12620 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
12630 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
12640 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
12650 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
12660 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
12670 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66  n, z);.    pLeaf
12680 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63   = fts5IdxMalloc
12690 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
126a0 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ata));.    if( p
126b0 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
126c0 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d  ;.    pLeaf->p =
126d0 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
126e0 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65   pLeaf->nn = pLe
126f0 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
12700 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  st;.    pIter->p
12710 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20  Leaf = pLeaf;.  
12720 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
12730 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
12740 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28  rint(pLeaf->p, (
12750 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
12760 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  wid);.    pIter-
12770 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
12780 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 20   pLeaf->nn;..   
12790 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
127a0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
127b0 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  C ){.      pIter
127c0 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
127d0 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b  SEGITER_REVERSE;
127e0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
127f0 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
12800 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
12810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
12820 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
12830 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
12840 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65   }.  }..  fts5Se
12850 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
12860 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
12870 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61 74   Zero the iterat
12880 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
12890 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
128a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
128b0 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
128c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
128d0 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  er){.  fts5Buffe
128e0 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65  rFree(&pIter->te
128f0 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52  rm);.  fts5DataR
12900 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
12910 65 61 66 29 3b 0a 20 20 66 74 73 35 44 61 74 61  eaf);.  fts5Data
12920 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
12930 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 66 74 73  NextLeaf);.  fts
12940 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
12950 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20  Iter->pDlidx);. 
12960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
12970 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
12980 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  t);.  memset(pIt
12990 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
129a0 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a  s5SegIter));.}..
129b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
129c0 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BUG../*.** This 
129d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
129e0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
129f0 62 69 67 20 61 73 73 65 72 74 28 29 20 70 72 6f  big assert() pro
12a00 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74  cedure implement
12a10 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41 73 73  ed by.** fts5Ass
12a20 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
12a30 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65 73 20  p(). It ensures 
12a40 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
12a50 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
12a60 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69 73 20  .** in *pRes is 
12a70 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
12a80 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
12a90 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
12aa0 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tions of the.** 
12ab0 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  two iterators..*
12ac0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
12ad0 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73  s5AssertComparis
12ae0 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74 73 35  onResult(.  Fts5
12af0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
12b00 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 2c  Fts5SegIter *p1,
12b10 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
12b20 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73 75 6c  p2,.  Fts5CResul
12b30 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74  t *pRes.){.  int
12b40 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74 65 72   i1 = p1 - pIter
12b50 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20 69 32  ->aSeg;.  int i2
12b60 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d 3e 61   = p2 - pIter->a
12b70 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e  Seg;..  if( p1->
12b80 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65  pLeaf || p2->pLe
12b90 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31  af ){.    if( p1
12ba0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
12bb0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12bc0 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
12bd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32      }else if( p2
12be0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
12bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
12c00 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a  ->iFirst==i1 );.
12c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12c20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28   int nMin = MIN(
12c30 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e  p1->term.n, p2->
12c40 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69  term.n);.      i
12c50 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
12c60 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e  p1->term.p, p2->
12c70 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20  term.p, nMin);. 
12c80 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
12c90 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d  ) res = p1->term
12ca0 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b  .n - p2->term.n;
12cb0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ..      if( res=
12cc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
12cd0 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
12ce0 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  mEq==1 );.      
12cf0 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e 69 52    assert( p1->iR
12d00 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64  owid!=p2->iRowid
12d10 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20   );.        res 
12d20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e  = ((p1->iRowid >
12d30 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49   p2->iRowid)==pI
12d40 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20  ter->bRev) ? -1 
12d50 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : 1;.      }else
12d60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
12d70 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
12d80 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
12d90 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
12da0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
12db0 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d  ( pRes->iFirst==
12dc0 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  i1 );.      }els
12dd0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
12de0 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
12df0 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  =i2 );.      }. 
12e00 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12e10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12e20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
12e30 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  s SQLITE_DEBUG i
12e40 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74  s defined when t
12e50 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73  his module.** is
12e60 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68   compiled. In th
12e70 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 66 75  at case, this fu
12e80 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65 6e 74  nction is essent
12e90 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72 74 28  ially an assert(
12ea0 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ) .** statement 
12eb0 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  used to verify t
12ec0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
12ed0 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
12ee0 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a  First[] array.**
12ef0 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f   are correct..*/
12f00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
12f10 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
12f20 53 65 74 75 70 28 46 74 73 35 49 6e 64 65 78 20  Setup(Fts5Index 
12f30 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
12f40 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
12f50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12f60 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
12f70 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74 65 72  *pFirst = &pIter
12f80 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
12f90 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
12fa0 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ];.    int i;.. 
12fb0 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
12fc0 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70  st->pLeaf==0)==p
12fd0 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20  Iter->base.bEof 
12fe0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
12ff0 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69 53 77   that pIter->iSw
13000 69 74 63 68 52 6f 77 69 64 20 69 73 20 73 65 74  itchRowid is set
13010 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
13020 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
13030 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
13040 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13050 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13060 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20  >aSeg[i];.      
13070 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46 69 72  assert( p1==pFir
13080 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  st .           |
13090 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a  | p1->pLeaf==0 .
130a0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 74             || ft
130b0 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
130c0 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26  &pFirst->term, &
130d0 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20 20  p1->term) .     
130e0 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f        || p1->iRo
130f0 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69  wid==pIter->iSwi
13100 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20 20 20  tchRowid.       
13110 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77      || (p1->iRow
13120 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63  id<pIter->iSwitc
13130 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  hRowid)==pIter->
13140 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a 20 20  bRev.      );.  
13150 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
13160 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
13170 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74   i+=2){.      Ft
13180 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
13190 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
131a0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
131b0 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d  er *p2 = &pIter-
131c0 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20  >aSeg[i+1];.    
131d0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
131e0 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
131f0 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65  irst[(pIter->nSe
13200 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20  g + i) / 2];.   
13210 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d     fts5AssertCom
13220 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49  parisonResult(pI
13230 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65  ter, p1, p2, pRe
13240 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  s);.    }..    f
13250 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74 65 72  or(i=1; i<(pIter
13260 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d  ->nSeg / 2); i+=
13270 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
13280 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
13290 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
132a0 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69  >aFirst[i*2].iFi
132b0 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73  rst ];.      Fts
132c0 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26  5SegIter *p2 = &
132d0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
132e0 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31  er->aFirst[i*2+1
132f0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
13300 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
13310 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
13320 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66  irst[i];.      f
13330 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
13340 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
13350 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
13360 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
13370 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 41  e.# define fts5A
13380 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
13390 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  tup(x,y).#endif.
133a0 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f  ./*.** Do the co
133b0 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61  mparison necessa
133c0 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70  ry to populate p
133d0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
133e0 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  t]..**.** If the
133f0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
13400 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
13410 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65  n it is the inde
13420 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  x of an entry.**
13430 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
13440 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74  Seg[] array that
13450 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45   is (a) not at E
13460 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e  OF, and (b) poin
13470 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79  ting.** to a key
13480 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69   that is a dupli
13490 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c  cate of another,
134a0 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79   higher priority
134b0 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74  , .** segment-it
134c0 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53  erator in the pS
134d0 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  eg->aSeg[] array
134e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
13500 6f 6d 70 61 72 65 28 46 74 73 35 49 74 65 72 20  ompare(Fts5Iter 
13510 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74  *pIter, int iOut
13520 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20  ){.  int i1;    
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13550 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   left-hand Fts5S
13560 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
13570 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i2;             
13580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13590 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61  ndex of right-ha
135a0 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
135b0 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20  /.  int iRes;.  
135c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b  Fts5SegIter *p1;
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73  /* Left-hand Fts
135f0 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
13600 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20  s5SegIter *p2;  
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13620 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   Right-hand Fts5
13630 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73  SegIter */.  Fts
13640 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
13650 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
13660 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iOut];..  assert
13670 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53  ( iOut<pIter->nS
13680 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a  eg && iOut>0 );.
13690 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
136a0 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65  >bRev==0 || pIte
136b0 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20  r->bRev==1 );.. 
136c0 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65   if( iOut>=(pIte
136d0 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20  r->nSeg/2) ){.  
136e0 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70    i1 = (iOut - p
136f0 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20  Iter->nSeg/2) * 
13700 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b  2;.    i2 = i1 +
13710 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
13720 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69   i1 = pIter->aFi
13730 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72  rst[iOut*2].iFir
13740 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74  st;.    i2 = pIt
13750 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
13760 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d  2+1].iFirst;.  }
13770 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  .  p1 = &pIter->
13780 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d  aSeg[i1];.  p2 =
13790 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32   &pIter->aSeg[i2
137a0 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72  ];..  pRes->bTer
137b0 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  mEq = 0;.  if( p
137c0 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  1->pLeaf==0 ){  
137d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
137e0 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  1 is at EOF */. 
137f0 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
13800 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
13810 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a  eaf==0 ){     /*
13820 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f 46   If p2 is at EOF
13830 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
13840 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
13850 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42 75  int res = fts5Bu
13860 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d  fferCompare(&p1-
13870 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d  >term, &p2->term
13880 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  );.    if( res==
13890 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
138a0 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20  t( i2>i1 );.    
138b0 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30 20    assert( i2!=0 
138c0 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62  );.      pRes->b
138d0 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20  TermEq = 1;.    
138e0 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64    if( p1->iRowid
138f0 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ==p2->iRowid ){.
13900 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c          p1->bDel
13910 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20   = p2->bDel;.   
13920 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a       return i2;.
13930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
13940 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
13950 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
13960 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
13970 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  1 : +1;.    }.  
13980 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30    assert( res!=0
13990 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c   );.    if( res<
139a0 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20  0 ){.      iRes 
139b0 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = i1;.    }else{
139c0 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 32  .      iRes = i2
139d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
139e0 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75  Res->iFirst = (u
139f0 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74 75 72  16)iRes;.  retur
13a00 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  n 0;.}../*.** Mo
13a10 76 65 20 74 68 65 20 73 65 67 2d 69 74 65 72 20  ve the seg-iter 
13a20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
13a30 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
13a40 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c 65  owid on page iLe
13a50 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73  afPgno..** It is
13a60 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65 61   an error if lea
13a70 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73  f iLeafPgno does
13a80 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
13a90 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73  ntains no rowids
13aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13ab0 20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f   fts5SegIterGoto
13ac0 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
13ad0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
13ae0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
13af0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
13b00 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
13b10 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
13b20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
13b30 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
13b40 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b  int iLeafPgno.){
13b50 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66  .  assert( iLeaf
13b60 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
13b70 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20  fPgno );..  if( 
13b80 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
13b90 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  >pSeg->pgnoLast 
13ba0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
13bb0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  TS5_CORRUPT;.  }
13bc0 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44 61  else{.    fts5Da
13bd0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
13be0 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20  >pNextLeaf);.   
13bf0 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
13c00 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72  f = 0;.    pIter
13c10 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c  ->iLeafPgno = iL
13c20 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66  eafPgno-1;.    f
13c30 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
13c40 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
13c50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
13c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49  =SQLITE_OK || pI
13c70 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d  ter->iLeafPgno==
13c80 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
13c90 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13ca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13cb0 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
13cc0 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
13cd0 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
13ce0 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
13cf0 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20  eaf->szLeaf;..  
13d00 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c      iOff = fts5L
13d10 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
13d20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
13d30 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34        if( iOff<4
13d40 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20   || iOff>=n ){. 
13d50 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
13d60 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
13d70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13d80 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
13d90 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
13da0 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
13db0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
13dc0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
13dd0 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
13de0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
13df0 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
13e00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13e10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
13e20 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
13e30 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
13e40 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13e50 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20   until it is at 
13e60 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69  or .** past rowi
13e70 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c  d iFrom. Regardl
13e80 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
13e90 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69   of iFrom, the i
13ea0 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c  terator is.** al
13eb0 77 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74  ways advanced at
13ec0 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a   least once..*/.
13ed0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
13ee0 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
13ef0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
13f20 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
13f30 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
13f40 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
13f50 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
13f60 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69  vance */.  i64 i
13f70 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20  Match           
13f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
13f90 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61  vance iterator a
13fa0 74 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72  t least this far
13fb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65   */.){.  int bRe
13fc0 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  v = (pIter->flag
13fd0 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
13fe0 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73  _REVERSE);.  Fts
13ff0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
14000 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69  dx = pIter->pDli
14010 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50  dx;.  int iLeafP
14020 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
14030 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d  afPgno;.  int bM
14040 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  ove = 1;..  asse
14050 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
14060 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
14070 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
14080 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
14090 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dx );.  assert( 
140a0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a  pIter->pLeaf );.
140b0 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29  .  if( bRev==0 )
140c0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74  {.    while( !ft
140d0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
140e0 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61  , pDlidx) && iMa
140f0 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65  tch>fts5DlidxIte
14100 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
14110 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e  {.      iLeafPgn
14120 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
14130 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
14140 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
14150 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78  erNext(p, pDlidx
14160 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
14170 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e  ert_nc( iLeafPgn
14180 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o>=pIter->iLeafP
14190 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a  gno || p->rc );.
141a0 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
141b0 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o>pIter->iLeafPg
141c0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  no ){.      fts5
141d0 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28  SegIterGotoPage(
141e0 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50  p, pIter, iLeafP
141f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76  gno);.      bMov
14200 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
14210 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
14220 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
14230 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  af==0 );.    ass
14240 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65  ert( iMatch<pIte
14250 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  r->iRowid );.   
14260 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69   while( !fts5Dli
14270 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
14280 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66  idx) && iMatch<f
14290 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
142a0 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20  d(pDlidx) ){.   
142b0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
142c0 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b  Prev(p, pDlidx);
142d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66  .    }.    iLeaf
142e0 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  Pgno = fts5Dlidx
142f0 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
14300 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  ;..    assert( f
14310 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
14320 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c  p, pDlidx) || iL
14330 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e  eafPgno<=pIter->
14340 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
14350 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c    if( iLeafPgno<
14360 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14370 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
14380 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
14390 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20  afPgno+1;.      
143a0 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
143b0 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
143c0 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  er);.      bMove
143d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
143e0 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 62  .  do{.    if( b
143f0 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53  Move && p->rc==S
14400 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49 74 65 72  QLITE_OK ) pIter
14410 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49 74 65 72  ->xNext(p, pIter
14420 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49  , 0);.    if( pI
14430 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  ter->pLeaf==0 ) 
14440 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
14450 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d  Rev==0 && pIter-
14460 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20  >iRowid>=iMatch 
14470 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
14480 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74 65   bRev!=0 && pIte
14490 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63  r->iRowid<=iMatc
144a0 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62  h ) break;.    b
144b0 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69  Move = 1;.  }whi
144c0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
144d0 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  E_OK );.}.../*.*
144e0 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72 61  * Free the itera
144f0 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
14500 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
14510 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
14520 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
14530 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35 49  tiIterFree(Fts5I
14540 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
14550 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
14560 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
14570 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
14580 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  g; i++){.      f
14590 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
145a0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29  &pIter->aSeg[i])
145b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
145c0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
145d0 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29  (pIter->pStruct)
145e0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
145f0 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73  Free(&pIter->pos
14600 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
14610 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
14620 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
14630 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
14640 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35  Advanced(.  Fts5
14650 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
14660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14670 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
14680 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
14690 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
146a0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
146b0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
146c0 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
146d0 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
146e0 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20   int iChanged,  
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
14710 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
14720 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  dvanced */.  int
14730 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20   iMinset        
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14750 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e  Minimum entry in
14760 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74   aFirst[] to set
14770 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
14780 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e    for(i=(pIter->
14790 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32  nSeg+iChanged)/2
147a0 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20  ; i>=iMinset && 
147b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
147c0 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e  ; i=i/2){.    in
147d0 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28  t iEq;.    if( (
147e0 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  iEq = fts5MultiI
147f0 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74  terDoCompare(pIt
14800 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20  er, i)) ){.     
14810 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
14820 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
14830 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 61 73  g[iEq];.      as
14840 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
14850 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
14860 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70  pSeg->xNext(p, p
14870 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Seg, 0);.      i
14880 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b   = pIter->nSeg +
14890 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iEq;.    }.  }.
148a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65  }../*.** Sub-ite
148b0 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64 20 6f  rator iChanged o
148c0 66 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  f iterator pIter
148d0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
148e0 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74 69 6c  dvanced. It stil
148f0 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  l.** points to t
14900 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74 68 6f  he same term tho
14910 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64 69 66  ugh - just a dif
14920 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20 54 68  ferent rowid. Th
14930 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
14940 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64 61 74  ttempts to updat
14950 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
14960 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69  f the pIter->aFi
14970 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c  rst[] accordingl
14980 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  y..** If it does
14990 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79   so successfully
149a0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
149b0 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a   Otherwise 1..**
149c0 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  .** If non-zero 
149d0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
149e0 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63   caller should c
149f0 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  all fts5MultiIte
14a00 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f  rAdvanced().** o
14a10 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  n the iterator i
14a20 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66 75 6e  nstead. That fun
14a30 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73  ction does the s
14a40 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e 65 2c  ame as this one,
14a50 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20   except.** that 
14a60 69 74 20 64 65 61 6c 73 20 77 69 74 68 20 6d 6f  it deals with mo
14a70 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 63  re complicated c
14a80 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ases as well..*/
14a90 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73   .static int fts
14aa0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
14ab0 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 74  eRowid(.  Fts5It
14ac0 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
14ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
14ae0 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20  rator to update 
14af0 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66  aFirst[] array f
14b00 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61  or */.  int iCha
14b10 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  nged,           
14b20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
14b30 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72   of sub-iterator
14b40 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a   just advanced *
14b50 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
14b60 2a 2a 70 70 46 69 72 73 74 0a 29 7b 0a 20 20 46  **ppFirst.){.  F
14b70 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77  ts5SegIter *pNew
14b80 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
14b90 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66  iChanged];..  if
14ba0 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
14bb0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
14bc0 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d  wid.   || (pNew-
14bd0 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69  >iRowid<pIter->i
14be0 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49  SwitchRowid)==pI
14bf0 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20  ter->bRev.  ){. 
14c00 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74     int i;.    Ft
14c10 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65  s5SegIter *pOthe
14c20 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
14c30 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30  [iChanged ^ 0x00
14c40 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  01];.    pIter->
14c50 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
14c60 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41  Iter->bRev ? SMA
14c70 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41  LLEST_INT64 : LA
14c80 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20  RGEST_INT64;.   
14c90 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
14ca0 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
14cb0 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20   1; i=i/2){.    
14cc0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
14cd0 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
14ce0 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20  irst[i];..      
14cf0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c  assert( pNew->pL
14d00 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eaf );.      ass
14d10 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d  ert( pRes->bTerm
14d20 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d  Eq==0 || pOther-
14d30 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20  >pLeaf );..     
14d40 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d   if( pRes->bTerm
14d50 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Eq ){.        if
14d60 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
14d70 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29  pOther->iRowid )
14d80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
14d90 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  rn 1;.        }e
14da0 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
14db0 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52  >iRowid>pNew->iR
14dc0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
14dd0 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
14de0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
14df0 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
14e00 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
14e10 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20  pNew = pOther;. 
14e20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
14e30 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
14e40 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  >pIter->iSwitchR
14e50 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
14e60 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
14e70 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
14e80 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
14e90 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
14ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
14eb0 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31  es->iFirst = (u1
14ec0 36 29 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d  6)(pNew - pIter-
14ed0 3e 61 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66  >aSeg);.      if
14ee0 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a  ( i==1 ) break;.
14ef0 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20  .      pOther = 
14f00 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
14f10 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20  ter->aFirst[i ^ 
14f20 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74 20 5d  0x0001].iFirst ]
14f30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
14f40 70 70 46 69 72 73 74 20 3d 20 70 4e 65 77 3b 0a  ppFirst = pNew;.
14f50 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
14f60 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 49 74  *.** Set the pIt
14f70 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61 62 6c  er->bEof variabl
14f80 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  e based on the s
14f90 74 61 74 65 20 6f 66 20 74 68 65 20 73 75 62 2d  tate of the sub-
14fa0 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
14fb0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
14fc0 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 46 74  ltiIterSetEof(Ft
14fd0 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
14fe0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14ff0 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
15000 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
15010 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
15020 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f   pIter->base.bEo
15030 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  f = pSeg->pLeaf=
15040 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69 53 77  =0;.  pIter->iSw
15050 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53 65 67  itchRowid = pSeg
15060 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  ->iRowid;.}../*.
15070 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
15080 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
15090 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49   entry. .**.** I
150a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
150b0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
150c0 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35   is left in Fts5
150d0 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73 20  Index.rc. It is 
150e0 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  not .** consider
150f0 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
15100 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
15110 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20 69  hes EOF, or if i
15120 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  t is already at 
15130 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68 69  .** EOF when thi
15140 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15150 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
15160 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
15170 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e  erNext(.  Fts5In
15180 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
15190 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e  ter *pIter,.  in
151a0 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t bFrom,        
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
151c0 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e   True if argumen
151d0 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64  t iFrom is valid
151e0 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20   */.  i64 iFrom 
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
15210 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72   at least as far
15220 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20   as this */.){. 
15230 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d 20   int bUseFrom = 
15240 62 46 72 6f 6d 3b 0a 20 20 77 68 69 6c 65 28 20  bFrom;.  while( 
15250 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15260 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 69 72   ){.    int iFir
15270 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  st = pIter->aFir
15280 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  st[1].iFirst;.  
15290 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
152a0 20 30 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49   0;.    Fts5SegI
152b0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
152c0 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d  er->aSeg[iFirst]
152d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
152e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
152f0 3b 0a 20 20 20 20 69 66 28 20 62 55 73 65 46 72  ;.    if( bUseFr
15300 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69  om && pSeg->pDli
15310 64 78 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  dx ){.      fts5
15320 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
15330 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b  p, pSeg, iFrom);
15340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15350 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c    pSeg->xNext(p,
15360 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d   pSeg, &bNewTerm
15370 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
15380 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
15390 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20   || bNewTerm .  
153a0 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49     || fts5MultiI
153b0 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
153c0 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 26  pIter, iFirst, &
153d0 70 53 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20  pSeg).    ){.   
153e0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
153f0 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65  Advanced(p, pIte
15400 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20  r, iFirst, 1);. 
15410 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
15420 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b  erSetEof(pIter);
15430 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70  .      pSeg = &p
15440 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
15450 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
15460 73 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st];.      if( p
15470 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  Seg->pLeaf==0 ) 
15480 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
15490 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c     fts5AssertMul
154a0 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70  tiIterSetup(p, p
154b0 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Iter);.    asser
154c0 74 28 20 70 53 65 67 3d 3d 26 70 49 74 65 72 2d  t( pSeg==&pIter-
154d0 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69  >aSeg[pIter->aFi
154e0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 20 26  rst[1].iFirst] &
154f0 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 3b  & pSeg->pLeaf );
15500 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
15510 62 53 6b 69 70 45 6d 70 74 79 3d 3d 30 20 7c 7c  bSkipEmpty==0 ||
15520 20 70 53 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20   pSeg->nPos ){. 
15530 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
15540 4f 75 74 70 75 74 73 28 70 49 74 65 72 2c 20 70  Outputs(pIter, p
15550 53 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Seg);.      retu
15560 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 55  rn;.    }.    bU
15570 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 7d 0a  seFrom = 0;.  }.
15580 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
15590 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
155a0 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  2(.  Fts5Index *
155b0 70 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a  p, .  Fts5Iter *
155c0 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62  pIter,.  int *pb
155d0 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20  NewTerm         
155e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
155f0 20 54 72 75 65 20 69 66 20 2a 6d 69 67 68 74 2a   True if *might*
15600 20 62 65 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a   be new term */.
15610 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
15620 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 29  er->bSkipEmpty )
15630 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
15640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15650 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  do {.      int i
15660 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61  First = pIter->a
15670 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b  First[1].iFirst;
15680 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
15690 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
156a0 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b  r->aSeg[iFirst];
156b0 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
156c0 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  erm = 0;..      
156d0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
156e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
156f0 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c    pSeg->xNext(p,
15700 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d   pSeg, &bNewTerm
15710 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
15720 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62  g->pLeaf==0 || b
15730 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20  NewTerm .       
15740 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  || fts5MultiIter
15750 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 49 74  AdvanceRowid(pIt
15760 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70 53 65  er, iFirst, &pSe
15770 67 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  g).      ){.    
15780 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
15790 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74  rAdvanced(p, pIt
157a0 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a  er, iFirst, 1);.
157b0 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
157c0 69 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65  iIterSetEof(pIte
157d0 72 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e  r);.        *pbN
157e0 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
157f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15800 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b   *pbNewTerm = 0;
15810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
15820 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
15830 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65 72  erSetup(p, pIter
15840 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  );..    }while( 
15850 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
15860 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29  mpty(p, pIter) )
15870 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
15880 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
15890 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28 46 74 73  Outputs_Noop(Fts
158a0 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64 31 2c  5Iter *pUnused1,
158b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 55   Fts5SegIter *pU
158c0 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  nused2){.  UNUSE
158d0 44 5f 50 41 52 41 4d 32 28 70 55 6e 75 73 65 64  D_PARAM2(pUnused
158e0 31 2c 20 70 55 6e 75 73 65 64 32 29 3b 0a 7d 0a  1, pUnused2);.}.
158f0 0a 73 74 61 74 69 63 20 46 74 73 35 49 74 65 72  .static Fts5Iter
15900 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41   *fts5MultiIterA
15910 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e 64 65  lloc(.  Fts5Inde
15920 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
15930 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
15940 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
15950 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
15960 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46 74 73  nt nSeg.){.  Fts
15970 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69  5Iter *pNew;.  i
15980 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
159a0 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e  * Power of two >
159b0 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72  = nSeg */..  for
159c0 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c  (nSlot=2; nSlot<
159d0 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f  nSeg; nSlot=nSlo
159e0 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66  t*2);.  pNew = f
159f0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
15a00 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
15a10 73 35 49 74 65 72 29 20 2b 20 20 20 20 20 20 20  s5Iter) +       
15a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
15a30 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  ew */.      size
15a40 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29 20  of(Fts5SegIter) 
15a50 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20  * (nSlot-1) +   
15a60 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20  /* pNew->aSeg[] 
15a70 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
15a80 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e  Fts5CResult) * n
15a90 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20  Slot         /* 
15aa0 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a  pNew->aFirst[] *
15ab0 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  /.  );.  if( pNe
15ac0 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  w ){.    pNew->n
15ad0 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20  Seg = nSlot;.   
15ae0 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d 20   pNew->aFirst = 
15af0 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26 70  (Fts5CResult*)&p
15b00 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d  New->aSeg[nSlot]
15b10 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64  ;.    pNew->pInd
15b20 65 78 20 3d 20 70 3b 0a 20 20 20 20 70 4e 65 77  ex = p;.    pNew
15b30 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
15b40 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
15b50 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 20 20 72  ts_Noop;.  }.  r
15b60 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 73  eturn pNew;.}..s
15b70 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
15b80 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a  oslistCallback(.
15b90 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55 6e    Fts5Index *pUn
15ba0 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70  used, .  void *p
15bb0 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73  Context, .  cons
15bc0 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
15bd0 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 55 4e  t nChunk.){.  UN
15be0 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73  USED_PARAM(pUnus
15bf0 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  ed);.  assert_nc
15c00 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
15c10 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
15c20 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
15c30 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 28 46  afeAppendBlob((F
15c40 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e 74  ts5Buffer*)pCont
15c50 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  ext, pChunk, nCh
15c60 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70  unk);.  }.}..typ
15c70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c  edef struct Posl
15c80 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 50  istCallbackCtx P
15c90 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
15ca0 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73  x;.struct Poslis
15cb0 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20  tCallbackCtx {. 
15cc0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
15cd0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
15ce0 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
15cf0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46  is buffer */.  F
15d00 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
15d10 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
15d20 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68  * Restrict match
15d30 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d  es to this colum
15d40 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 74  n */.  int eStat
15d50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
15d60 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
15d70 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64  ove */.};..typed
15d80 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73  ef struct Poslis
15d90 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f 73 6c  tOffsetsCtx Posl
15da0 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b 0a 73  istOffsetsCtx;.s
15db0 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66  truct PoslistOff
15dc0 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74 73 35  setsCtx {.  Fts5
15dd0 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
15de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15df0 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75  ppend to this bu
15e00 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f  ffer */.  Fts5Co
15e10 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20  lset *pColset;  
15e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15e30 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f  trict matches to
15e40 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   this column */.
15e50 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 69    int iRead;.  i
15e60 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f  nt iWrite;.};../
15e70 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65 20  *.** TODO: Make 
15e80 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69  this more effici
15e90 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent!.*/.static i
15ea0 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73  nt fts5IndexCols
15eb0 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c 73 65  etTest(Fts5Colse
15ec0 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74 20  t *pColset, int 
15ed0 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iCol){.  int i;.
15ee0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
15ef0 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  lset->nCol; i++)
15f00 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  {.    if( pColse
15f10 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f  t->aiCol[i]==iCo
15f20 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  l ) return 1;.  
15f30 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
15f40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15f50 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43  5PoslistOffsetsC
15f60 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
15f70 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a  ndex *pUnused, .
15f80 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
15f90 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
15fa0 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
15fb0 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 4f 66  k.){.  PoslistOf
15fc0 66 73 65 74 73 43 74 78 20 2a 70 43 74 78 20 3d  fsetsCtx *pCtx =
15fd0 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73   (PoslistOffsets
15fe0 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20  Ctx*)pContext;. 
15ff0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
16000 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  nused);.  assert
16010 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29  _nc( nChunk>=0 )
16020 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30  ;.  if( nChunk>0
16030 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
16040 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3c  0;.    while( i<
16050 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
16060 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  int iVal;.      
16070 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
16080 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69 5d 2c  nt32(&pChunk[i],
16090 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 56   iVal);.      iV
160a0 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52 65 61  al += pCtx->iRea
160b0 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70 43 74  d - 2;.      pCt
160c0 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61 6c 3b  x->iRead = iVal;
160d0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49  .      if( fts5I
160e0 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
160f0 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 56  Ctx->pColset, iV
16100 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  al) ){.        f
16110 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
16120 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e  endVarint(pCtx->
16130 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32 20 2d  pBuf, iVal + 2 -
16140 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29 3b 0a   pCtx->iWrite);.
16150 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69 57          pCtx->iW
16160 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20 20 20  rite = iVal;.   
16170 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
16180 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16190 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
161a0 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
161b0 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 0a 20  ndex *pUnused,. 
161c0 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
161d0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
161e0 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
161f0 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43 61 6c  .){.  PoslistCal
16200 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78 20 3d  lbackCtx *pCtx =
16210 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63   (PoslistCallbac
16220 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a  kCtx*)pContext;.
16230 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
16240 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72  Unused);.  asser
16250 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20  t_nc( nChunk>=0 
16260 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e  );.  if( nChunk>
16270 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  0 ){.    /* Sear
16280 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20 66 69  ch through to fi
16290 6e 64 20 74 68 65 20 66 69 72 73 74 20 76 61 72  nd the first var
162a0 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65 20 31  int with value 1
162b0 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a 20 20  . This is the.  
162c0 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68    ** start of th
162d0 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73 20 68  e next columns h
162e0 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  its. */.    int 
162f0 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
16300 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20  Start = 0;..    
16310 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65  if( pCtx->eState
16320 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==2 ){.      int
16330 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66 74 73   iCol;.      fts
16340 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
16350 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c  (pChunk, i, iCol
16360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  );.      if( fts
16370 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74  5IndexColsetTest
16380 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20  (pCtx->pColset, 
16390 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  iCol) ){.       
163a0 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
163b0 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  1;.        fts5B
163c0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
163d0 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75 66  arint(pCtx->pBuf
163e0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
163f0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  e{.        pCtx-
16400 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20  >eState = 0;.   
16410 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
16420 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  do {.      while
16430 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20 70 43  ( i<nChunk && pC
16440 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20 29 7b  hunk[i]!=0x01 ){
16450 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
16460 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78 38 30  pChunk[i] & 0x80
16470 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) i++;.        
16480 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
16490 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
164a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ate ){.        f
164b0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
164c0 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42  endBlob(pCtx->pB
164d0 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61  uf, &pChunk[iSta
164e0 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a  rt], i-iStart);.
164f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16500 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20  ( i<nChunk ){.  
16510 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
16520 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
16530 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b   i;.        i++;
16540 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
16550 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
16560 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
16570 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 2;.        }e
16580 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
16590 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
165a0 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43  32(pChunk, i, iC
165b0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ol);.          p
165c0 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 66 74  Ctx->eState = ft
165d0 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
165e0 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c  t(pCtx->pColset,
165f0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
16600 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61    if( pCtx->eSta
16610 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
16620 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
16630 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d  AppendBlob(pCtx-
16640 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69  >pBuf, &pChunk[i
16650 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74  Start], i-iStart
16660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
16670 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  Start = i;.     
16680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
166a0 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 3b  ile( i<nChunk );
166b0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
166c0 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65  oid fts5ChunkIte
166d0 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rate(.  Fts5Inde
166e0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
166f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16700 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
16710 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20  5SegIter *pSeg, 
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16730 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73 20  Poslist of this 
16740 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f  iterator */.  vo
16750 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16770 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72   Context pointer
16780 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c   for xChunk call
16790 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28  back */.  void (
167a0 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e 64  *xChunk)(Fts5Ind
167b0 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73  ex*, void*, cons
167c0 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20  t u8*, int).){. 
167d0 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65 67   int nRem = pSeg
167e0 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20  ->nPos;         
167f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
16800 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d  tes still to com
16810 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  e */.  Fts5Data 
16820 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75 38  *pData = 0;.  u8
16830 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65 67   *pChunk = &pSeg
16840 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
16850 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
16860 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49   int nChunk = MI
16870 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c  N(nRem, pSeg->pL
16880 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  eaf->szLeaf - pS
16890 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 29  eg->iLeafOffset)
168a0 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70  ;.  int pgno = p
168b0 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  Seg->iLeafPgno;.
168c0 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d    int pgnoSave =
168d0 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
168e0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
168f0 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74 61 69  mwork with detai
16900 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73 65 73  l=none databases
16910 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
16920 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
16930 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
16940 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28 20 28  NONE );..  if( (
16950 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46 54  pSeg->flags & FT
16960 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
16970 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 67  SE)==0 ){.    pg
16980 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31 3b  noSave = pgno+1;
16990 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
169a0 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28 70   ){.    xChunk(p
169b0 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c 20  , pCtx, pChunk, 
169c0 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52 65  nChunk);.    nRe
169d0 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20  m -= nChunk;.   
169e0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
169f0 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  (pData);.    if(
16a00 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20 20   nRem<=0 ){.    
16a10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
16a20 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b 2b  se{.      pgno++
16a30 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
16a40 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
16a50 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
16a60 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69  ID(pSeg->pSeg->i
16a70 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b 0a 20  Segid, pgno));. 
16a80 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d       if( pData==
16a90 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
16aa0 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74 61   pChunk = &pData
16ab0 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43  ->p[4];.      nC
16ac0 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c  hunk = MIN(nRem,
16ad0 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d   pData->szLeaf -
16ae0 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   4);.      if( p
16af0 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b  gno==pgnoSave ){
16b00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16b10 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66   pSeg->pNextLeaf
16b20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
16b30 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  Seg->pNextLeaf =
16b40 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20   pData;.        
16b50 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  pData = 0;.     
16b60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
16b70 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
16b80 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
16b90 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64  oints to a valid
16ba0 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29   entry (not EOF)
16bb0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
16bc0 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20 70  on appends the p
16bd0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
16be0 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  a for the curren
16bf0 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75  t entry to.** bu
16c00 66 66 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f  ffer pBuf. It do
16c10 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f  es not make a co
16c20 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  py of the positi
16c30 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20  on-list size.** 
16c40 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
16c50 20 76 6f 69 64 20 66 74 73 35 53 65 67 69 74 65   void fts5Segite
16c60 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
16c70 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
16c80 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20  SegIter *pSeg,. 
16c90 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
16ca0 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66  lset,.  Fts5Buff
16cb0 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66  er *pBuf.){.  if
16cc0 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47  ( 0==fts5BufferG
16cd0 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  row(&p->rc, pBuf
16ce0 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29 7b  , pSeg->nPos) ){
16cf0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74  .    if( pColset
16d00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
16d10 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c  5ChunkIterate(p,
16d20 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70 42   pSeg, (void*)pB
16d30 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 43  uf, fts5PoslistC
16d40 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65  allback);.    }e
16d50 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
16d60 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
16d70 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
16d80 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  FULL ){.        
16d90 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
16da0 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20  tx sCtx;.       
16db0 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75   sCtx.pBuf = pBu
16dc0 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  f;.        sCtx.
16dd0 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65  pColset = pColse
16de0 74 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  t;.        sCtx.
16df0 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64  eState = fts5Ind
16e00 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f  exColsetTest(pCo
16e10 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lset, 0);.      
16e20 20 20 61 73 73 65 72 74 28 20 73 43 74 78 2e 65    assert( sCtx.e
16e30 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78  State==0 || sCtx
16e40 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20  .eState==1 );.  
16e50 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
16e60 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
16e70 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74  (void*)&sCtx, ft
16e80 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
16e90 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
16ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
16eb0 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
16ec0 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20 6d   sCtx;.        m
16ed0 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20  emset(&sCtx, 0, 
16ee0 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20  sizeof(sCtx));. 
16ef0 20 20 20 20 20 20 20 73 43 74 78 2e 70 42 75 66         sCtx.pBuf
16f00 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20   = pBuf;.       
16f10 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20   sCtx.pColset = 
16f20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20  pColset;.       
16f30 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
16f40 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64  e(p, pSeg, (void
16f50 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73  *)&sCtx, fts5Pos
16f60 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62  listOffsetsCallb
16f70 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ack);.      }.  
16f80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
16f90 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65   IN/OUT paramete
16fa0 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73 20 74  r (*pa) points t
16fb0 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  o a position lis
16fc0 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  t n bytes in siz
16fd0 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73  e. If.** the pos
16fe0 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ition list conta
16ff0 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
17000 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65  column iCol, the
17010 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74 0a 2a  n (*pa) is set.*
17020 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  * to point to th
17030 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c  e sub-position-l
17040 69 73 74 20 66 6f 72 20 74 68 61 74 20 63 6f 6c  ist for that col
17050 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  umn and the numb
17060 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69  er of.** bytes i
17070 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e 20 4f  n it returned. O
17080 72 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  r, if the argume
17090 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
170a0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e   does not.** con
170b0 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69 65 73  tain any entries
170c0 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c   for column iCol
170d0 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  , return 0..*/.s
170e0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
170f0 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 0a 20  dexExtractCol(. 
17100 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20   const u8 **pa, 
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17120 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e   /* IN/OUT: Poin
17130 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a  ter to poslist *
17140 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65 20      /* IN: Size 
17170 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79  of poslist in by
17180 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  tes */.  int iCo
17190 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
171a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
171b0 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 66 72  mn to extract fr
171c0 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b  om poslist */.){
171d0 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
171e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
171f0 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62     /* Anything b
17200 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
17210 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f  0x01 is col 0 */
17220 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d  .  const u8 *p =
17230 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38   *pa;.  const u8
17240 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20   *pEnd = &p[n]; 
17250 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
17260 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
17270 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
17280 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e  ..  while( iCol>
17290 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  iCurrent ){.    
172a0 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74  /* Advance point
172b0 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f  er p until it po
172c0 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20  ints to pEnd or 
172d0 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68 61  an 0x01 byte tha
172e0 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  t is.    ** not 
172f0 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74  part of a varint
17300 2e 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69  . Note that it i
17310 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
17320 6f 72 20 61 20 6e 65 67 61 74 69 76 65 0a 20 20  or a negative.  
17330 20 20 2a 2a 20 6f 72 20 65 78 74 72 65 6d 65 6c    ** or extremel
17340 79 20 6c 61 72 67 65 20 76 61 72 69 6e 74 20 74  y large varint t
17350 6f 20 6f 63 63 75 72 20 77 69 74 68 69 6e 20 61  o occur within a
17360 6e 20 75 6e 63 6f 72 72 75 70 74 65 64 20 70 6f  n uncorrupted po
17370 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6c  sition .    ** l
17380 69 73 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74  ist. So the last
17390 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 76 61   byte of each va
173a0 72 69 6e 74 20 6d 61 79 20 62 65 20 61 73 73 75  rint may be assu
173b0 6d 65 64 20 74 6f 20 68 61 76 65 20 61 20 63 6c  med to have a cl
173c0 65 61 72 0a 20 20 20 20 2a 2a 20 30 78 38 30 20  ear.    ** 0x80 
173d0 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69  bit.  */.    whi
173e0 6c 65 28 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a  le( *p!=0x01 ){.
173f0 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b        while( *p+
17400 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 20 20  + & 0x80 );.    
17410 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 20    if( p>=pEnd ) 
17420 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
17430 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20      *pa = p++;. 
17440 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 2a 70     iCurrent = *p
17450 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 75 72  ++;.    if( iCur
17460 72 65 6e 74 20 26 20 30 78 38 30 20 29 7b 0a 20  rent & 0x80 ){. 
17470 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20 20 20 20       p--;.      
17480 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  p += fts5GetVari
17490 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e 74  nt32(p, iCurrent
174a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
174b0 66 28 20 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e  f( iCol!=iCurren
174c0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
174d0 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e   /* Advance poin
174e0 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70  ter p until it p
174f0 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72  oints to pEnd or
17500 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74 68   an 0x01 byte th
17510 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70  at is.  ** not p
17520 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20  art of a varint 
17530 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45  */.  while( p<pE
17540 6e 64 20 26 26 20 2a 70 21 3d 30 78 30 31 20 29  nd && *p!=0x01 )
17550 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b  {.    while( *p+
17560 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20 7d 0a  + & 0x80 );.  }.
17570 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20 28 2a  .  return p - (*
17580 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  pa);.}..static i
17590 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72  nt fts5IndexExtr
175a0 61 63 74 43 6f 6c 73 65 74 20 28 0a 20 20 46 74  actColset (.  Ft
175b0 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
175c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
175d0 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65   Colset to filte
175e0 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  r on */.  const 
175f0 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50  u8 *pPos, int nP
17600 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  os,       /* Pos
17610 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
17620 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17640 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
17650 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
17660 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
17670 6e 74 20 69 3b 0a 0a 20 20 66 74 73 35 42 75 66  nt i;..  fts5Buf
17680 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
17690 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
176a0 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  set->nCol; i++){
176b0 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
176c0 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20  Sub = pPos;.    
176d0 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35 49  int nSub = fts5I
176e0 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26  ndexExtractCol(&
176f0 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c  pSub, nPos, pCol
17700 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a  set->aiCol[i]);.
17710 20 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b 0a      if( nSub ){.
17720 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
17730 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20  AppendBlob(&rc, 
17740 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62  pBuf, nSub, pSub
17750 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
17760 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17770 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
17780 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
17790 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c  detail=none tabl
177a0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
177b0 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
177c0 74 70 75 74 73 5f 4e 6f 6e 65 28 46 74 73 35 49  tputs_None(Fts5I
177d0 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
177e0 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
177f0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
17800 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
17810 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
17820 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20  DETAIL_NONE );. 
17830 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f   pIter->base.iRo
17840 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
17850 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  id;.  pIter->bas
17860 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d 3e  e.nData = pSeg->
17870 6e 50 6f 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  nPos;.}../*.** x
17880 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
17890 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
178a0 69 6c 3d 66 75 6c 6c 20 61 6e 64 20 64 65 74 61  il=full and deta
178b0 69 6c 3d 63 6f 6c 20 74 61 62 6c 65 73 20 77 68  il=col tables wh
178c0 65 6e 20 6e 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  en no.** column 
178d0 66 69 6c 74 65 72 73 20 61 72 65 20 73 70 65 63  filters are spec
178e0 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
178f0 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
17900 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c 73 65  tOutputs_Nocolse
17910 74 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  t(Fts5Iter *pIte
17920 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
17930 70 53 65 67 29 7b 0a 20 20 70 49 74 65 72 2d 3e  pSeg){.  pIter->
17940 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53  base.iRowid = pS
17950 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49  eg->iRowid;.  pI
17960 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
17970 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 0a 20  = pSeg->nPos;.. 
17980 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
17990 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
179a0 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
179b0 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20  ETAIL_NONE );.  
179c0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
179d0 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 0a 20 20  Colset==0 );..  
179e0 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  if( pSeg->iLeafO
179f0 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73  ffset+pSeg->nPos
17a00 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  <=pSeg->pLeaf->s
17a10 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  zLeaf ){.    /* 
17a20 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72  All data is stor
17a30 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
17a40 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61 74 65  t page. Populate
17a50 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20 20 20   the output .   
17a60 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f   ** variables to
17a70 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20   point into the 
17a80 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61 67 65  body of the page
17a90 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
17aa0 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
17ab0 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  a = &pSeg->pLeaf
17ac0 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
17ad0 66 66 73 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  ffset];.  }else{
17ae0 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  .    /* The data
17af0 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
17b00 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65  over two or more
17b10 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74 20   pages. Copy it 
17b20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
17b30 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73 74  Fts5Iter.poslist
17b40 20 62 75 66 66 65 72 20 61 6e 64 20 74 68 65 6e   buffer and then
17b50 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
17b60 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
17b70 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  .    ** to this 
17b80 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20  buffer.  */.    
17b90 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
17ba0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
17bb0 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72  .    fts5Segiter
17bc0 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70  Poslist(pIter->p
17bd0 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 30 2c 20  Index, pSeg, 0, 
17be0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
17bf0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ;.    pIter->bas
17c00 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.pData = pIter-
17c10 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a  >poslist.p;.  }.
17c20 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
17c30 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
17c40 65 64 20 62 79 20 64 65 74 61 69 6c 3d 63 6f 6c  ed by detail=col
17c50 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
17c60 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 0a 2a   column filter.*
17c70 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
17c80 31 30 30 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  100 or more colu
17c90 6d 6e 73 2e 20 41 6c 73 6f 20 63 61 6c 6c 65 64  mns. Also called
17ca0 20 61 73 20 61 20 66 61 6c 6c 62 61 63 6b 20 66   as a fallback f
17cb0 72 6f 6d 0a 2a 2a 20 66 74 73 35 49 74 65 72 53  rom.** fts5IterS
17cc0 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30  etOutputs_Col100
17cd0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c   if the column-l
17ce0 69 73 74 20 73 70 61 6e 73 20 6d 6f 72 65 20 74  ist spans more t
17cf0 68 61 6e 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  han one page..*/
17d00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17d10 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
17d20 43 6f 6c 28 46 74 73 35 49 74 65 72 20 2a 70 49  Col(Fts5Iter *pI
17d30 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
17d40 20 2a 70 53 65 67 29 7b 0a 20 20 66 74 73 35 42   *pSeg){.  fts5B
17d50 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
17d60 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 66 74  ->poslist);.  ft
17d70 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
17d80 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
17d90 70 53 65 67 2c 20 70 49 74 65 72 2d 3e 70 43 6f  pSeg, pIter->pCo
17da0 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f  lset, &pIter->po
17db0 73 6c 69 73 74 29 3b 0a 20 20 70 49 74 65 72 2d  slist);.  pIter-
17dc0 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
17dd0 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70  Seg->iRowid;.  p
17de0 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
17df0 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
17e00 74 2e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  t.p;.  pIter->ba
17e10 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
17e20 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a  ->poslist.n;.}..
17e30 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74  /*.** xSetOutput
17e40 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  s callback used 
17e50 77 68 65 6e 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  when: .**.**   *
17e60 20 64 65 74 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20   detail=col,.** 
17e70 20 20 2a 20 74 68 65 72 65 20 69 73 20 61 20 63    * there is a c
17e80 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2c 20 61 6e  olumn filter, an
17e90 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 74 61 62  d.**   * the tab
17ea0 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 30 30 20  le contains 100 
17eb0 6f 72 20 66 65 77 65 72 20 63 6f 6c 75 6d 6e 73  or fewer columns
17ec0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73  . .**.** The las
17ed0 74 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 65 6e  t point is to en
17ee0 73 75 72 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  sure all column 
17ef0 6e 75 6d 62 65 72 73 20 61 72 65 20 73 74 6f 72  numbers are stor
17f00 65 64 20 61 73 20 0a 2a 2a 20 73 69 6e 67 6c 65  ed as .** single
17f10 2d 62 79 74 65 20 76 61 72 69 6e 74 73 2e 0a 2a  -byte varints..*
17f20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
17f30 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
17f40 5f 43 6f 6c 31 30 30 28 46 74 73 35 49 74 65 72  _Col100(Fts5Iter
17f50 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67   *pIter, Fts5Seg
17f60 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 0a 20 20  Iter *pSeg){..  
17f70 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
17f80 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Index->pConfig->
17f90 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
17fa0 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a  TAIL_COLUMNS );.
17fb0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
17fc0 3e 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69  >pColset );..  i
17fd0 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
17fe0 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3e  fset+pSeg->nPos>
17ff0 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
18000 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 49  eaf ){.    fts5I
18010 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
18020 6c 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a  l(pIter, pSeg);.
18030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
18040 2a 61 20 3d 20 28 75 38 2a 29 26 70 53 65 67 2d  *a = (u8*)&pSeg-
18050 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e  >pLeaf->p[pSeg->
18060 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
18070 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 28 75 38    u8 *pEnd = (u8
18080 2a 29 26 61 5b 70 53 65 67 2d 3e 6e 50 6f 73 5d  *)&a[pSeg->nPos]
18090 3b 20 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76  ; .    int iPrev
180a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61   = 0;.    int *a
180b0 69 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 70 43  iCol = pIter->pC
180c0 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20  olset->aiCol;.  
180d0 20 20 69 6e 74 20 2a 61 69 43 6f 6c 45 6e 64 20    int *aiColEnd 
180e0 3d 20 26 61 69 43 6f 6c 5b 70 49 74 65 72 2d 3e  = &aiCol[pIter->
180f0 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a  pColset->nCol];.
18100 0a 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20  .    u8 *aOut = 
18110 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
18120 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76 4f  ;.    int iPrevO
18130 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 70 49 74  ut = 0;..    pIt
18140 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
18150 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
18160 0a 20 20 20 20 77 68 69 6c 65 28 20 61 3c 70 45  .    while( a<pE
18170 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 50 72 65  nd ){.      iPre
18180 76 20 2b 3d 20 28 69 6e 74 29 61 2b 2b 5b 30 5d  v += (int)a++[0]
18190 20 2d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c   - 2;.      whil
181a0 65 28 20 2a 61 69 43 6f 6c 3c 69 50 72 65 76 20  e( *aiCol<iPrev 
181b0 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c  ){.        aiCol
181c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
181d0 61 69 43 6f 6c 3d 3d 61 69 43 6f 6c 45 6e 64 20  aiCol==aiColEnd 
181e0 29 20 67 6f 74 6f 20 73 65 74 6f 75 74 70 75 74  ) goto setoutput
181f0 73 5f 63 6f 6c 5f 6f 75 74 3b 0a 20 20 20 20 20  s_col_out;.     
18200 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 61 69   }.      if( *ai
18210 43 6f 6c 3d 3d 69 50 72 65 76 20 29 7b 0a 20 20  Col==iPrev ){.  
18220 20 20 20 20 20 20 2a 61 4f 75 74 2b 2b 20 3d 20        *aOut++ = 
18230 28 69 50 72 65 76 20 2d 20 69 50 72 65 76 4f 75  (iPrev - iPrevOu
18240 74 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 20 20  t) + 2;.        
18250 69 50 72 65 76 4f 75 74 20 3d 20 69 50 72 65 76  iPrevOut = iPrev
18260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18270 0a 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f  .setoutputs_col_
18280 6f 75 74 3a 0a 20 20 20 20 70 49 74 65 72 2d 3e  out:.    pIter->
18290 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74  base.pData = pIt
182a0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
182b0 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e     pIter->base.n
182c0 44 61 74 61 20 3d 20 61 4f 75 74 20 2d 20 70 49  Data = aOut - pI
182d0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
182e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65    }.}../*.** xSe
182f0 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
18300 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  k used by detail
18310 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68 65 72 65  =full when there
18320 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c   is a column fil
18330 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
18340 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f  oid fts5IterSetO
18350 75 74 70 75 74 73 5f 46 75 6c 6c 28 46 74 73 35  utputs_Full(Fts5
18360 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
18370 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
18380 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
18390 43 6f 6c 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Colset = pIter->
183a0 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65 72  pColset;.  pIter
183b0 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
183c0 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20  pSeg->iRowid;.. 
183d0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
183e0 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
183f0 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
18400 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20 20  ETAIL_FULL );.  
18410 61 73 73 65 72 74 28 20 70 43 6f 6c 73 65 74 20  assert( pColset 
18420 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  );..  if( pSeg->
18430 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67  iLeafOffset+pSeg
18440 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c  ->nPos<=pSeg->pL
18450 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
18460 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20 69     /* All data i
18470 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  s stored on the 
18480 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50 6f  current page. Po
18490 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75  pulate the outpu
184a0 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  t .    ** variab
184b0 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e 74  les to point int
184c0 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
184d0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20 2a  e page object. *
184e0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  /.    const u8 *
184f0 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  a = &pSeg->pLeaf
18500 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
18510 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28 20  ffset];.    if( 
18520 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31  pColset->nCol==1
18530 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
18540 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 66 74  >base.nData = ft
18550 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
18560 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  l(&a, pSeg->nPos
18570 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b  ,pColset->aiCol[
18580 30 5d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  0]);.      pIter
18590 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 61  ->base.pData = a
185a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
185b0 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
185c0 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  o(&pIter->poslis
185d0 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e  t);.      fts5In
185e0 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74  dexExtractColset
185f0 28 70 43 6f 6c 73 65 74 2c 20 61 2c 20 70 53 65  (pColset, a, pSe
18600 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d  g->nPos, &pIter-
18610 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  >poslist);.     
18620 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61   pIter->base.pDa
18630 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
18640 69 73 74 2e 70 3b 0a 20 20 20 20 20 20 70 49 74  ist.p;.      pIt
18650 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
18660 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18670 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
18680 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74  {.    /* The dat
18690 61 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  a is distributed
186a0 20 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72   over two or mor
186b0 65 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74  e pages. Copy it
186c0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
186d0 20 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73   Fts5Iter.poslis
186e0 74 20 62 75 66 66 65 72 20 61 6e 64 20 74 68 65  t buffer and the
186f0 6e 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  n set the output
18700 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
18710 74 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73  t.    ** to this
18720 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20   buffer.  */.   
18730 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
18740 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
18750 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65  ;.    fts5Segite
18760 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e  rPoslist(pIter->
18770 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 43  pIndex, pSeg, pC
18780 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70  olset, &pIter->p
18790 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
187a0 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
187b0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
187c0 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  p;.    pIter->ba
187d0 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
187e0 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d  ->poslist.n;.  }
187f0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
18800 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
18810 74 43 62 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  tCb(int *pRc, Ft
18820 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
18830 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
18840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
18850 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
18860 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
18870 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69  ->pConfig;.    i
18880 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  f( pConfig->eDet
18890 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
188a0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
188b0 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
188c0 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
188d0 75 74 70 75 74 73 5f 4e 6f 6e 65 3b 0a 20 20 20  utputs_None;.   
188e0 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28   }..    else if(
188f0 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d   pIter->pColset=
18900 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  =0 ){.      pIte
18910 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
18920 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
18930 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 3b 0a 20 20  uts_Nocolset;.  
18940 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66    }..    else if
18950 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ( pConfig->eDeta
18960 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
18970 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 49  FULL ){.      pI
18980 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
18990 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
189a0 74 70 75 74 73 5f 46 75 6c 6c 3b 0a 20 20 20 20  tputs_Full;.    
189b0 7d 0a 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  }..    else{.   
189c0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6e 66     assert( pConf
189d0 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
189e0 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53  5_DETAIL_COLUMNS
189f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
18a00 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31 30 30  onfig->nCol<=100
18a10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
18a20 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
18a30 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
18a40 75 74 73 5f 43 6f 6c 31 30 30 3b 0a 20 20 20 20  uts_Col100;.    
18a50 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
18a60 75 66 66 65 72 53 69 7a 65 28 70 52 63 2c 20 26  ufferSize(pRc, &
18a70 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2c 20  pIter->poslist, 
18a80 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a  pConfig->nCol);.
18a90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18aa0 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
18ab0 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
18ac0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c  erSetOutputs_Col
18ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18ae0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c    }.}.../*.** Al
18af0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74 73  locate a new Fts
18b00 35 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  5Iter object..**
18b10 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
18b20 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ct will be used 
18b30 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
18b40 67 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63  gh data in struc
18b50 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a  ture pStruct..**
18b60 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76   If iLevel is -v
18b70 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61  e, then all data
18b80 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73   in all segments
18b90 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20   is merged. Or, 
18ba0 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  if iLevel.** is 
18bb0 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c  zero or greater,
18bc0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66   data from the f
18bd0 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65  irst nSegment se
18be0 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20  gments on level 
18bf0 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72  iLevel.** is mer
18c00 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ged..**.** The i
18c10 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c  terator initiall
18c20 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
18c30 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64  first term/rowid
18c40 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a   entry in the .*
18c50 2a 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e  * iterated data.
18c60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18c70 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
18c80 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
18c90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18ca0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
18cb0 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
18cc0 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53  ithin */.  Fts5S
18cd0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
18ce0 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  t,         /* St
18cf0 72 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69  ructure of speci
18d00 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  fic index */.  i
18d10 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d30 2a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  * FTS5INDEX_QUER
18d40 59 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  Y_XXX flags */. 
18d50 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
18d60 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
18d70 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69   /* Colset to fi
18d80 6c 74 65 72 20 6f 6e 20 28 6f 72 20 4e 55 4c 4c  lter on (or NULL
18d90 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  ) */.  const u8 
18da0 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
18db0 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
18dc0 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55  o seek to (or NU
18dd0 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69  LL/0) */.  int i
18de0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
18df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
18e00 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28  vel to iterate (
18e10 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20  -1 for all) */. 
18e20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20   int nSegment,  
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
18e50 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20  gments to merge 
18e60 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20  (iLevel>=0) */. 
18e70 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75   Fts5Iter **ppOu
18e80 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
18e90 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
18ea0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 20  /.){.  int nSeg 
18eb0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18ec0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18ed0 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65 72   of segment-iter
18ee0 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  s in use */.  in
18ef0 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20  t iIter = 0;    
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18f10 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20   */.  int iSeg; 
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
18f40 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
18f50 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
18f60 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
18f70 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49  l *pLvl;.  Fts5I
18f80 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73  ter *pNew;..  as
18f90 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20  sert( (pTerm==0 
18fa0 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20  && nTerm==0) || 
18fb0 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f  iLevel<0 );..  /
18fc0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
18fd0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c   for the new mul
18fe0 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e  ti-seg-iterator.
18ff0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
19000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19010 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29    if( iLevel<0 )
19020 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19030 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
19040 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65  t==fts5Structure
19050 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
19060 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20  truct) );.      
19070 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
19080 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20  nSegment;.      
19090 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73  nSeg += (p->pHas
190a0 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  h ? 1 : 0);.    
190b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65  }else{.      nSe
190c0 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d  g = MIN(pStruct-
190d0 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e  >aLevel[iLevel].
190e0 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  nSeg, nSegment);
190f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
19100 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
19110 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
19120 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66 28 20  p, nSeg);.  if( 
19130 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
19140 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d  ;.  pNew->bRev =
19150 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54   (0!=(flags & FT
19160 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
19170 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53  SC));.  pNew->bS
19180 6b 69 70 45 6d 70 74 79 20 3d 20 28 30 21 3d 28  kipEmpty = (0!=(
19190 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
191a0 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54  X_QUERY_SKIPEMPT
191b0 59 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 74  Y));.  pNew->pSt
191c0 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
191d0 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 73 65 74 20    pNew->pColset 
191e0 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 66 74 73  = pColset;.  fts
191f0 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 53  5StructureRef(pS
19200 74 72 75 63 74 29 3b 0a 20 20 69 66 28 20 28 66  truct);.  if( (f
19210 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
19220 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 29  _QUERY_NOOUTPUT)
19230 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 49  ==0 ){.    fts5I
19240 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 26  terSetOutputCb(&
19250 70 2d 3e 72 63 2c 20 70 4e 65 77 29 3b 0a 20 20  p->rc, pNew);.  
19260 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
19270 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  ze each of the c
19280 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74  omponent segment
19290 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20   iterators. */. 
192a0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
192b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
192c0 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
192d0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
192e0 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70  Level *pEnd = &p
192f0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70  Struct->aLevel[p
19300 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b  Struct->nLevel];
19310 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48  .      if( p->pH
19320 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ash ){.        /
19330 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20  * Add a segment 
19340 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  iterator for the
19350 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
19360 73 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61  s of the hash ta
19370 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ble. */.        
19380 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
19390 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
193a0 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
193b0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 48 61     fts5SegIterHa
193c0 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c  shInit(p, pTerm,
193d0 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70   nTerm, flags, p
193e0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
193f0 20 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70       for(pLvl=&p
19400 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
19410 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c  ]; pLvl<pEnd; pL
19420 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  vl++){.        f
19430 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53  or(iSeg=pLvl->nS
19440 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
19450 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Seg--){.        
19460 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
19470 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
19480 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
19490 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35  ;.          Fts5
194a0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
194b0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
194c0 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 20  er++];.         
194d0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
194e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
194f0 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
19500 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20  pSeg, pIter);.  
19510 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
19520 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
19530 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70  egIterSeekInit(p
19540 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , pTerm, nTerm, 
19550 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74  flags, pSeg, pIt
19560 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
19570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19580 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
19590 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72      pLvl = &pStr
195a0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
195b0 65 6c 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  el];.      for(i
195c0 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67  Seg=nSeg-1; iSeg
195d0 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20  >=0; iSeg--){.  
195e0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
195f0 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e  rInit(p, &pLvl->
19600 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65  aSeg[iSeg], &pNe
19610 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
19620 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19630 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 49 74  .    assert( iIt
19640 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 20 20 7d 0a  er==nSeg );.  }.
19650 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
19660 76 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ve was successfu
19670 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  l, each componen
19680 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20  t iterators now 
19690 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20  points .  ** to 
196a0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
196b0 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20  in its segment. 
196c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 69  In this case ini
196d0 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a  tialize the .  *
196e0 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  * aFirst[] array
196f0 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
19700 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
19710 66 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f  free the iterato
19720 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e  r.  ** object an
19730 64 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  d set the output
19740 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
19750 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  L.  */.  if( p->
19760 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19770 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72 3d 70  .    for(iIter=p
19780 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74  New->nSeg-1; iIt
19790 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a  er>0; iIter--){.
197a0 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20        int iEq;. 
197b0 20 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20       if( (iEq = 
197c0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
197d0 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74  ompare(pNew, iIt
197e0 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  er)) ){.        
197f0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
19800 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  g = &pNew->aSeg[
19810 69 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  iEq];.        if
19820 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19830 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e 65 78 74  OK ) pSeg->xNext
19840 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20  (p, pSeg, 0);.  
19850 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
19860 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
19870 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29  New, iEq, iIter)
19880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19890 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
198a0 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20  rSetEof(pNew);. 
198b0 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c     fts5AssertMul
198c0 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70  tiIterSetup(p, p
198d0 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
198e0 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
198f0 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  && fts5MultiIter
19900 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29  IsEmpty(p, pNew)
19910 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75   ){.      fts5Mu
19920 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
19930 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  New, 0, 0);.    
19940 7d 65 6c 73 65 20 69 66 28 20 70 4e 65 77 2d 3e  }else if( pNew->
19950 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a  base.bEof==0 ){.
19960 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
19970 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77 2d  r *pSeg = &pNew-
19980 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69 72  >aSeg[pNew->aFir
19990 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
199a0 20 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f       pNew->xSetO
199b0 75 74 70 75 74 73 28 70 4e 65 77 2c 20 70 53 65  utputs(pNew, pSe
199c0 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  g);.    }..  }el
199d0 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  se{.    fts5Mult
199e0 69 49 74 65 72 46 72 65 65 28 70 4e 65 77 29 3b  iIterFree(pNew);
199f0 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b  .    *ppOut = 0;
19a00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
19a10 65 61 74 65 20 61 6e 20 46 74 73 35 49 74 65 72  eate an Fts5Iter
19a20 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 74   that iterates t
19a30 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69  hrough the docli
19a40 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61  st provided.** a
19a50 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
19a60 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
19a70 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
19a80 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49  terNew2(.  Fts5I
19a90 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
19aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
19ab0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
19ac0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
19ad0 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
19ae0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
19af0 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20    /* Doclist to 
19b00 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
19b10 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20  */.  int bDesc, 
19b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
19b40 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
19b50 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73  d order */.  Fts
19b60 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  5Iter **ppOut   
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19b80 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  New object */.){
19b90 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e 65  .  Fts5Iter *pNe
19ba0 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35  w;.  pNew = fts5
19bb0 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70  MultiIterAlloc(p
19bc0 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 2);.  if( pNew
19bd0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
19be0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
19bf0 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20  ew->aSeg[1];..  
19c00 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d    pIter->flags =
19c10 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
19c20 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70  ETERM;.    if( p
19c30 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29  Data->szLeaf>0 )
19c40 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  {.      pIter->p
19c50 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20  Leaf = pData;.  
19c60 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
19c70 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
19c80 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c  Varint(pData->p,
19c90 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
19ca0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49  Rowid);.      pI
19cb0 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
19cc0 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a  st = pData->nn;.
19cd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72        pNew->aFir
19ce0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31  st[1].iFirst = 1
19cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 73  ;.      if( bDes
19d00 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  c ){.        pNe
19d10 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20  w->bRev = 1;.   
19d20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
19d30 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
19d40 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
19d50 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
19d60 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
19d70 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
19d80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
19d90 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
19da0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
19db0 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61     }.      pData
19dc0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
19dd0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61 73  .      pNew->bas
19de0 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  e.bEof = 1;.    
19df0 7d 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  }.    fts5SegIte
19e00 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65  rSetNext(p, pIte
19e10 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20  r);..    *ppOut 
19e20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66  = pNew;.  }..  f
19e30 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
19e40 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
19e50 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
19e60 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 61  he iterator is a
19e70 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65  t EOF or if an e
19e80 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
19e90 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68  d. .** False oth
19ea0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
19eb0 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
19ec0 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
19ed0 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70   *p, Fts5Iter *p
19ee0 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
19ef0 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c   p->rc .      ||
19f00 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   (pIter->aSeg[ p
19f10 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
19f20 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d  iFirst ].pLeaf==
19f30 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e  0)==pIter->base.
19f40 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65 74  bEof .  );.  ret
19f50 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49  urn (p->rc || pI
19f60 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 29 3b  ter->base.bEof);
19f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19f80 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
19f90 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
19fa0 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
19fb0 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  tly points.** to
19fc0 2e 20 49 66 20 74 68 65 20 69 74 65 72 61 74 6f  . If the iterato
19fd0 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20  r points to EOF 
19fe0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
19ff0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
1a000 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20  .** results are 
1a010 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
1a020 61 74 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c  atic i64 fts5Mul
1a030 74 69 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  tiIterRowid(Fts5
1a040 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1a050 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61  assert( pIter->a
1a060 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1a070 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70  st[1].iFirst ].p
1a080 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75 72 6e  Leaf );.  return
1a090 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
1a0a0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1a0b0 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a  First ].iRowid;.
1a0c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1a0d0 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
1a0e0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74 20  e next entry at 
1a0f0 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61  or following iMa
1a100 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tch..*/.static v
1a110 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
1a120 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73  rNextFrom(.  Fts
1a130 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1a140 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  s5Iter *pIter, .
1a150 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a    i64 iMatch.){.
1a160 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1a170 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
1a180 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
1a190 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c  ext(p, pIter, 1,
1a1a0 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66   iMatch);.    if
1a1b0 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
1a1c0 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 20 62  of(p, pIter) ) b
1a1d0 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64  reak;.    iRowid
1a1e0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1a1f0 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
1a200 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65    if( pIter->bRe
1a210 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d  v==0 && iRowid>=
1a220 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
1a230 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
1a240 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev!=0 && iRowid
1a250 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  <=iMatch ) break
1a260 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1a270 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1a280 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1a290 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20  aining the term 
1a2a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1a2b0 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68  the .** entry th
1a2c0 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  at the iterator 
1a2d0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1a2e0 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63   to..*/.static c
1a2f0 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c  onst u8 *fts5Mul
1a300 74 69 49 74 65 72 54 65 72 6d 28 46 74 73 35 49  tiIterTerm(Fts5I
1a310 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
1a320 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67 49  *pn){.  Fts5SegI
1a330 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72 2d  ter *p = &pIter-
1a340 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
1a350 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
1a360 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72  ;.  *pn = p->ter
1a370 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  m.n;.  return p-
1a380 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  >term.p;.}../*.*
1a390 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1a3a0 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20   segment-id for 
1a3b0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 53  the structure pS
1a3c0 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73  truct. The new s
1a3d0 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73  egment.** id mus
1a3e0 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  t be between 1 a
1a3f0 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69  nd 65335 inclusi
1a400 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74  ve, and must not
1a410 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   be used by .** 
1a420 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78  any currently ex
1a430 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20  isting segment. 
1a440 49 66 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e  If a free segmen
1a450 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66  t id cannot be f
1a460 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
1a470 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  FULL is returned
1a480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1a490 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
1a4a0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
1a4b0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1a4c0 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74  op. 0 is .** ret
1a4d0 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
1a4e0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1a4f0 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  t fts5AllocateSe
1a500 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  gid(Fts5Index *p
1a510 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
1a520 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
1a530 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20   iSegid = 0;..  
1a540 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a550 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1a560 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1a570 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  t>=FTS5_MAX_SEGM
1a580 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ENT ){.      p->
1a590 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
1a5a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a5b0 20 20 20 77 68 69 6c 65 28 20 69 53 65 67 69 64     while( iSegid
1a5c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
1a5d0 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
1a5e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
1a5f0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
1a600 28 75 33 32 29 2c 20 28 76 6f 69 64 2a 29 26 69  (u32), (void*)&i
1a610 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
1a620 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 20  iSegid = iSegid 
1a630 26 20 28 28 31 20 3c 3c 20 46 54 53 35 5f 44 41  & ((1 << FTS5_DA
1a640 54 41 5f 49 44 5f 42 29 2d 31 29 3b 0a 20 20 20  TA_ID_B)-1);.   
1a650 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
1a660 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1a670 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1a680 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 53            for(iS
1a690 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
1a6a0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1a6b0 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1a6d0 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74 2d  iSegid==pStruct-
1a6e0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
1a6f0 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20  eg[iSeg].iSegid 
1a700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1a710 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 20 20 20   iSegid = 0;.   
1a720 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1a740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a750 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 53 65   }..  return iSe
1a760 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  gid;.}../*.** Di
1a770 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63  scard all data c
1a780 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
1a790 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c  in the hash-tabl
1a7a0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1a7b0 69 64 20 66 74 73 35 49 6e 64 65 78 44 69 73 63  id fts5IndexDisc
1a7c0 61 72 64 44 61 74 61 28 46 74 73 35 49 6e 64 65  ardData(Fts5Inde
1a7d0 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  x *p){.  assert(
1a7e0 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e   p->pHash || p->
1a7f0 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
1a800 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73  );.  if( p->pHas
1a810 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
1a820 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d  Fts5HashClear(p-
1a830 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e  >pHash);.    p->
1a840 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30  nPendingData = 0
1a850 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1a860 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1a870 66 20 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e  f the prefix, in
1a880 20 62 79 74 65 73 2c 20 74 68 61 74 20 62 75 66   bytes, that buf
1a890 66 65 72 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c  fer .** (pNew/<l
1a8a0 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20  ength-unknown>) 
1a8b0 73 68 61 72 65 73 20 77 69 74 68 20 62 75 66 66  shares with buff
1a8c0 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a  er (pOld/nOld)..
1a8d0 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 4e  **.** Buffer (pN
1a8e0 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f  ew/<length-unkno
1a8f0 77 6e 3e 29 20 69 73 20 67 75 61 72 61 6e 74 65  wn>) is guarante
1a900 65 64 20 74 6f 20 62 65 20 67 72 65 61 74 65 72  ed to be greater
1a910 20 0a 2a 2a 20 74 68 61 6e 20 62 75 66 66 65 72   .** than buffer
1a920 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f   (pOld/nOld)..*/
1a930 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1a940 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 69  PrefixCompress(i
1a950 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75  nt nOld, const u
1a960 38 20 2a 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75  8 *pOld, const u
1a970 38 20 2a 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20  8 *pNew){.  int 
1a980 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1a990 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
1a9a0 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65  if( pOld[i]!=pNe
1a9b0 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  w[i] ) break;.  
1a9c0 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
1a9d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a9e0 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
1a9f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1aa00 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
1aa10 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
1aa20 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20 20 20  nt bFlush       
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa40 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69 74 65  * If true, write
1aa50 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b 20 2a   dlidx to disk *
1aa60 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1aa70 61 73 73 65 72 74 28 20 62 46 6c 75 73 68 3d 3d  assert( bFlush==
1aa80 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e  0 || (pWriter->n
1aa90 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74  Dlidx>0 && pWrit
1aaa0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
1aab0 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28  f.n>0) );.  for(
1aac0 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
1aad0 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20  nDlidx; i++){.  
1aae0 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
1aaf0 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72  r *pDlidx = &pWr
1ab00 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
1ab10 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
1ab20 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61  >buf.n==0 ) brea
1ab30 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c 75 73  k;.    if( bFlus
1ab40 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
1ab50 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21  t( pDlidx->pgno!
1ab60 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  =0 );.      fts5
1ab70 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20  DataWrite(p, .  
1ab80 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
1ab90 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  DX_ROWID(pWriter
1aba0 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c  ->iSegid, i, pDl
1abb0 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20  idx->pgno),.    
1abc0 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75        pDlidx->bu
1abd0 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66  f.p, pDlidx->buf
1abe0 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .n.      );.    
1abf0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
1ac00 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c  5BufferZero(&pDl
1ac10 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70  idx->buf);.    p
1ac20 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1ac30 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 0;.  }.}../*
1ac40 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70 57 72  .** Grow the pWr
1ac50 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61  iter->aDlidx[] a
1ac60 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61 73 74  rray to at least
1ac70 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69   nLvl elements i
1ac80 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e  n size..** Any n
1ac90 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74  ew array element
1aca0 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62 65 66  s are zeroed bef
1acb0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1acc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1acd0 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
1ace0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1acf0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1ad00 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74   *pWriter,.  int
1ad10 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70   nLvl.){.  if( p
1ad20 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ad30 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72  && nLvl>=pWriter
1ad40 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ->nDlidx ){.    
1ad50 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
1ad60 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73 35 44  *aDlidx = (Fts5D
1ad70 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71 6c 69  lidxWriter*)sqli
1ad80 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
1ad90 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44       pWriter->aD
1ada0 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46 74 73  lidx, sizeof(Fts
1adb0 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20  5DlidxWriter) * 
1adc0 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  nLvl.    );.    
1add0 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b  if( aDlidx==0 ){
1ade0 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
1adf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1ae00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1ae10 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
1ae20 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
1ae30 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69  ) * (nLvl - pWri
1ae40 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20  ter->nDlidx);.  
1ae50 20 20 20 20 6d 65 6d 73 65 74 28 26 61 44 6c 69      memset(&aDli
1ae60 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  dx[pWriter->nDli
1ae70 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  dx], 0, nByte);.
1ae80 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61        pWriter->a
1ae90 44 6c 69 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a  Dlidx = aDlidx;.
1aea0 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e        pWriter->n
1aeb0 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20  Dlidx = nLvl;.  
1aec0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1aed0 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p->rc;.}../*.**
1aee0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1aef0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 63  doclist-index ac
1af00 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e 20 70 57  cumulating in pW
1af10 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20  riter->aDlidx[] 
1af20 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  is large.** enou
1af30 67 68 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20  gh, flush it to 
1af40 64 69 73 6b 20 61 6e 64 20 72 65 74 75 72 6e 20  disk and return 
1af50 31 2e 20 4f 74 68 65 72 77 69 73 65 20 64 69 73  1. Otherwise dis
1af60 63 61 72 64 20 69 74 20 61 6e 64 20 72 65 74 75  card it and retu
1af70 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rn.** zero..*/.s
1af80 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72  tatic int fts5Wr
1af90 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 46 74  iteFlushDlidx(Ft
1afa0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1afb0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1afc0 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67  er){.  int bFlag
1afd0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 0;..  /* If t
1afe0 68 65 72 65 20 77 65 72 65 20 46 54 53 35 5f 4d  here were FTS5_M
1aff0 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72  IN_DLIDX_SIZE or
1b000 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65 61 66   more empty leaf
1b010 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 20   pages written. 
1b020 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
1b030 61 73 65 2c 20 61 6c 73 6f 20 77 72 69 74 65 20  ase, also write 
1b040 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
1b050 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20  x to disk.  */. 
1b060 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 61 44   if( pWriter->aD
1b070 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20  lidx[0].buf.n>0 
1b080 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  && pWriter->nEmp
1b090 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ty>=FTS5_MIN_DLI
1b0a0 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 62  DX_SIZE ){.    b
1b0b0 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Flag = 1;.  }.  
1b0c0 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c  fts5WriteDlidxCl
1b0d0 65 61 72 28 70 2c 20 70 57 72 69 74 65 72 2c 20  ear(p, pWriter, 
1b0e0 62 46 6c 61 67 29 3b 0a 20 20 70 57 72 69 74 65  bFlag);.  pWrite
1b0f0 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20  r->nEmpty = 0;. 
1b100 20 72 65 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d   return bFlag;.}
1b110 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1b120 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1b130 77 68 65 6e 65 76 65 72 20 70 72 6f 63 65 73 73  whenever process
1b140 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  ing of the docli
1b150 73 74 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c  st for the .** l
1b160 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66  ast term on leaf
1b170 20 70 61 67 65 20 28 70 57 72 69 74 65 72 2d 3e   page (pWriter->
1b180 69 42 74 50 61 67 65 29 20 69 73 20 63 6f 6d 70  iBtPage) is comp
1b190 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  leted. .**.** Th
1b1a0 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
1b1b0 66 6f 72 20 74 68 61 74 20 74 65 72 6d 20 69 73  for that term is
1b1c0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1b1d0 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68  d in-memory with
1b1e0 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65  in the.** Fts5Se
1b1f0 67 57 72 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d  gWriter.aDlidx[]
1b200 20 61 72 72 61 79 2e 20 49 66 20 69 74 20 69 73   array. If it is
1b210 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20 74   large enough, t
1b220 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1b230 77 72 69 74 65 73 20 69 74 20 6f 75 74 20 74 6f  writes it out to
1b240 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74   disk. Or, if it
1b250 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f   is too small to
1b260 20 62 6f 74 68 65 72 20 77 69 74 68 2c 20 64 69   bother with, di
1b270 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a  scards.** it..**
1b280 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74 65  .** Fts5SegWrite
1b290 72 2e 62 74 74 65 72 6d 20 63 75 72 72 65 6e 74  r.btterm current
1b2a0 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ly contains the 
1b2b0 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61  first term on pa
1b2c0 67 65 20 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73  ge iBtPage..*/.s
1b2d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1b2e0 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 46  riteFlushBtree(F
1b2f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
1b300 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1b310 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61  ter){.  int bFla
1b320 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  g;..  assert( pW
1b330 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 7c  riter->iBtPage |
1b340 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74  | pWriter->nEmpt
1b350 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 57  y==0 );.  if( pW
1b360 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d  riter->iBtPage==
1b370 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 62 46  0 ) return;.  bF
1b380 6c 61 67 20 3d 20 66 74 73 35 57 72 69 74 65 46  lag = fts5WriteF
1b390 6c 75 73 68 44 6c 69 64 78 28 70 2c 20 70 57 72  lushDlidx(p, pWr
1b3a0 69 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d  iter);..  if( p-
1b3b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1b3c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1b3d0 20 2a 7a 20 3d 20 28 70 57 72 69 74 65 72 2d 3e   *z = (pWriter->
1b3e0 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73  btterm.n>0?(cons
1b3f0 74 20 63 68 61 72 2a 29 70 57 72 69 74 65 72 2d  t char*)pWriter-
1b400 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20  >btterm.p:"");. 
1b410 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
1b420 69 6e 67 20 77 61 73 20 61 6c 72 65 61 64 79 20  ing was already 
1b430 64 6f 6e 65 20 69 6e 20 66 74 73 35 57 72 69 74  done in fts5Writ
1b440 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20  eInit(): */.    
1b450 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  /* sqlite3_bind_
1b460 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65  int(p->pIdxWrite
1b470 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69  r, 1, pWriter->i
1b480 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73  Segid); */.    s
1b490 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
1b4a0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1b4b0 32 2c 20 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62  2, z, pWriter->b
1b4c0 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f  tterm.n, SQLITE_
1b4d0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
1b4e0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
1b4f0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 33  p->pIdxWriter, 3
1b500 2c 20 62 46 6c 61 67 20 2b 20 28 28 69 36 34 29  , bFlag + ((i64)
1b510 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1b520 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  <<1));.    sqlit
1b530 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 57  e3_step(p->pIdxW
1b540 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  riter);.    p->r
1b550 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
1b560 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29  t(p->pIdxWriter)
1b570 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d  ;.  }.  pWriter-
1b580 3e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a  >iBtPage = 0;.}.
1b590 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
1b5a0 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
1b5b0 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 65 78  ach leaf page ex
1b5c0 63 65 70 74 20 74 68 65 20 66 69 72 73 74 20 74  cept the first t
1b5d0 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
1b5e0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72  at least one ter
1b5f0 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65  m. Argument (nTe
1b600 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65  rm/pTerm) is the
1b610 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74   split-key - a t
1b620 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c  erm that.** is l
1b630 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74  arger than all t
1b640 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20  erms written to 
1b650 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20  earlier leaves, 
1b660 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a  and equal to or.
1b670 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ** smaller than 
1b680 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
1b690 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a  n the new leaf..
1b6a0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1b6b0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1b6c0 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
1b6d0 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e  in Fts5Index.rc.
1b6e0 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   If an error.** 
1b6f0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
1b700 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
1b710 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1b720 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
1b730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b740 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54   fts5WriteBtreeT
1b750 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
1b760 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1b770 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1b780 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1b790 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1b7a0 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
1b7b0 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
1b7c0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ect */.  int nTe
1b7d0 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  rm, const u8 *pT
1b7e0 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73  erm      /* Firs
1b7f0 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61  t term on new pa
1b800 67 65 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57  ge */.){.  fts5W
1b810 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 70  riteFlushBtree(p
1b820 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 66 74  , pWriter);.  ft
1b830 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
1b840 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 62 74  rc, &pWriter->bt
1b850 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
1b860 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  rm);.  pWriter->
1b870 69 42 74 50 61 67 65 20 3d 20 70 57 72 69 74 65  iBtPage = pWrite
1b880 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a  r->writer.pgno;.
1b890 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1b8a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1b8b0 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 61   when flushing a
1b8c0 20 6c 65 61 66 20 70 61 67 65 20 74 68 61 74 20   leaf page that 
1b8d0 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74  contains no.** t
1b8e0 65 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20 64  erms at all to d
1b8f0 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  isk..*/.static v
1b900 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
1b910 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35  eeNoTerm(.  Fts5
1b920 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1b930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b940 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1b950 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ct */.  Fts5SegW
1b960 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20  riter *pWriter  
1b970 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1b980 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
1b990 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72   /* If there wer
1b9a0 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74  e no rowids on t
1b9b0 68 65 20 6c 65 61 66 20 70 61 67 65 20 65 69 74  he leaf page eit
1b9c0 68 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63 6c  her and the docl
1b9d0 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68  ist-index.  ** h
1b9e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1b9f0 73 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64 20  started, append 
1ba00 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20  an 0x00 byte to 
1ba10 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  it.  */.  if( pW
1ba20 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1ba30 69 64 49 6e 50 61 67 65 20 26 26 20 70 57 72 69  idInPage && pWri
1ba40 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
1ba50 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74  uf.n>0 ){.    Ft
1ba60 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
1ba70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1ba80 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20  ->aDlidx[0];.   
1ba90 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
1baa0 3e 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20  >bPrevValid );. 
1bab0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1bac0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1bad0 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1bae0 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ->buf, 0);.  }..
1baf0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1bb00 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65  he "number of se
1bb10 71 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73 20  quential leaves 
1bb20 77 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22 20  without a term" 
1bb30 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57  counter. */.  pW
1bb40 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b  riter->nEmpty++;
1bb50 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66  .}..static i64 f
1bb60 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46  ts5DlidxExtractF
1bb70 69 72 73 74 52 6f 77 69 64 28 46 74 73 35 42 75  irstRowid(Fts5Bu
1bb80 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 69  ffer *pBuf){.  i
1bb90 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74  64 iRowid;.  int
1bba0 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d   iOff;..  iOff =
1bbb0 20 31 20 2b 20 66 74 73 35 47 65 74 56 61 72 69   1 + fts5GetVari
1bbc0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20  nt(&pBuf->p[1], 
1bbd0 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
1bbe0 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
1bbf0 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  &pBuf->p[iOff], 
1bc00 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
1bc10 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64 3b    return iRowid;
1bc20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20  .}../*.** Rowid 
1bc30 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20  iRowid has just 
1bc40 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f  been appended to
1bc50 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1bc60 66 20 70 61 67 65 2e 20 49 74 20 69 73 20 74 68  f page. It is th
1bc70 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74 68  e.** first on th
1bc80 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
1bc90 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e  ction appends an
1bca0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
1bcb0 72 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ry to the curren
1bcc0 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64  t.** doclist-ind
1bcd0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
1bce0 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  id fts5WriteDlid
1bcf0 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49  xAppend(.  Fts5I
1bd00 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1bd10 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1bd20 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  er, .  i64 iRowi
1bd30 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  d.){.  int i;.  
1bd40 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a  int bDone = 0;..
1bd50 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
1bd60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
1bd70 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  Done==0; i++){. 
1bd80 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
1bd90 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
1bda0 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69   *pDlidx = &pWri
1bdb0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
1bdc0 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
1bdd0 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
1bde0 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
1bdf0 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
1be00 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70   doclist-index p
1be10 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69  age is full. Wri
1be20 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e  te it to disk an
1be30 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a 20  d push.      ** 
1be40 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69 64  a copy of iRowid
1be50 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63   (which will bec
1be60 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20 72 6f  ome the first ro
1be70 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a  wid on the next.
1be80 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74        ** doclist
1be90 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67 65  -index leaf page
1bea0 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e 65  ) up into the ne
1beb0 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  xt level of the 
1bec0 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a  b-tree .      **
1bed0 20 68 69 65 72 61 72 63 68 79 2e 20 49 66 20 74   hierarchy. If t
1bee0 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c  he node being fl
1bef0 75 73 68 65 64 20 69 73 20 63 75 72 72 65 6e 74  ushed is current
1bf00 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ly the root node
1bf10 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ,.      ** also 
1bf20 70 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72  push its first r
1bf30 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a 2f  owid upwards. */
1bf40 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  .      pDlidx->b
1bf50 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20  uf.p[0] = 0x01; 
1bf60 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f     /* Not the ro
1bf70 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20  ot node */.     
1bf80 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
1bf90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53  , .          FTS
1bfa0 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57  5_DLIDX_ROWID(pW
1bfb0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
1bfc0 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c  , pDlidx->pgno),
1bfd0 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64  .          pDlid
1bfe0 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78  x->buf.p, pDlidx
1bff0 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b  ->buf.n.      );
1c000 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1c010 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72  DlidxGrow(p, pWr
1c020 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20  iter, i+2);.    
1c030 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69    pDlidx = &pWri
1c040 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
1c050 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1c060 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
1c070 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30  lidx[1].buf.n==0
1c080 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
1c090 69 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c 69  iFirst = fts5Dli
1c0a0 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
1c0b0 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75 66  wid(&pDlidx->buf
1c0c0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
1c0d0 68 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f 74  his was the root
1c0e0 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73 20   node. Push its 
1c0f0 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 20 74  first rowid up t
1c100 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20  o the new root. 
1c110 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  */.        pDlid
1c120 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69  x[1].pgno = pDli
1c130 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  dx->pgno;.      
1c140 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1c150 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1c160 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
1c170 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20  1].buf, 0);.    
1c180 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1c190 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1c1a0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1c1b0 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78  x[1].buf, pDlidx
1c1c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1c1d0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1c1e0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1c1f0 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
1c200 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b 0a  ].buf, iFirst);.
1c210 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
1c220 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31  ].bPrevValid = 1
1c230 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  ;.        pDlidx
1c240 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69 72  [1].iPrev = iFir
1c250 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  st;.      }..   
1c260 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1c270 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
1c280 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70 44  ->buf);.      pD
1c290 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
1c2a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c 69   = 0;.      pDli
1c2b0 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20  dx->pgno++;.    
1c2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44 6f  }else{.      bDo
1c2d0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ne = 1;.    }.. 
1c2e0 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62     if( pDlidx->b
1c2f0 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20  PrevValid ){.   
1c300 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
1c310 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76   - pDlidx->iPrev
1c320 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c330 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20 28     i64 iPgno = (
1c340 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e  i==0 ? pWriter->
1c350 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44  writer.pgno : pD
1c360 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a  lidx[-1].pgno);.
1c370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
1c380 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29  lidx->buf.n==0 )
1c390 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
1c3a0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1c3b0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1c3c0 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f  Dlidx->buf, !bDo
1c3d0 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ne);.      sqlit
1c3e0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1c3f0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1c400 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69   &pDlidx->buf, i
1c410 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56 61  Pgno);.      iVa
1c420 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  l = iRowid;.    
1c430 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  }..    sqlite3Ft
1c440 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1c450 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1c460 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29  lidx->buf, iVal)
1c470 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50  ;.    pDlidx->bP
1c480 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  revValid = 1;.  
1c490 20 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 20    pDlidx->iPrev 
1c4a0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a  = iRowid;.  }.}.
1c4b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1c4c0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1c4d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1c4e0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1c4f0 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  iter){.  static 
1c500 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20  const u8 zero[] 
1c510 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20  = { 0x00, 0x00, 
1c520 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x00, 0x00 };.  
1c530 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1c540 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1c550 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34 20  ->writer;.  i64 
1c560 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72  iRowid;..  asser
1c570 74 28 20 28 70 50 61 67 65 2d 3e 70 67 69 64 78  t( (pPage->pgidx
1c580 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65 72  .n==0)==(pWriter
1c590 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1c5a0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  ge) );..  /* Set
1c5b0 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64   the szLeaf head
1c5c0 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61  er field. */.  a
1c5d0 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65  ssert( 0==fts5Ge
1c5e0 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
1c5f0 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73 35  .p[2]) );.  fts5
1c600 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  PutU16(&pPage->b
1c610 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 70 50  uf.p[2], (u16)pP
1c620 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20  age->buf.n);..  
1c630 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1c640 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
1c650 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20  .    /* No term 
1c660 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  was written to t
1c670 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  his page. */.   
1c680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1c690 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20  pgidx.n==0 );.  
1c6a0 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
1c6b0 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65  NoTerm(p, pWrite
1c6c0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1c6d0 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70   /* Append the p
1c6e0 67 69 64 78 20 74 6f 20 74 68 65 20 70 61 67 65  gidx to the page
1c6f0 20 62 75 66 66 65 72 2e 20 53 65 74 20 74 68 65   buffer. Set the
1c700 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66   szLeaf header f
1c710 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73  ield. */.    fts
1c720 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1c730 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1c740 2d 3e 62 75 66 2c 20 70 50 61 67 65 2d 3e 70 67  ->buf, pPage->pg
1c750 69 64 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67  idx.n, pPage->pg
1c760 69 64 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  idx.p);.  }..  /
1c770 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
1c780 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a   out to disk */.
1c790 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
1c7a0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
1c7b0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70  riter->iSegid, p
1c7c0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66  Page->pgno);.  f
1c7d0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
1c7e0 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62  iRowid, pPage->b
1c7f0 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66  uf.p, pPage->buf
1c800 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .n);..  /* Initi
1c810 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70  alize the next p
1c820 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
1c830 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d  fferZero(&pPage-
1c840 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66  >buf);.  fts5Buf
1c850 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e  ferZero(&pPage->
1c860 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75  pgidx);.  fts5Bu
1c870 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1c880 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1c890 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20  uf, 4, zero);.  
1c8a0 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
1c8b0 78 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  x = 0;.  pPage->
1c8c0 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e  pgno++;..  /* In
1c8d0 63 72 65 61 73 65 20 74 68 65 20 6c 65 61 76 65  crease the leave
1c8e0 73 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65  s written counte
1c8f0 72 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  r */.  pWriter->
1c900 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a  nLeafWritten++;.
1c910 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65  .  /* The new le
1c920 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d  af holds no term
1c930 73 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20  s or rowids */. 
1c940 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1c950 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a  TermInPage = 1;.
1c960 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1c970 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31  tRowidInPage = 1
1c980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1c990 64 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65  d term pTerm/nTe
1c9a0 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e  rm to the segmen
1c9b0 74 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  t being written 
1c9c0 62 79 20 74 68 65 20 77 72 69 74 65 72 20 70 61  by the writer pa
1c9d0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73  ssed.** as the s
1c9e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
1c9f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1ca00 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68  r occurs, set th
1ca10 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
1ca20 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e  rror code. If an
1ca30 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
1ca40 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1ca50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1ca60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1ca70 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1ca80 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  iteAppendTerm(. 
1ca90 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1caa0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1cab0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
1cac0 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20  nTerm, const u8 
1cad0 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74  *pTerm .){.  int
1cae0 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb00 42 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20  Bytes of prefix 
1cb10 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20  compression for 
1cb20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61  term */.  Fts5Pa
1cb30 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1cb40 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1cb50 65 72 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  er;.  Fts5Buffer
1cb60 20 2a 70 50 67 69 64 78 20 3d 20 26 70 57 72 69   *pPgidx = &pWri
1cb70 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64  ter->writer.pgid
1cb80 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  x;..  assert( p-
1cb90 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1cba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1cbb0 65 2d 3e 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20  e->buf.n>=4 );. 
1cbc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1cbd0 62 75 66 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74  buf.n>4 || pWrit
1cbe0 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1cbf0 50 61 67 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Page );..  /* If
1cc00 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1cc10 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20  f page is full, 
1cc20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b  flush it to disk
1cc30 2e 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 67  . */.  if( (pPag
1cc40 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 67 69 64  e->buf.n + pPgid
1cc50 78 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32  x->n + nTerm + 2
1cc60 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  )>=p->pConfig->p
1cc70 67 73 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  gsz ){.    if( p
1cc80 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b  Page->buf.n>4 ){
1cc90 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1cca0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1ccb0 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  iter);.    }.   
1ccc0 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28   fts5BufferGrow(
1ccd0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1cce0 62 75 66 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f  buf, nTerm+FTS5_
1ccf0 44 41 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20  DATA_PADDING);. 
1cd00 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31   }.  .  /* TODO1
1cd10 3a 20 55 70 64 61 74 69 6e 67 20 70 67 69 64 78  : Updating pgidx
1cd20 20 68 65 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69   here. */.  pPgi
1cd30 64 78 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  dx->n += sqlite3
1cd40 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 0a 20  Fts5PutVarint(. 
1cd50 20 20 20 20 20 26 70 50 67 69 64 78 2d 3e 70 5b       &pPgidx->p[
1cd60 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67  pPgidx->n], pPag
1cd70 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67 65  e->buf.n - pPage
1cd80 2d 3e 69 50 72 65 76 50 67 69 64 78 0a 20 20 29  ->iPrevPgidx.  )
1cd90 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76  ;.  pPage->iPrev
1cda0 50 67 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 62  Pgidx = pPage->b
1cdb0 75 66 2e 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74  uf.n;.#if 0.  ft
1cdc0 73 35 50 75 74 55 31 36 28 26 70 50 67 69 64 78  s5PutU16(&pPgidx
1cdd0 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20  ->p[pPgidx->n], 
1cde0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
1cdf0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b   pPgidx->n += 2;
1ce00 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
1ce10 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1ce20 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  rmInPage ){.    
1ce30 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20  nPrefix = 0;.   
1ce40 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f   if( pPage->pgno
1ce50 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=1 ){.      /* 
1ce60 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  This is the firs
1ce70 74 20 74 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66  t term on a leaf
1ce80 20 74 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65   that is not the
1ce90 20 6c 65 66 74 6d 6f 73 74 20 6c 65 61 66 20 69   leftmost leaf i
1cea0 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  n.      ** the s
1ceb0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 49  egment b-tree. I
1cec0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
1ced0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
1cee0 64 64 20 61 20 74 65 72 6d 20 74 6f 0a 20 20 20  dd a term to.   
1cef0 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65     ** the b-tree
1cf00 20 68 69 65 72 61 72 63 68 79 20 74 68 61 74 20   hierarchy that 
1cf10 69 73 20 28 61 29 20 6c 61 72 67 65 72 20 74 68  is (a) larger th
1cf20 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 74  an the largest t
1cf30 65 72 6d 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c  erm .      ** al
1cf40 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
1cf50 20 74 68 65 20 73 65 67 6d 65 6e 74 20 61 6e 64   the segment and
1cf60 20 28 62 29 20 73 6d 61 6c 6c 65 72 20 74 68 61   (b) smaller tha
1cf70 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20  n or equal to.  
1cf80 20 20 20 20 2a 2a 20 74 68 69 73 20 74 65 72 6d      ** this term
1cf90 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
1cfa0 2c 20 61 20 70 72 65 66 69 78 20 6f 66 20 28 70  , a prefix of (p
1cfb0 54 65 72 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74  Term/nTerm) that
1cfc0 20 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   is one.      **
1cfd0 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61   byte longer tha
1cfe0 6e 20 74 68 65 20 6c 6f 6e 67 65 73 74 20 70 72  n the longest pr
1cff0 65 66 69 78 20 28 70 54 65 72 6d 2f 6e 54 65 72  efix (pTerm/nTer
1d000 6d 29 20 73 68 61 72 65 73 20 77 69 74 68 20 74  m) shares with t
1d010 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 76  he.      ** prev
1d020 69 6f 75 73 20 74 65 72 6d 2e 20 0a 20 20 20 20  ious term. .    
1d030 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73    **.      ** Us
1d040 75 61 6c 6c 79 2c 20 74 68 65 20 70 72 65 76 69  ually, the previ
1d050 6f 75 73 20 74 65 72 6d 20 69 73 20 61 76 61 69  ous term is avai
1d060 6c 61 62 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e  lable in pPage->
1d070 74 65 72 6d 2e 20 54 68 65 20 65 78 63 65 70 74  term. The except
1d080 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ion.      ** is 
1d090 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1d0a0 69 72 73 74 20 74 65 72 6d 20 77 72 69 74 74 65  irst term writte
1d0b0 6e 20 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e  n in an incremen
1d0c0 74 61 6c 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a  tal-merge step..
1d0d0 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
1d0e0 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
1d0f0 75 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61  us term is not a
1d100 76 61 69 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73  vailable, so jus
1d110 74 20 77 72 69 74 65 20 61 0a 20 20 20 20 20 20  t write a.      
1d120 2a 2a 20 63 6f 70 79 20 6f 66 20 28 70 54 65 72  ** copy of (pTer
1d130 6d 2f 6e 54 65 72 6d 29 20 69 6e 74 6f 20 74 68  m/nTerm) into th
1d140 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54  e parent node. T
1d150 68 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a  his is slightly.
1d160 20 20 20 20 20 20 2a 2a 20 69 6e 65 66 66 69 63        ** ineffic
1d170 69 65 6e 74 2c 20 62 75 74 20 73 74 69 6c 6c 20  ient, but still 
1d180 63 6f 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20  correct.  */.   
1d190 20 20 20 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d     int n = nTerm
1d1a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
1d1b0 65 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20  e->term.n ){.   
1d1c0 20 20 20 20 20 6e 20 3d 20 31 20 2b 20 66 74 73       n = 1 + fts
1d1d0 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
1d1e0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70  pPage->term.n, p
1d1f0 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54  Page->term.p, pT
1d200 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  erm);.      }.  
1d210 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
1d220 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65  eeTerm(p, pWrite
1d230 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20  r, n, pTerm);.  
1d240 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72      pPage = &pWr
1d250 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
1d260 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1d270 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35 50   nPrefix = fts5P
1d280 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
1d290 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61  age->term.n, pPa
1d2a0 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72  ge->term.p, pTer
1d2b0 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  m);.    fts5Buff
1d2c0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d2d0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1d2e0 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  uf, nPrefix);.  
1d2f0 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
1d300 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1d310 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20  es of new data, 
1d320 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61  then the term da
1d330 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74  ta itself.  ** t
1d340 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  o the page. */. 
1d350 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1d360 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1d370 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
1d380 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20  rm - nPrefix);. 
1d390 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1d3a0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1d3b0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
1d3c0 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65   - nPrefix, &pTe
1d3d0 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20  rm[nPrefix]);.. 
1d3e0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46   /* Update the F
1d3f0 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65  ts5PageWriter.te
1d400 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66  rm field. */.  f
1d410 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
1d420 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72  >rc, &pPage->ter
1d430 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
1d440 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
1d450 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1d460 30 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62  0;..  pWriter->b
1d470 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1d480 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 0;.  pWriter-
1d490 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
1d4a0 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73  clist = 1;..  as
1d4b0 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28  sert( p->rc || (
1d4c0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e  pWriter->nDlidx>
1d4d0 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44  0 && pWriter->aD
1d4e0 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30  lidx[0].buf.n==0
1d4f0 29 20 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ) );.  pWriter->
1d500 61 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d  aDlidx[0].pgno =
1d510 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a   pPage->pgno;.}.
1d520 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1d530 72 6f 77 69 64 20 61 6e 64 20 70 6f 73 69 74 69  rowid and positi
1d540 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
1d550 6c 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 72  ld to the writer
1d560 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74  s output. .*/.st
1d570 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1d580 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a  iteAppendRowid(.
1d590 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1d5a0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1d5b0 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34   *pWriter,.  i64
1d5c0 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28   iRowid.){.  if(
1d5d0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d5e0 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  K ){.    Fts5Pag
1d5f0 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
1d600 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1d610 72 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50 61  r;..    if( (pPa
1d620 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67  ge->buf.n + pPag
1d630 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e  e->pgidx.n)>=p->
1d640 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
1d650 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1d660 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1d670 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  iter);.    }..  
1d680 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1d690 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
1d6a0 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f  rowid written to
1d6b0 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
1d6c0 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  he .    ** rowid
1d6d0 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
1d6e0 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
1d6f0 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
1d700 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
1d710 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20    ** buffer, in 
1d720 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  case a doclist-i
1d730 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64  ndex is required
1d740 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  .  */.    if( pW
1d750 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1d760 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
1d770 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61    fts5PutU16(pPa
1d780 67 65 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36 29  ge->buf.p, (u16)
1d790 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
1d7a0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
1d7b0 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72  idxAppend(p, pWr
1d7c0 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
1d7d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69     }..    /* Wri
1d7e0 74 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f  te the rowid. */
1d7f0 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
1d800 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
1d810 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65  oclist || pWrite
1d820 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1d830 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
1d840 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1d850 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1d860 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  age->buf, iRowid
1d870 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d880 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
1d890 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72 69  c || iRowid>pWri
1d8a0 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20  ter->iPrevRowid 
1d8b0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
1d8c0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d8d0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1d8e0 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 70 57  buf, iRowid - pW
1d8f0 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1d900 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
1d910 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1d920 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  d = iRowid;.    
1d930 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1d940 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
1d950 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  0;.    pWriter->
1d960 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1d970 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  e = 0;.  }.}..st
1d980 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1d990 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
1d9a0 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65  Data(.  Fts5Inde
1d9b0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1d9c0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1d9d0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44   .  const u8 *aD
1d9e0 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74  ata, .  int nDat
1d9f0 61 0a 29 7b 0a 20 20 46 74 73 35 50 61 67 65 57  a.){.  Fts5PageW
1da00 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
1da10 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1da20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d  .  const u8 *a =
1da30 20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20   aData;.  int n 
1da40 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20 61 73  = nData;.  .  as
1da50 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67  sert( p->pConfig
1da60 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68  ->pgsz>0 );.  wh
1da70 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1da80 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 28  TE_OK .     && (
1da90 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70  pPage->buf.n + p
1daa0 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 20 2b 20  Page->pgidx.n + 
1dab0 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  n)>=p->pConfig->
1dac0 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20 20 20 69  pgsz .  ){.    i
1dad0 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f  nt nReq = p->pCo
1dae0 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61  nfig->pgsz - pPa
1daf0 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67  ge->buf.n - pPag
1db00 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20 20 20 20  e->pgidx.n;.    
1db10 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20  int nCopy = 0;. 
1db20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c     while( nCopy<
1db30 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20 69 36  nReq ){.      i6
1db40 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e  4 dummy;.      n
1db50 43 6f 70 79 20 2b 3d 20 66 74 73 35 47 65 74 56  Copy += fts5GetV
1db60 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c  arint(&a[nCopy],
1db70 20 28 75 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a   (u64*)&dummy);.
1db80 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
1db90 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1dba0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1dbb0 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20  uf, nCopy, a);. 
1dbc0 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20     a += nCopy;. 
1dbd0 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20     n -= nCopy;. 
1dbe0 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1dbf0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
1dc00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  );.  }.  if( n>0
1dc10 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
1dc20 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1dc30 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1dc40 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  , n, a);.  }.}..
1dc50 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
1dc60 64 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74  data cached by t
1dc70 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74  he writer object
1dc80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1dc90 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c  . Free any.** al
1dca0 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
1dcb0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72  ated with the wr
1dcc0 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iter..*/.static 
1dcd0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69  void fts5WriteFi
1dce0 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  nish(.  Fts5Inde
1dcf0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1dd00 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1dd10 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1dd20 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1dd30 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20  nt *pnLeaf      
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dd50 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
1dd60 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e 20 62   leaf pages in b
1dd70 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  -tree */.){.  in
1dd80 74 20 69 3b 0a 20 20 46 74 73 35 50 61 67 65 57  t i;.  Fts5PageW
1dd90 72 69 74 65 72 20 2a 70 4c 65 61 66 20 3d 20 26  riter *pLeaf = &
1dda0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1ddb0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1ddc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1ddd0 73 73 65 72 74 28 20 70 4c 65 61 66 2d 3e 70 67  ssert( pLeaf->pg
1dde0 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  no>=1 );.    if(
1ddf0 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e 34 20   pLeaf->buf.n>4 
1de00 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
1de10 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
1de20 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Writer);.    }. 
1de30 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65     *pnLeaf = pLe
1de40 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20  af->pgno-1;.    
1de50 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74  fts5WriteFlushBt
1de60 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b  ree(p, pWriter);
1de70 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
1de80 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 74 65  rFree(&pLeaf->te
1de90 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  rm);.  fts5Buffe
1dea0 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 62 75  rFree(&pLeaf->bu
1deb0 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  f);.  fts5Buffer
1dec0 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 70 67 69  Free(&pLeaf->pgi
1ded0 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  dx);.  fts5Buffe
1dee0 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e  rFree(&pWriter->
1def0 62 74 74 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28  btterm);..  for(
1df00 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
1df10 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20  nDlidx; i++){.  
1df20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1df30 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72  ferFree(&pWriter
1df40 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66 29  ->aDlidx[i].buf)
1df50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1df60 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44  free(pWriter->aD
1df70 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  lidx);.}..static
1df80 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49   void fts5WriteI
1df90 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
1dfa0 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1dfb0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
1dfc0 0a 20 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b  .  int iSegid.){
1dfd0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
1dfe0 66 66 65 72 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  ffer = p->pConfi
1dff0 67 2d 3e 70 67 73 7a 20 2b 20 46 54 53 35 5f 44  g->pgsz + FTS5_D
1e000 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 0a 20 20  ATA_PADDING;..  
1e010 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
1e020 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
1e030 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72  gWriter));.  pWr
1e040 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69  iter->iSegid = i
1e050 53 65 67 69 64 3b 0a 0a 20 20 66 74 73 35 57 72  Segid;..  fts5Wr
1e060 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20  iteDlidxGrow(p, 
1e070 70 57 72 69 74 65 72 2c 20 31 29 3b 0a 20 20 70  pWriter, 1);.  p
1e080 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1e090 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  gno = 1;.  pWrit
1e0a0 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1e0b0 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69  Page = 1;.  pWri
1e0c0 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 31  ter->iBtPage = 1
1e0d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 72  ;..  assert( pWr
1e0e0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1e0f0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  .n==0 );.  asser
1e100 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74  t( pWriter->writ
1e110 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b  er.pgidx.n==0 );
1e120 0a 0a 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20  ..  /* Grow the 
1e130 74 77 6f 20 62 75 66 66 65 72 73 20 74 6f 20 70  two buffers to p
1e140 67 73 7a 20 2b 20 70 61 64 64 69 6e 67 20 62 79  gsz + padding by
1e150 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a  tes in size. */.
1e160 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1e170 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
1e180 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1e190 2e 70 67 69 64 78 2c 20 6e 42 75 66 66 65 72 29  .pgidx, nBuffer)
1e1a0 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  ;.  sqlite3Fts5B
1e1b0 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
1e1c0 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  , &pWriter->writ
1e1d0 65 72 2e 62 75 66 2c 20 6e 42 75 66 66 65 72 29  er.buf, nBuffer)
1e1e0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78  ;..  if( p->pIdx
1e1f0 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  Writer==0 ){.   
1e200 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
1e210 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
1e220 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
1e230 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
1e240 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 73  p->pIdxWriter, s
1e250 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
1e260 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
1e270 54 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f  T INTO '%q'.'%q_
1e280 69 64 78 27 28 73 65 67 69 64 2c 74 65 72 6d 2c  idx'(segid,term,
1e290 70 67 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c 3f  pgno) VALUES(?,?
1e2a0 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ,?)", .         
1e2b0 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
1e2c0 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
1e2d0 20 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28    ));.  }..  if(
1e2e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e2f0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  K ){.    /* Init
1e300 69 61 6c 69 7a 65 20 74 68 65 20 34 2d 62 79 74  ialize the 4-byt
1e310 65 20 6c 65 61 66 2d 70 61 67 65 20 68 65 61 64  e leaf-page head
1e320 65 72 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a 20  er to 0x00. */. 
1e330 20 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65     memset(pWrite
1e340 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 70 2c  r->writer.buf.p,
1e350 20 30 2c 20 34 29 3b 0a 20 20 20 20 70 57 72 69   0, 4);.    pWri
1e360 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e  ter->writer.buf.
1e370 6e 20 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20 42  n = 4;..    /* B
1e380 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
1e390 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69  output segment i
1e3a0 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2d 77  d to the index-w
1e3b0 72 69 74 65 72 2e 20 54 68 69 73 20 69 73 20 61  riter. This is a
1e3c0 6e 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a  n.    ** optimiz
1e3d0 61 74 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64 69  ation over bindi
1e3e0 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  ng the same valu
1e3f0 65 20 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 20  e over and over 
1e400 61 73 20 72 6f 77 73 20 61 72 65 0a 20 20 20 20  as rows are.    
1e410 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
1e420 20 25 5f 69 64 78 20 62 79 20 74 68 65 20 63 75   %_idx by the cu
1e430 72 72 65 6e 74 20 77 72 69 74 65 72 2e 20 20 2a  rrent writer.  *
1e440 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  /.    sqlite3_bi
1e450 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72  nd_int(p->pIdxWr
1e460 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72  iter, 1, pWriter
1e470 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d  ->iSegid);.  }.}
1e480 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
1e490 20 70 49 74 65 72 20 77 61 73 20 75 73 65 64 20   pIter was used 
1e4a0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1e4b0 67 68 20 74 68 65 20 69 6e 70 75 74 20 73 65 67  gh the input seg
1e4c0 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a  ments of on an.*
1e4d0 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * incremental me
1e4e0 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  rge operation. T
1e4f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e500 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e  called if the in
1e510 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72  cremental.** mer
1e520 67 65 20 73 74 65 70 20 68 61 73 20 66 69 6e 69  ge step has fini
1e530 73 68 65 64 20 62 75 74 20 74 68 65 20 69 6e 70  shed but the inp
1e540 75 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ut has not been 
1e550 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75  completely exhau
1e560 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
1e570 76 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65 67  void fts5TrimSeg
1e580 6d 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20  ments(Fts5Index 
1e590 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
1e5a0 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ter){.  int i;. 
1e5b0 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
1e5c0 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20  .  memset(&buf, 
1e5d0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
1e5e0 66 66 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d  ffer));.  for(i=
1e5f0 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
1e600 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
1e610 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
1e620 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
1e630 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
1e640 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Seg==0 ){.      
1e650 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
1e660 7d 65 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e  }else if( pSeg->
1e670 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
1e680 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72    /* All keys fr
1e690 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 65  om this input se
1e6a0 67 6d 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20  gment have been 
1e6b0 74 72 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68  transfered to th
1e6c0 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  e output..      
1e6d0 2a 2a 20 53 65 74 20 62 6f 74 68 20 74 68 65 20  ** Set both the 
1e6e0 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70  first and last p
1e6f0 61 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30  age-numbers to 0
1e700 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1e710 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  t the.      ** s
1e720 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d  egment is now em
1e730 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53  pty. */.      pS
1e740 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  eg->pSeg->pgnoLa
1e750 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  st = 0;.      pS
1e760 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eg->pSeg->pgnoFi
1e770 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rst = 0;.    }el
1e780 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f  se{.      int iO
1e790 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d  ff = pSeg->iTerm
1e7a0 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20  LeafOffset;     
1e7b0 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77  /* Offset on new
1e7c0 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65   first leaf page
1e7d0 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c   */.      i64 iL
1e7e0 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  eafRowid;.      
1e7f0 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
1e800 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d  .      int iId =
1e810 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65   pSeg->pSeg->iSe
1e820 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48  gid;.      u8 aH
1e830 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30  dr[4] = {0x00, 0
1e840 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d  x00, 0x00, 0x00}
1e850 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f  ;..      iLeafRo
1e860 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
1e870 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53  NT_ROWID(iId, pS
1e880 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  eg->iTermLeafPgn
1e890 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20  o);.      pData 
1e8a0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
1e8b0 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  , iLeafRowid);. 
1e8c0 20 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29       if( pData )
1e8d0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
1e8e0 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a  fferZero(&buf);.
1e8f0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1e900 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26  erGrow(&p->rc, &
1e910 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b  buf, pData->nn);
1e920 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1e930 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1e940 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65  ->rc, &buf, size
1e950 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b  of(aHdr), aHdr);
1e960 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1e970 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1e980 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
1e990 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  eg->term.n);.   
1e9a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1e9b0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1e9c0 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
1e9d0 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d  rm.n, pSeg->term
1e9e0 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .p);.        fts
1e9f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1ea00 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
1ea10 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f  pData->szLeaf-iO
1ea20 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f  ff, &pData->p[iO
1ea30 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ff]);.        if
1ea40 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1ea50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ea60 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  /* Set the szLea
1ea70 66 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20  f field */.     
1ea80 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28       fts5PutU16(
1ea90 26 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29  &buf.p[2], (u16)
1eaa0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  buf.n);.        
1eab0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  }..        /* Se
1eac0 74 20 75 70 20 74 68 65 20 6e 65 77 20 70 61 67  t up the new pag
1ead0 65 2d 69 6e 64 65 78 20 61 72 72 61 79 20 2a 2f  e-index array */
1eae0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1eaf0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1eb00 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29  &p->rc, &buf, 4)
1eb10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
1eb20 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70  eg->iLeafPgno==p
1eb30 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
1eb40 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  no .         && 
1eb50 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  pSeg->iEndofDocl
1eb60 69 73 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61  ist<pData->szLea
1eb70 66 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  f .        ){.  
1eb80 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 69 66          int nDif
1eb90 66 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61  f = pData->szLea
1eba0 66 20 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66  f - pSeg->iEndof
1ebb0 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20  Doclist;.       
1ebc0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1ebd0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1ebe0 2c 20 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20  , &buf, buf.n - 
1ebf0 31 20 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a  1 - nDiff - 4);.
1ec00 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1ec10 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1ec20 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20 20  p->rc, &buf, .  
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 70 44 61 74              pDat
1ec40 61 2d 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50  a->nn - pSeg->iP
1ec50 67 69 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d  gidxOff, &pData-
1ec60 3e 70 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f  >p[pSeg->iPgidxO
1ec70 66 66 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ff].          );
1ec80 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1ec90 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
1eca0 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
1ecb0 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
1ecc0 70 67 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67  pgnoFirst = pSeg
1ecd0 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  ->iTermLeafPgno;
1ece0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
1ecf0 61 44 65 6c 65 74 65 28 70 2c 20 46 54 53 35 5f  aDelete(p, FTS5_
1ed00 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1ed10 64 2c 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69  d, 1), iLeafRowi
1ed20 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
1ed30 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65  DataWrite(p, iLe
1ed40 61 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20  afRowid, buf.p, 
1ed50 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  buf.n);.      }.
1ed60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35      }.  }.  fts5
1ed70 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
1ed80 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1ed90 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43   fts5MergeChunkC
1eda0 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
1edb0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64  ndex *p, .  void
1edc0 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74   *pCtx, .  const
1edd0 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74   u8 *pChunk, int
1ede0 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73   nChunk.){.  Fts
1edf0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1ee00 74 65 72 20 3d 20 28 46 74 73 35 53 65 67 57 72  ter = (Fts5SegWr
1ee10 69 74 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74  iter*)pCtx;.  ft
1ee20 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
1ee30 6c 69 73 74 44 61 74 61 28 70 2c 20 70 57 72 69  listData(p, pWri
1ee40 74 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  ter, pChunk, nCh
1ee50 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  unk);.}../*.**.*
1ee60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1ee70 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
1ee80 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  l(.  Fts5Index *
1ee90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1eea0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1eeb0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1eec0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1eed0 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
1eee0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63   /* IN/OUT: Stuc
1eef0 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
1ef00 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20  .  int iLvl,    
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72     /* Level to r
1ef30 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a  ead input from *
1ef40 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20  /.  int *pnRem  
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20      /* Write up 
1ef70 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74  to this many out
1ef80 70 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b  put leaves */.){
1ef90 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1efa0 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
1efb0 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72  truct;.  Fts5Str
1efc0 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
1efd0 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
1efe0 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74  evel[iLvl];.  Ft
1eff0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
1f000 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73   *pLvlOut;.  Fts
1f010 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30  5Iter *pIter = 0
1f020 3b 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61  ;       /* Itera
1f030 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75  tor to read inpu
1f040 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  t data */.  int 
1f050 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a  nRem = pnRem ? *
1f060 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f  pnRem : 0;  /* O
1f070 75 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73  utput leaf pages
1f080 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a   left to write *
1f090 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20  /.  int nInput; 
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f0c0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1f0d0 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
1f0e0 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20  er writer;      
1f0f0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
1f100 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1f110 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
1f120 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75  *pSeg;     /* Ou
1f130 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  tput segment */.
1f140 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
1f150 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74  m;.  int bOldest
1f160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f170 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f180 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
1f190 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74  nt is the oldest
1f1a0 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 74 61 69   */.  int eDetai
1f1b0 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
1f1c0 65 44 65 74 61 69 6c 3b 0a 20 20 63 6f 6e 73 74  eDetail;.  const
1f1d0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
1f1e0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f  5INDEX_QUERY_NOO
1f1f0 55 54 50 55 54 3b 0a 0a 20 20 61 73 73 65 72 74  UTPUT;..  assert
1f200 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ( iLvl<pStruct->
1f210 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65  nLevel );.  asse
1f220 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
1f230 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
1f240 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65  .  memset(&write
1f250 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
1f260 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
1f270 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c  memset(&term, 0,
1f280 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
1f290 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c  er));.  if( pLvl
1f2a0 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
1f2b0 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75  pLvlOut = &pStru
1f2c0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b  ct->aLevel[iLvl+
1f2d0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1f2e0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20  pLvlOut->nSeg>0 
1f2f0 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20  );.    nInput = 
1f300 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20  pLvl->nMerge;.  
1f310 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
1f320 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
1f330 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66  >nSeg-1];..    f
1f340 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1f350 26 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69  &writer, pSeg->i
1f360 53 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74  Segid);.    writ
1f370 65 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d  er.writer.pgno =
1f380 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b   pSeg->pgnoLast+
1f390 31 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42  1;.    writer.iB
1f3a0 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  tPage = 0;.  }el
1f3b0 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  se{.    int iSeg
1f3c0 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74  id = fts5Allocat
1f3d0 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63  eSegid(p, pStruc
1f3e0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65  t);..    /* Exte
1f3f0 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63  nd the Fts5Struc
1f400 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72  ture object as r
1f410 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72  equired to ensur
1f420 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  e the output.   
1f430 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73   ** segment exis
1f440 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ts. */.    if( i
1f450 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c  Lvl==pStruct->nL
1f460 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  evel-1 ){.      
1f470 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
1f480 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70  Level(&p->rc, pp
1f490 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
1f4a0 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1f4b0 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ct;.    }.    ft
1f4c0 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
1f4d0 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
1f4e0 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20  Struct, iLvl+1, 
1f4f0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
1f500 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
1f510 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75     pLvl = &pStru
1f520 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1f530 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20  ;.    pLvlOut = 
1f540 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1f550 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66  [iLvl+1];..    f
1f560 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1f570 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
1f580 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
1f590 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f  e new segment to
1f5a0 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65   the output leve
1f5b0 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20  l */.    pSeg = 
1f5c0 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
1f5d0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20  LvlOut->nSeg];. 
1f5e0 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
1f5f0 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67  ++;.    pSeg->pg
1f600 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
1f610 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
1f620 69 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72  iSegid;.    pStr
1f630 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b  uct->nSegment++;
1f640 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e  ..    /* Read in
1f650 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67  put from all seg
1f660 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70  ments in the inp
1f670 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
1f680 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e  nInput = pLvl->n
1f690 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65  Seg;.  }.  bOlde
1f6a0 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e  st = (pLvlOut->n
1f6b0 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63  Seg==1 && pStruc
1f6c0 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b  t->nLevel==iLvl+
1f6d0 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  2);..  assert( i
1f6e0 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28  Lvl>=0 );.  for(
1f6f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
1f700 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61  (p, pStruct, fla
1f710 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76  gs, 0, 0, 0, iLv
1f720 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65  l, nInput, &pIte
1f730 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
1f740 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
1f750 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
1f760 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
1f770 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
1f780 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  .  ){.    Fts5Se
1f790 67 49 74 65 72 20 2a 70 53 65 67 49 74 65 72 20  gIter *pSegIter 
1f7a0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
1f7b0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
1f7c0 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69  .iFirst ];.    i
1f7d0 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f7f0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
1f800 7a 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20 2a  ze field value *
1f810 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b  /.    int nTerm;
1f820 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
1f830 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  Term;..    /* Ch
1f840 65 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69  eck for key anni
1f850 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  hilation. */.   
1f860 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e   if( pSegIter->n
1f870 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65  Pos==0 && (bOlde
1f880 73 74 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e  st || pSegIter->
1f890 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69  bDel==0) ) conti
1f8a0 6e 75 65 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20  nue;..    pTerm 
1f8b0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
1f8c0 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72  erm(pIter, &nTer
1f8d0 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72  m);.    if( nTer
1f8e0 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d  m!=term.n || mem
1f8f0 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e  cmp(pTerm, term.
1f900 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20  p, nTerm) ){.   
1f910 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26 26 20     if( pnRem && 
1f920 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74  writer.nLeafWrit
1f930 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20  ten>nRem ){.    
1f940 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1f950 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   }..      /* Thi
1f960 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e  s is a new term.
1f970 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74   Append a term t
1f980 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  o the output seg
1f990 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66  ment. */.      f
1f9a0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65  ts5WriteAppendTe
1f9b0 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e  rm(p, &writer, n
1f9c0 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
1f9d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
1f9e0 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c  t(&p->rc, &term,
1f9f0 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
1fa00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70      }..    /* Ap
1fa10 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74  pend the rowid t
1fa20 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
1fa30 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
1fa40 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 66  ISTSIZE */.    f
1fa50 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f  ts5WriteAppendRo
1fa60 77 69 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  wid(p, &writer, 
1fa70 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1fa80 69 64 28 70 49 74 65 72 29 29 3b 0a 0a 20 20 20  id(pIter));..   
1fa90 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54   if( eDetail==FT
1faa0 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
1fab0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67  {.      if( pSeg
1fac0 49 74 65 72 2d 3e 62 44 65 6c 20 29 7b 0a 20 20  Iter->bDel ){.  
1fad0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fae0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1faf0 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69  >rc, &writer.wri
1fb00 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20  ter.buf, 0);.   
1fb10 20 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65       if( pSegIte
1fb20 72 2d 3e 6e 50 6f 73 3e 30 20 29 7b 0a 20 20 20  r->nPos>0 ){.   
1fb30 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1fb40 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1fb50 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72  ->rc, &writer.wr
1fb60 69 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20  iter.buf, 0);.  
1fb70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1fb80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fb90 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70   /* Append the p
1fba0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74  osition-list dat
1fbb0 61 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  a to the output 
1fbc0 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20  */.      nPos = 
1fbd0 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32  pSegIter->nPos*2
1fbe0 20 2b 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65   + pSegIter->bDe
1fbf0 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  l;.      fts5Buf
1fc00 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1fc10 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e  &p->rc, &writer.
1fc20 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 50 6f 73  writer.buf, nPos
1fc30 29 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75  );.      fts5Chu
1fc40 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
1fc50 67 49 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77  gIter, (void*)&w
1fc60 72 69 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65  riter, fts5Merge
1fc70 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a  ChunkCallback);.
1fc80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1fc90 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74 20 6c  Flush the last l
1fca0 65 61 66 20 70 61 67 65 20 74 6f 20 64 69 73 6b  eaf page to disk
1fcb0 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  . Set the output
1fcc0 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
1fcd0 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20  height.  ** and 
1fce0 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  last leaf page n
1fcf0 75 6d 62 65 72 20 61 74 20 74 68 65 20 73 61 6d  umber at the sam
1fd00 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74  e time.  */.  ft
1fd10 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
1fd20 20 26 77 72 69 74 65 72 2c 20 26 70 53 65 67 2d   &writer, &pSeg-
1fd30 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69  >pgnoLast);..  i
1fd40 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  f( fts5MultiIter
1fd50 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 7b  Eof(p, pIter) ){
1fd60 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
1fd70 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
1fd80 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
1fd90 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  s from the %_dat
1fda0 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66  a table */.    f
1fdb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74  or(i=0; i<nInput
1fdc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
1fdd0 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
1fde0 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53 65  ent(p, pLvl->aSe
1fdf0 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  g[i].iSegid);.  
1fe00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
1fe10 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
1fe20 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
1fe30 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a  he input level *
1fe40 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  /.    if( pLvl->
1fe50 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a  nSeg!=nInput ){.
1fe60 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20        int nMove 
1fe70 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20  = (pLvl->nSeg - 
1fe80 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66  nInput) * sizeof
1fe90 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
1fea0 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65  gment);.      me
1feb0 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67  mmove(pLvl->aSeg
1fec0 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49  , &pLvl->aSeg[nI
1fed0 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20  nput], nMove);. 
1fee0 20 20 20 7d 0a 20 20 20 20 70 53 74 72 75 63 74     }.    pStruct
1fef0 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49  ->nSegment -= nI
1ff00 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  nput;.    pLvl->
1ff10 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a  nSeg -= nInput;.
1ff20 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
1ff30 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53   = 0;.    if( pS
1ff40 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20  eg->pgnoLast==0 
1ff50 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74  ){.      pLvlOut
1ff60 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20  ->nSeg--;.      
1ff70 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1ff80 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  t--;.    }.  }el
1ff90 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1ffa0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30  pSeg->pgnoLast>0
1ffb0 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69 6d   );.    fts5Trim
1ffc0 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74 65  Segments(p, pIte
1ffd0 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d  r);.    pLvl->nM
1ffe0 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20  erge = nInput;. 
1fff0 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49   }..  fts5MultiI
20000 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a  terFree(pIter);.
20010 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
20020 28 26 74 65 72 6d 29 3b 0a 20 20 69 66 28 20 70  (&term);.  if( p
20030 6e 52 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d  nRem ) *pnRem -=
20040 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69   writer.nLeafWri
20050 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  tten;.}../*.** D
20060 6f 20 75 70 20 74 6f 20 6e 50 67 20 70 61 67 65  o up to nPg page
20070 73 20 6f 66 20 61 75 74 6f 6d 65 72 67 65 20 77  s of automerge w
20080 6f 72 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  ork on the index
20090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
200a0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28   fts5IndexMerge(
200b0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
200e0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
200f0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
20100 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
20110 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
20120 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
20130 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  ndex */.  int nP
20140 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
20150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
20160 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f  es of work to do
20170 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65   */.){.  int nRe
20180 6d 20 3d 20 6e 50 67 3b 0a 20 20 46 74 73 35 53  m = nPg;.  Fts5S
20190 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
201a0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
201b0 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26   while( nRem>0 &
201c0 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
201d0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  OK ){.    int iL
201e0 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
201f0 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
20200 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
20210 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  ls */.    int iB
20220 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20  estLvl = 0;     
20230 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
20240 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74  ffering the most
20250 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
20260 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74  */.    int nBest
20270 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20280 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20290 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
202a0 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
202b0 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73  .    /* Set iBes
202c0 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65  tLvl to the leve
202d0 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
202e0 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a  segments from. *
202f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  /.    assert( pS
20300 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
20310 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  );.    for(iLvl=
20320 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
20330 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
20340 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
20350 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
20360 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
20370 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
20380 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
20390 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
203a0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42   pLvl->nMerge>nB
203b0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
203c0 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
203d0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73  ;.          nBes
203e0 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
203f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20400 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20410 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76   }.      if( pLv
20420 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b  l->nSeg>nBest ){
20430 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d  .        nBest =
20440 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20   pLvl->nSeg;.   
20450 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
20460 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iLvl;.      }.  
20470 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
20480 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c  Best is still 0,
20490 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
204a0 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a  must be empty. *
204b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
204c0 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c  DEBUG.    for(iL
204d0 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26  vl=0; nBest==0 &
204e0 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  & iLvl<pStruct->
204f0 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
20500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20510 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
20520 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a  Lvl].nSeg==0 );.
20530 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20540 20 20 69 66 28 20 6e 42 65 73 74 3c 70 2d 3e 70    if( nBest<p->p
20550 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
20560 67 65 20 0a 20 20 20 20 20 20 20 20 26 26 20 70  ge .        && p
20570 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
20580 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
20590 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =0 .      ){.   
205a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
205b0 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
205c0 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72  geLevel(p, &pStr
205d0 75 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26  uct, iBestLvl, &
205e0 6e 52 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  nRem);.    if( p
205f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20600 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
20610 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65  el[iBestLvl].nMe
20620 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rge==0 ){.      
20630 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
20640 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c  mote(p, iBestLvl
20650 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  +1, pStruct);.  
20660 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72    }.  }.  *ppStr
20670 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d  uct = pStruct;.}
20680 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ../*.** A total 
20690 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61  of nLeaf leaf pa
206a0 67 65 73 20 6f 66 20 64 61 74 61 20 68 61 73 20  ges of data has 
206b0 6a 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65  just been flushe
206c0 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a  d to a level-0.*
206d0 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20  * segment. This 
206e0 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
206f0 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74   the write-count
20700 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  er accordingly a
20710 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73  nd, if.** necess
20720 61 72 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e  ary, performs in
20730 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
20740 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  work..**.** If a
20750 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
20760 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
20770 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
20780 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
20790 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
207a0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
207b0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
207c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
207d0 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72  fts5IndexAutomer
207e0 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
207f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
20800 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
20810 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
20820 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
20830 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
20840 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
20850 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
20860 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
20870 20 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   nLeaf          
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20890 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
208a0 20 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69   leaves just wri
208b0 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tten */.){.  if(
208c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
208d0 4b 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  K && p->pConfig-
208e0 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b  >nAutomerge>0 ){
208f0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
20900 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
20910 70 53 74 72 75 63 74 3b 0a 20 20 20 20 75 36 34  pStruct;.    u64
20920 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
20930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20940 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77  itial value of w
20950 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  rite-counter */.
20960 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20      int nWork;  
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
20990 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65  ork-quanta to pe
209a0 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  rform */.    int
209b0 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
209c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
209d0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
209e0 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
209f0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   */..    /* Upda
20a00 74 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75  te the write-cou
20a10 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e  nter. While doin
20a20 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e  g so, set nWork.
20a30 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d   */.    nWrite =
20a40 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
20a50 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f  Counter;.    nWo
20a60 72 6b 20 3d 20 28 69 6e 74 29 28 28 28 6e 57 72  rk = (int)(((nWr
20a70 69 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70  ite + nLeaf) / p
20a80 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28  ->nWorkUnit) - (
20a90 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72  nWrite / p->nWor
20aa0 6b 55 6e 69 74 29 29 3b 0a 20 20 20 20 70 53 74  kUnit));.    pSt
20ab0 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
20ac0 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20  ter += nLeaf;.  
20ad0 20 20 6e 52 65 6d 20 3d 20 28 69 6e 74 29 28 70    nRem = (int)(p
20ae0 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57  ->nWorkUnit * nW
20af0 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e  ork * pStruct->n
20b00 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73  Level);..    fts
20b10 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 70  5IndexMerge(p, p
20b20 70 53 74 72 75 63 74 2c 20 6e 52 65 6d 29 3b 0a  pStruct, nRem);.
20b30 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
20b40 69 64 20 66 74 73 35 49 6e 64 65 78 43 72 69 73  id fts5IndexCris
20b50 69 73 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49  ismerge(.  Fts5I
20b60 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
20b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
20b80 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
20b90 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
20ba0 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20  ture **ppStruct 
20bb0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
20bc0 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74  : Current struct
20bd0 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
20be0 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  ){.  const int n
20bf0 43 72 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e  Crisis = p->pCon
20c00 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67  fig->nCrisisMerg
20c10 65 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  e;.  Fts5Structu
20c20 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
20c30 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69  pStruct;.  int i
20c40 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Lvl = 0;..  asse
20c50 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
20c60 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d  E_OK || pStruct-
20c70 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77  >nLevel>0 );.  w
20c80 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
20c90 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63  ITE_OK && pStruc
20ca0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
20cb0 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b  nSeg>=nCrisis ){
20cc0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65  .    fts5IndexMe
20cd0 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74  rgeLevel(p, &pSt
20ce0 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a  ruct, iLvl, 0);.
20cf0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
20d00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
20d10 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e  pStruct->nLevel>
20d20 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20 20 20 20  (iLvl+1) );.    
20d30 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
20d40 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20  mote(p, iLvl+1, 
20d50 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c  pStruct);.    iL
20d60 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53  vl++;.  }.  *ppS
20d70 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b  truct = pStruct;
20d80 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
20d90 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46  ts5IndexReturn(F
20da0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
20db0 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
20dc0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
20dd0 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  _OK;.  return rc
20de0 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
20df0 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
20e00 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73   Fts5FlushCtx;.s
20e10 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
20e20 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  tx {.  Fts5Index
20e30 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65   *pIdx;.  Fts5Se
20e40 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
20e50 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  .};../*.** Buffe
20e60 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e  r aBuf[] contain
20e70 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69  s a list of vari
20e80 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65  nts, all small e
20e90 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20  nough to fit.** 
20ea0 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
20eb0 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ger. Return the 
20ec0 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67  size of the larg
20ed0 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74 68  est prefix of th
20ee0 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78  is .** list nMax
20ef0 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69   bytes or less i
20f00 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
20f10 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73  c int fts5Poslis
20f20 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38  tPrefix(const u8
20f30 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78   *aBuf, int nMax
20f40 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
20f50 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74  u32 dummy;.  ret
20f60 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
20f70 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b  32(aBuf, dummy);
20f80 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d 61 78 20  .  if( ret<nMax 
20f90 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  ){.    while( 1 
20fa0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d  ){.      int i =
20fb0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
20fc0 28 26 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d  (&aBuf[ret], dum
20fd0 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  my);.      if( (
20fe0 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20  ret + i) > nMax 
20ff0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72  ) break;.      r
21000 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20  et += i;.    }. 
21010 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
21020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
21030 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
21040 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
21050 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20  able iHash to a 
21060 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20  new level-0 .** 
21070 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e  segment on disk.
21080 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65   Also update the
21090 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73   corresponding s
210a0 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
210b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
210c0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
210d0 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
210e0 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
210f0 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
21100 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
21110 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
21120 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
21130 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 46  tatic void fts5F
21140 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35  lushOneHash(Fts5
21150 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
21160 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70  5Hash *pHash = p
21170 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73 35 53  ->pHash;.  Fts5S
21180 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
21190 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b  t;.  int iSegid;
211a0 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
211b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
211c0 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61       /* Last lea
211d0 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  f page number in
211e0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f   segment */..  /
211f0 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
21200 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65  ence to the inde
21210 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  x structure and 
21220 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  allocate a new s
21230 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66  egment-id.  ** f
21240 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c  or the new level
21250 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a  -0 segment.  */.
21260 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
21270 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
21280 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74 73  ;.  iSegid = fts
21290 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70  5AllocateSegid(p
212a0 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69  , pStruct);..  i
212b0 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20  f( iSegid ){.   
212c0 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
212d0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
212e0 73 7a 3b 0a 20 20 20 20 69 6e 74 20 65 44 65 74  sz;.    int eDet
212f0 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
21300 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 20 20 46  ->eDetail;.    F
21310 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
21320 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20  ent *pSeg;   /* 
21330 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68  New segment with
21340 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20  in pStruct */.  
21350 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
21360 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
21370 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69  /* Buffer in whi
21380 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c  ch to assemble l
21390 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
213a0 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67 69  Fts5Buffer *pPgi
213b0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dx;           /*
213c0 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   Buffer in which
213d0 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 70 67 69   to assemble pgi
213e0 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35 53  dx */..    Fts5S
213f0 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  egWriter writer;
21400 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e  .    fts5WriteIn
21410 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69  it(p, &writer, i
21420 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 70 42 75  Segid);..    pBu
21430 66 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74  f = &writer.writ
21440 65 72 2e 62 75 66 3b 0a 20 20 20 20 70 50 67 69  er.buf;.    pPgi
21450 64 78 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69  dx = &writer.wri
21460 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20 20  ter.pgidx;..    
21470 2f 2a 20 66 74 73 35 57 72 69 74 65 49 6e 69 74  /* fts5WriteInit
21480 28 29 20 73 68 6f 75 6c 64 20 68 61 76 65 20 69  () should have i
21490 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 62  nitialized the b
214a0 75 66 66 65 72 73 20 74 6f 20 28 6d 6f 73 74 20  uffers to (most 
214b0 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20 74  likely).    ** t
214c0 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
214d0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
214e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
214f0 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e  || pBuf->nSpace>
21500 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41  =(pgsz + FTS5_DA
21510 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 20  TA_PADDING) );. 
21520 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
21530 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70 61   || pPgidx->nSpa
21540 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35  ce>=(pgsz + FTS5
21550 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29  _DATA_PADDING) )
21560 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
21570 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
21580 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72   hash table entr
21590 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72  ies. This loop r
215a0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
215b0 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64 6f  h.    ** term/do
215c0 63 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20  clist currently 
215d0 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68  stored within th
215e0 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f  e hash table. */
215f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
21600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21610 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
21620 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e  e3Fts5HashScanIn
21630 69 74 28 70 48 61 73 68 2c 20 30 2c 20 30 29 3b  it(pHash, 0, 0);
21640 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
21650 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
21660 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  OK && 0==sqlite3
21670 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28  Fts5HashScanEof(
21680 70 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20  pHash) ){.      
21690 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
216a0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  m;          /* B
216b0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
216c0 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 63   term */.      c
216d0 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c 69 73  onst u8 *pDoclis
216e0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  t;         /* Po
216f0 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
21700 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a   for this term *
21710 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63  /.      int nDoc
21720 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
21730 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
21740 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  oclist in bytes 
21750 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  */..      /* Wri
21760 74 65 20 74 68 65 20 74 65 72 6d 20 66 6f 72 20  te the term for 
21770 74 68 69 73 20 65 6e 74 72 79 20 74 6f 20 64 69  this entry to di
21780 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  sk. */.      sql
21790 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
217a0 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a 54  Entry(pHash, &zT
217b0 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20  erm, &pDoclist, 
217c0 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  &nDoclist);.    
217d0 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
217e0 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72  dTerm(p, &writer
217f0 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  , (int)strlen(zT
21800 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38 2a  erm), (const u8*
21810 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20 20  )zTerm);..      
21820 61 73 73 65 72 74 28 20 77 72 69 74 65 72 2e 62  assert( writer.b
21830 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
21840 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
21850 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20   pgsz>=(pBuf->n 
21860 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44  + pPgidx->n + nD
21870 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20  oclist + 1) ){. 
21880 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
21890 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c  tire doclist wil
218a0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72  l fit on the cur
218b0 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20  rent leaf. */.  
218c0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
218d0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
218e0 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e  Buf, pDoclist, n
218f0 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Doclist);.      
21900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
21910 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20  64 iRowid = 0;. 
21920 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74         i64 iDelt
21930 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  a = 0;.        i
21940 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  nt iOff = 0;..  
21950 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
21960 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c  ire doclist will
21970 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73   not fit on this
21980 20 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f   leaf. The follo
21990 77 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  wing .        **
219a0 20 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74   loop iterates t
219b0 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69  hrough the posli
219c0 73 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  sts that make up
219d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
219e0 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74        ** doclist
219f0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
21a00 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
21a10 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44  TE_OK && iOff<nD
21a20 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oclist ){.      
21a30 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
21a40 47 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c  GetVarint(&pDocl
21a50 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ist[iOff], (u64*
21a60 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
21a70 20 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69       iRowid += i
21a80 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20  Delta;.         
21a90 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20   .          if( 
21aa0 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77  writer.bFirstRow
21ab0 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
21ac0 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55          fts5PutU
21ad0 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20  16(&pBuf->p[0], 
21ae0 28 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20 20  (u16)pBuf->n);  
21af0 20 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20   /* first rowid 
21b00 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  on page */.     
21b10 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
21b20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  = sqlite3Fts5Put
21b30 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
21b40 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64  pBuf->n], iRowid
21b50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  );.            w
21b60 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
21b70 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  dInPage = 0;.   
21b80 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
21b90 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c  teDlidxAppend(p,
21ba0 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64   &writer, iRowid
21bb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
21bc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
21bd0 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
21be0 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
21bf0 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
21c00 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  ], iDelta);.    
21c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21c20 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
21c30 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20  n<=pBuf->nSpace 
21c40 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
21c50 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
21c60 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
21c70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
21c80 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20  Off<nDoclist && 
21c90 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d  pDoclist[iOff]==
21ca0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
21cb0 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d     pBuf->p[pBuf-
21cc0 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  >n++] = 0;.     
21cd0 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b           iOff++;
21ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21cf0 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  f( iOff<nDoclist
21d00 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66   && pDoclist[iOf
21d10 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
21d20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70           pBuf->p
21d30 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b  [pBuf->n++] = 0;
21d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21d50 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20   iOff++;.       
21d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21d80 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20     if( (pBuf->n 
21d90 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67  + pPgidx->n)>=pg
21da0 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
21db0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
21dc0 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65  shLeaf(p, &write
21dd0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
21de0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
21df0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
21e00 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20  nt bDummy;.     
21e10 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b         int nPos;
21e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
21e30 20 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74   nCopy = fts5Get
21e40 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f  PoslistSize(&pDo
21e50 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50  clist[iOff], &nP
21e60 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
21e70 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
21e80 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  += nPos;.       
21e90 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e       if( (pBuf->
21ea0 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20  n + pPgidx->n + 
21eb0 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20 29  nCopy) <= pgsz )
21ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21ed0 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f  /* The entire po
21ee0 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f  slist will fit o
21ef0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  n the current le
21f00 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20 20  af. So copy.    
21f10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
21f20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20  in one go. */.  
21f30 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
21f40 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
21f50 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63  Blob(pBuf, &pDoc
21f60 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70  list[iOff], nCop
21f70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
21f80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21f90 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
21fa0 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20  re poslist will 
21fb0 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20  not fit on this 
21fc0 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64  leaf. So it need
21fd0 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
21fe0 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20  ** to be broken 
21ff0 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54  into sections. T
22000 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63  he only qualific
22010 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20  ation being.    
22020 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
22030 74 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75  t each varint mu
22040 73 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e  st be stored con
22050 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20  tiguously.  */. 
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
22070 73 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74 20  st u8 *pPoslist 
22080 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  = &pDoclist[iOff
22090 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
220a0 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20   int iPos = 0;. 
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69               whi
220c0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
220d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
220e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61          int nSpa
220f0 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66  ce = pgsz - pBuf
22100 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e 3b  ->n - pPgidx->n;
22110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22120 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
22130 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
22140 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d  (nCopy - iPos)<=
22150 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  nSpace ){.      
22160 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
22170 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20  nCopy - iPos;.  
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
22190 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
221a0 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50         n = fts5P
221b0 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26 70 50  oslistPrefix(&pP
221c0 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53  oslist[iPos], nS
221d0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  pace);.         
221e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
221f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22200 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20   n>0 );.        
22210 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
22220 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
22230 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74  (pBuf, &pPoslist
22240 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20  [iPos], n);.    
22250 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73              iPos
22260 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   += n;.         
22270 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66         if( (pBuf
22280 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29  ->n + pPgidx->n)
22290 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  >=pgsz ){.      
222a0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
222b0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
222c0 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20  , &writer);.    
222d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
222f0 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20  ( iPos>=nCopy ) 
22300 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22320 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22330 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a   iOff += nCopy;.
22340 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22350 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
22360 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20 44       /* TODO2: D
22370 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  oclist terminato
22380 72 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e 20  r written here. 
22390 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75 66  */.      /* pBuf
223a0 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
223b0 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20 20   '\0'; */.      
223c0 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c  assert( pBuf->n<
223d0 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b  =pBuf->nSpace );
223e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
223f0 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
22400 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Hash);.    }.   
22410 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
22420 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
22430 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
22440 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70  h(p, &writer, &p
22450 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f  gnoLast);..    /
22460 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73  * Update the Fts
22470 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20 69  5Structure. It i
22480 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74  s written back t
22490 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
224a0 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74 73  y the.    ** fts
224b0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
224c0 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20  e() call below. 
224d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72   */.    if( pStr
224e0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29  uct->nLevel==0 )
224f0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
22500 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70  ctureAddLevel(&p
22510 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b  ->rc, &pStruct);
22520 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
22530 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
22540 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
22550 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  uct, 0, 1, 0);. 
22560 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
22570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22580 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74   pSeg = &pStruct
22590 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67  ->aLevel[0].aSeg
225a0 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  [ pStruct->aLeve
225b0 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20  l[0].nSeg++ ];. 
225c0 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69       pSeg->iSegi
225d0 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
225e0 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
225f0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65  t = 1;.      pSe
22600 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67  g->pgnoLast = pg
22610 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 53  noLast;.      pS
22620 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b  truct->nSegment+
22630 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  +;.    }.    fts
22640 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
22650 65 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29  e(p, 0, pStruct)
22660 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64  ;.  }..  fts5Ind
22670 65 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20 26  exAutomerge(p, &
22680 70 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73  pStruct, pgnoLas
22690 74 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 43  t);.  fts5IndexC
226a0 72 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26 70  risismerge(p, &p
226b0 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53  Struct);.  fts5S
226c0 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
226d0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73   pStruct);.  fts
226e0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
226f0 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f  e(pStruct);.}../
22700 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64  *.** Flush any d
22710 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
22720 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
22730 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64   tables to the d
22740 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
22750 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
22760 78 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65 78  xFlush(Fts5Index
22770 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73   *p){.  /* Unles
22780 73 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20 66  s it is empty, f
22790 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61  lush the hash ta
227a0 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ble to disk */. 
227b0 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   if( p->nPending
227c0 44 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65  Data ){.    asse
227d0 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a  rt( p->pHash );.
227e0 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
227f0 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73  ata = 0;.    fts
22800 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29  5FlushOneHash(p)
22810 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74 20 73 71  ;.  }.}...int sq
22820 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
22830 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78  timize(Fts5Index
22840 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
22850 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
22860 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
22870 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74  *pNew = 0;.  int
22880 20 6e 53 65 67 20 3d 20 30 3b 0a 0a 20 20 61 73   nSeg = 0;..  as
22890 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
228a0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
228b0 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20  IndexFlush(p);. 
228c0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
228d0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
228e0 0a 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  ..  if( pStruct 
228f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22900 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
22910 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43  ==fts5StructureC
22920 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74  ountSegments(pSt
22930 72 75 63 74 29 20 29 3b 0a 20 20 20 20 6e 53 65  ruct) );.    nSe
22940 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  g = pStruct->nSe
22950 67 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e  gment;.    if( n
22960 53 65 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  Seg>1 ){.      i
22970 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
22980 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
22990 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  ;.      nByte +=
229a0 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65   (pStruct->nLeve
229b0 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  l+1) * sizeof(Ft
229c0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
229d0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
229e0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
229f0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
22a00 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42  cZero(&p->rc, nB
22a10 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  yte);.    }.  }.
22a20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
22a30 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
22a40 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
22a50 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 53 65 67  int nByte = nSeg
22a60 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
22a70 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
22a80 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65  .    pNew->nLeve
22a90 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  l = pStruct->nLe
22aa0 76 65 6c 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d  vel+1;.    pNew-
22ab0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
22ac0 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  New->nWriteCount
22ad0 65 72 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  er = pStruct->nW
22ae0 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20  riteCounter;.   
22af0 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61   pLvl = &pNew->a
22b00 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
22b10 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c  Level];.    pLvl
22b20 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 74  ->aSeg = (Fts5St
22b30 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29  ructureSegment*)
22b40 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
22b50 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42  cZero(&p->rc, nB
22b60 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  yte);.    if( pL
22b70 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20 20 20 20  vl->aSeg ){.    
22b80 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
22b90 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
22ba0 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Out = 0;.      f
22bb0 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
22bc0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
22bd0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
22be0 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
22bf0 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
22c00 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
22c10 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
22c20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65    pLvl->aSeg[iSe
22c30 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63 74 2d  gOut] = pStruct-
22c40 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
22c50 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
22c60 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b 0a 20      iSegOut++;. 
22c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22c80 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65  .      pNew->nSe
22c90 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  gment = pLvl->nS
22ca0 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20 20 7d  eg = nSeg;.    }
22cb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
22cc0 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
22cd0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
22ce0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
22cf0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74   pNew ){.    int
22d00 20 69 4c 76 6c 20 3d 20 70 4e 65 77 2d 3e 6e 4c   iLvl = pNew->nL
22d10 65 76 65 6c 2d 31 3b 0a 20 20 20 20 77 68 69 6c  evel-1;.    whil
22d20 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
22d30 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c 65  _OK && pNew->aLe
22d40 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30  vel[iLvl].nSeg>0
22d50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   ){.      int nR
22d60 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f  em = FTS5_OPT_WO
22d70 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20 66  RK_UNIT;.      f
22d80 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
22d90 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c 76  el(p, &pNew, iLv
22da0 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 7d  l, &nRem);.    }
22db0 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ..    fts5Struct
22dc0 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e 65 77  ureWrite(p, pNew
22dd0 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
22de0 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e 65 77  tureRelease(pNew
22df0 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 74  );.  }..  fts5St
22e00 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
22e10 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72  Struct);.  retur
22e20 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
22e30 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71  n(p); .}..int sq
22e40 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4d 65  lite3Fts5IndexMe
22e50 72 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  rge(Fts5Index *p
22e60 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20  , int nMerge){. 
22e70 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
22e80 70 53 74 72 75 63 74 3b 0a 0a 20 20 70 53 74 72  pStruct;..  pStr
22e90 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
22ea0 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 66  ureRead(p);.  if
22eb0 28 20 70 53 74 72 75 63 74 20 26 26 20 70 53 74  ( pStruct && pSt
22ec0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a  ruct->nLevel ){.
22ed0 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
22ee0 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  ge(p, &pStruct, 
22ef0 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 66 74 73  nMerge);.    fts
22f00 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
22f10 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  p, pStruct);.  }
22f20 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
22f30 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
22f40 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ;..  return fts5
22f50 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
22f60 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
22f70 74 73 35 41 70 70 65 6e 64 52 6f 77 69 64 28 0a  ts5AppendRowid(.
22f80 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
22f90 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20    i64 iDelta,.  
22fa0 46 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65  Fts5Iter *pUnuse
22fb0 64 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  d,.  Fts5Buffer 
22fc0 2a 70 42 75 66 0a 29 7b 0a 20 20 55 4e 55 53 45  *pBuf.){.  UNUSE
22fd0 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29  D_PARAM(pUnused)
22fe0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
22ff0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
23000 63 2c 20 70 42 75 66 2c 20 69 44 65 6c 74 61 29  c, pBuf, iDelta)
23010 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
23020 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69   fts5AppendPosli
23030 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  st(.  Fts5Index 
23040 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61  *p,.  i64 iDelta
23050 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4d  ,.  Fts5Iter *pM
23060 75 6c 74 69 2c 0a 20 20 46 74 73 35 42 75 66 66  ulti,.  Fts5Buff
23070 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e  er *pBuf.){.  in
23080 74 20 6e 44 61 74 61 20 3d 20 70 4d 75 6c 74 69  t nData = pMulti
23090 2d 3e 62 61 73 65 2e 6e 44 61 74 61 3b 0a 20 20  ->base.nData;.  
230a0 61 73 73 65 72 74 28 20 6e 44 61 74 61 3e 30 20  assert( nData>0 
230b0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
230c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
230d0 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
230e0 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 6e 44 61  p->rc, pBuf, nDa
230f0 74 61 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 66  ta+9+9) ){.    f
23100 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
23110 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20  endVarint(pBuf, 
23120 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 66 74 73  iDelta);.    fts
23130 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
23140 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 6e 44  dVarint(pBuf, nD
23150 61 74 61 2a 32 29 3b 0a 20 20 20 20 66 74 73 35  ata*2);.    fts5
23160 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
23170 42 6c 6f 62 28 70 42 75 66 2c 20 70 4d 75 6c 74  Blob(pBuf, pMult
23180 69 2d 3e 62 61 73 65 2e 70 44 61 74 61 2c 20 6e  i->base.pData, n
23190 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73  Data);.  }.}...s
231a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
231b0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46  oclistIterNext(F
231c0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a  ts5DoclistIter *
231d0 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 70 20  pIter){.  u8 *p 
231e0 3d 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73  = pIter->aPoslis
231f0 74 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65  t + pIter->nSize
23200 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69   + pIter->nPosli
23210 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  st;..  assert( p
23220 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29  Iter->aPoslist )
23230 3b 0a 20 20 69 66 28 20 70 3e 3d 70 49 74 65 72  ;.  if( p>=pIter
23240 2d 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20 70 49  ->aEof ){.    pI
23250 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20  ter->aPoslist = 
23260 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
23270 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20  i64 iDelta;..   
23280 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   p += fts5GetVar
23290 69 6e 74 28 70 2c 20 28 75 36 34 2a 29 26 69 44  int(p, (u64*)&iD
232a0 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72  elta);.    pIter
232b0 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
232c0 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  ta;..    /* Read
232d0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
232e0 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ize */.    if( p
232f0 5b 30 5d 20 26 20 30 78 38 30 20 29 7b 0a 20 20  [0] & 0x80 ){.  
23300 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
23310 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65      pIter->nSize
23320 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
23330 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  32(p, nPos);.   
23340 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69     pIter->nPosli
23350 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a  st = (nPos>>1);.
23360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23370 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
23380 20 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d 29 29   = ((int)(p[0]))
23390 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70 49 74   >> 1;.      pIt
233a0 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20  er->nSize = 1;. 
233b0 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d     }..    pIter-
233c0 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20  >aPoslist = p;. 
233d0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
233e0 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65  d fts5DoclistIte
233f0 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66  rInit(.  Fts5Buf
23400 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74  fer *pBuf, .  Ft
23410 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
23420 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  Iter.){.  memset
23430 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
23440 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
23450 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20  ter->aPoslist = 
23460 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72  pBuf->p;.  pIter
23470 2d 3e 61 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e  ->aEof = &pBuf->
23480 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74  p[pBuf->n];.  ft
23490 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
234a0 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66  t(pIter);.}..#if
234b0 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20   0./*.** Append 
234c0 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66  a doclist to buf
234d0 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
234e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
234f0 73 75 6d 65 73 20 74 68 61 74 20 73 70 61 63 65  sumes that space
23500 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
23510 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  er has already b
23520 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  een.** allocated
23530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23540 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
23550 44 6f 63 69 64 28 0a 20 20 46 74 73 35 42 75 66  Docid(.  Fts5Buf
23560 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20  fer *pBuf,      
23570 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
23580 65 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  er to write to *
23590 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52  /.  i64 *piLastR
235a0 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
235b0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
235c0 72 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72  revious rowid wr
235d0 69 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a  itten (if any) *
235e0 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20  /.  i64 iRowid  
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20      /* Rowid to 
23610 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61  append */.){.  a
23620 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d  ssert( pBuf->n!=
23630 30 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77  0 || (*piLastRow
23640 69 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35  id)==0 );.  fts5
23650 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
23660 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 52 6f  Varint(pBuf, iRo
23670 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77  wid - *piLastRow
23680 69 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f  id);.  *piLastRo
23690 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a  wid = iRowid;.}.
236a0 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
236b0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
236c0 6f 63 69 64 28 70 42 75 66 2c 20 69 4c 61 73 74  ocid(pBuf, iLast
236d0 52 6f 77 69 64 2c 20 69 52 6f 77 69 64 29 20 7b  Rowid, iRowid) {
236e0 20 20 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72         \.  asser
236f0 74 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20  t( (pBuf)->n!=0 
23700 7c 7c 20 28 69 4c 61 73 74 52 6f 77 69 64 29 3d  || (iLastRowid)=
23710 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
23720 20 20 20 20 20 20 20 20 5c 0a 20 20 66 74 73 35          \.  fts5
23730 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
23740 56 61 72 69 6e 74 28 28 70 42 75 66 29 2c 20 28  Varint((pBuf), (
23750 69 52 6f 77 69 64 29 20 2d 20 28 69 4c 61 73 74  iRowid) - (iLast
23760 52 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c  Rowid)); \.  (iL
23770 61 73 74 52 6f 77 69 64 29 20 3d 20 28 69 52 6f  astRowid) = (iRo
23780 77 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20  wid);           
23790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237a0 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f            \.}../
237b0 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 63 6f  *.** Swap the co
237c0 6e 74 65 6e 74 73 20 6f 66 20 62 75 66 66 65 72  ntents of buffer
237d0 20 2a 70 31 20 77 69 74 68 20 74 68 61 74 20 6f   *p1 with that o
237e0 66 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  f *p2..*/.static
237f0 20 76 6f 69 64 20 66 74 73 35 42 75 66 66 65 72   void fts5Buffer
23800 53 77 61 70 28 46 74 73 35 42 75 66 66 65 72 20  Swap(Fts5Buffer 
23810 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65 72 20  *p1, Fts5Buffer 
23820 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66  *p2){.  Fts5Buff
23830 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20  er tmp = *p1;.  
23840 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32  *p1 = *p2;.  *p2
23850 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69   = tmp;.}..stati
23860 63 20 76 6f 69 64 20 66 74 73 35 4e 65 78 74 52  c void fts5NextR
23870 6f 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20  owid(Fts5Buffer 
23880 2a 70 42 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66  *pBuf, int *piOf
23890 66 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64 29  f, i64 *piRowid)
238a0 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f  {.  int i = *piO
238b0 66 66 3b 0a 20 20 69 66 28 20 69 3e 3d 70 42 75  ff;.  if( i>=pBu
238c0 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f  f->n ){.    *piO
238d0 66 66 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  ff = -1;.  }else
238e0 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a  {.    u64 iVal;.
238f0 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b      *piOff = i +
23900 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
23910 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69  arint(&pBuf->p[i
23920 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a  ], &iVal);.    *
23930 70 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b  piRowid += iVal;
23940 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
23950 69 73 20 69 73 20 74 68 65 20 65 71 75 69 76 61  is is the equiva
23960 6c 65 6e 74 20 6f 66 20 66 74 73 35 4d 65 72 67  lent of fts5Merg
23970 65 50 72 65 66 69 78 4c 69 73 74 73 28 29 20 66  ePrefixLists() f
23980 6f 72 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d  or detail=none m
23990 6f 64 65 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ode..** In this 
239a0 63 61 73 65 20 74 68 65 20 62 75 66 66 65 72 73  case the buffers
239b0 20 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 64 65   consist of a de
239c0 6c 74 61 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74  lta-encoded list
239d0 20 6f 66 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e   of rowids only.
239e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
239f0 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69  fts5MergeRowidLi
23a00 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sts(.  Fts5Index
23a10 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
23a20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
23a30 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
23a40 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
23a50 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
23a60 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74     /* First list
23a70 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46   to merge */.  F
23a80 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20  ts5Buffer *p2   
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23aa0 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f  * Second list to
23ab0 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
23ac0 6e 74 20 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74  nt i1 = 0;.  int
23ad0 20 69 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69   i2 = 0;.  i64 i
23ae0 52 6f 77 69 64 31 20 3d 20 30 3b 0a 20 20 69 36  Rowid1 = 0;.  i6
23af0 34 20 69 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20  4 iRowid2 = 0;. 
23b00 20 69 36 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a   i64 iOut = 0;..
23b10 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74    Fts5Buffer out
23b20 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c  ;.  memset(&out,
23b30 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29   0, sizeof(out))
23b40 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  ;.  sqlite3Fts5B
23b50 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
23b60 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20  , &out, p1->n + 
23b70 70 32 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d  p2->n);.  if( p-
23b80 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  >rc ) return;.. 
23b90 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70   fts5NextRowid(p
23ba0 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31  1, &i1, &iRowid1
23bb0 29 3b 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77  );.  fts5NextRow
23bc0 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f  id(p2, &i2, &iRo
23bd0 77 69 64 32 29 3b 0a 20 20 77 68 69 6c 65 28 20  wid2);.  while( 
23be0 69 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29  i1>=0 || i2>=0 )
23bf0 7b 0a 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20  {.    if( i1>=0 
23c00 26 26 20 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77  && (i2<0 || iRow
23c10 69 64 31 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a  id1<iRowid2) ){.
23c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
23c30 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31  ut==0 || iRowid1
23c40 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66  >iOut );.      f
23c50 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
23c60 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20  endVarint(&out, 
23c70 69 52 6f 77 69 64 31 20 2d 20 69 4f 75 74 29 3b  iRowid1 - iOut);
23c80 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52  .      iOut = iR
23c90 6f 77 69 64 31 3b 0a 20 20 20 20 20 20 66 74 73  owid1;.      fts
23ca0 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26  5NextRowid(p1, &
23cb0 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20  i1, &iRowid1);. 
23cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23cd0 61 73 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20  assert( iOut==0 
23ce0 7c 7c 20 69 52 6f 77 69 64 32 3e 69 4f 75 74 20  || iRowid2>iOut 
23cf0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
23d00 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
23d10 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64  int(&out, iRowid
23d20 32 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20  2 - iOut);.     
23d30 20 69 4f 75 74 20 3d 20 69 52 6f 77 69 64 32 3b   iOut = iRowid2;
23d40 0a 20 20 20 20 20 20 69 66 28 20 69 31 3e 3d 30  .      if( i1>=0
23d50 20 26 26 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f   && iRowid1==iRo
23d60 77 69 64 32 20 29 7b 0a 20 20 20 20 20 20 20 20  wid2 ){.        
23d70 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31  fts5NextRowid(p1
23d80 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29  , &i1, &iRowid1)
23d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23da0 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 32  fts5NextRowid(p2
23db0 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64 32 29  , &i2, &iRowid2)
23dc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66  ;.    }.  }..  f
23dd0 74 73 35 42 75 66 66 65 72 53 77 61 70 28 26 6f  ts5BufferSwap(&o
23de0 75 74 2c 20 70 31 29 3b 0a 20 20 66 74 73 35 42  ut, p1);.  fts5B
23df0 75 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b  ufferFree(&out);
23e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  .}../*.** Buffer
23e10 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74  s p1 and p2 cont
23e20 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68  ain doclists. Th
23e30 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67  is function merg
23e40 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a  es the content.*
23e50 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63  * of the two doc
23e60 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61  lists together a
23e70 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70  nd sets buffer p
23e80 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  1 to the result 
23e90 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  before.** return
23ea0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
23eb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
23ec0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
23ed0 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49  left in p->rc. I
23ee0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a  f an error has.*
23ef0 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
23f00 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
23f10 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
23f20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
23f30 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
23f40 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  s(.  Fts5Index *
23f50 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23f60 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
23f70 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
23f80 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c   Fts5Buffer *p1,
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74   /* First list t
23fb0 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73  o merge */.  Fts
23fc0 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20  5Buffer *p2     
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23fe0 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d  Second list to m
23ff0 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  erge */.){.  if(
24000 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36   p2->n ){.    i6
24010 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30  4 iLastRowid = 0
24020 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73  ;.    Fts5Doclis
24030 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74  tIter i1;.    Ft
24040 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32  s5DoclistIter i2
24050 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  ;.    Fts5Buffer
24060 20 6f 75 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d   out = {0, 0, 0}
24070 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  ;.    Fts5Buffer
24080 20 74 6d 70 20 3d 20 7b 30 2c 20 30 2c 20 30 7d   tmp = {0, 0, 0}
24090 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
240a0 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
240b0 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70  (&p->rc, &out, p
240c0 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 20 29 20  1->n + p2->n) ) 
240d0 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 74 73 35  return;.    fts5
240e0 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28  DoclistIterInit(
240f0 70 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74  p1, &i1);.    ft
24100 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
24110 74 28 70 32 2c 20 26 69 32 29 3b 0a 0a 20 20 20  t(p2, &i2);..   
24120 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
24130 20 20 20 69 66 28 20 69 31 2e 69 52 6f 77 69 64     if( i1.iRowid
24140 3c 69 32 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20  <i2.iRowid ){.  
24150 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e        /* Copy en
24160 74 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20  try from i1 */. 
24170 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
24180 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74  AppendDocid(&out
24190 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31  , iLastRowid, i1
241a0 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
241b0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
241c0 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
241d0 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31   i1.aPoslist, i1
241e0 2e 6e 50 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69  .nPoslist+i1.nSi
241f0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ze);.        fts
24200 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
24210 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 69  (&i1);.        i
24220 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i1.aPoslist==
24230 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
24240 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
24250 28 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e  ( i2.iRowid!=i1.
24260 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
24270 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20    /* Copy entry 
24280 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20  from i2 */.     
24290 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
242a0 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
242b0 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
242c0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
242d0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
242e0 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e  ndBlob(&out, i2.
242f0 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f  aPoslist, i2.nPo
24300 73 6c 69 73 74 2b 69 32 2e 6e 53 69 7a 65 29 3b  slist+i2.nSize);
24310 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
24320 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32  listIterNext(&i2
24330 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
24340 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20  2.aPoslist==0 ) 
24350 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
24360 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20       else{.     
24370 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65 20     /* Merge the 
24380 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  two position lis
24390 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  ts. */ .        
243a0 69 36 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20  i64 iPos1 = 0;. 
243b0 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 32         i64 iPos2
243c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
243d0 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20 20 20  t iOff1 = 0;.   
243e0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 32 20 3d       int iOff2 =
243f0 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   0;.        u8 *
24400 61 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c 69 73  a1 = &i1.aPoslis
24410 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20  t[i1.nSize];.   
24420 20 20 20 20 20 75 38 20 2a 61 32 20 3d 20 26 69       u8 *a2 = &i
24430 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e 6e 53  2.aPoslist[i2.nS
24440 69 7a 65 5d 3b 0a 0a 20 20 20 20 20 20 20 20 69  ize];..        i
24450 36 34 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20  64 iPrev = 0;.  
24460 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
24470 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  tWriter writer;.
24480 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
24490 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  writer, 0, sizeo
244a0 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20 20  f(writer));..   
244b0 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
244c0 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20  pendDocid(&out, 
244d0 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69  iLastRowid, i2.i
244e0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
244f0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
24500 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tmp);.        sq
24510 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
24520 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 74 6d 70  ize(&p->rc, &tmp
24530 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2b 20  , i1.nPoslist + 
24540 69 32 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20  i2.nPoslist);.  
24550 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
24560 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
24570 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
24580 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69  listNext64(a1, i
24590 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
245a0 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20  f1, &iPos1);.   
245b0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
245c0 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32  PoslistNext64(a2
245d0 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i2.nPoslist, &
245e0 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a  iOff2, &iPos2);.
245f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24600 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73  iPos1>=0 && iPos
24610 32 3e 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20  2>=0 );..       
24620 20 69 66 28 20 69 50 6f 73 31 3c 69 50 6f 73 32   if( iPos1<iPos2
24630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
24640 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
24650 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
24660 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b   &iPrev, iPos1);
24670 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
24680 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
24690 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c  t64(a1, i1.nPosl
246a0 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50  ist, &iOff1, &iP
246b0 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  os1);.        }e
246c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
246d0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
246e0 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
246f0 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29  , &iPrev, iPos2)
24700 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
24710 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
24720 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73  xt64(a2, i2.nPos
24730 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69  list, &iOff2, &i
24740 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  Pos2);.        }
24750 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ..        if( iP
24760 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e  os1>=0 && iPos2>
24770 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24780 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
24790 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
247a0 31 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20  1<iPos2 ){.     
247b0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
247c0 73 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20 20  s1!=iPrev ){.   
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
247e0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
247f0 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
24800 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a  &iPrev, iPos1);.
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
24830 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
24840 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50  Next64(a1, i1.nP
24850 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20  oslist, &iOff1, 
24860 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20  &iPos1);.       
24870 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31         if( iPos1
24880 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
24890 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
248b0 65 72 74 28 20 69 50 6f 73 32 21 3d 69 50 72 65  ert( iPos2!=iPre
248c0 76 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v );.           
248d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
248e0 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
248f0 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
24900 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
24910 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
24920 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c  oslistNext64(a2,
24930 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i2.nPoslist, &i
24940 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20  Off2, &iPos2);. 
24950 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
24960 20 69 50 6f 73 32 3c 30 20 29 20 62 72 65 61 6b   iPos2<0 ) break
24970 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
24980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24990 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
249a0 66 28 20 69 50 6f 73 31 3e 3d 30 20 29 7b 0a 20  f( iPos1>=0 ){. 
249b0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
249c0 73 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20 20  s1!=iPrev ){.   
249d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
249e0 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
249f0 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72  ppend(&tmp, &iPr
24a00 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20  ev, iPos1);.    
24a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24a20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24a30 41 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c  AppendBlob(&tmp,
24a40 20 26 61 31 5b 69 4f 66 66 31 5d 2c 20 69 31 2e   &a1[iOff1], i1.
24a50 6e 50 6f 73 6c 69 73 74 2d 69 4f 66 66 31 29 3b  nPoslist-iOff1);
24a60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
24a70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
24a80 28 20 69 50 6f 73 32 3e 3d 30 20 26 26 20 69 50  ( iPos2>=0 && iP
24a90 6f 73 32 21 3d 69 50 72 65 76 20 29 3b 0a 20 20  os2!=iPrev );.  
24aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
24ab0 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
24ac0 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
24ad0 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  v, iPos2);.     
24ae0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
24af0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 74  afeAppendBlob(&t
24b00 6d 70 2c 20 26 61 32 5b 69 4f 66 66 32 5d 2c 20  mp, &a2[iOff2], 
24b10 69 32 2e 6e 50 6f 73 6c 69 73 74 2d 69 4f 66 66  i2.nPoslist-iOff
24b20 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  2);.        }.. 
24b30 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50         /* WRITEP
24b40 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20  OSLISTSIZE */.  
24b50 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
24b60 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
24b70 28 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32  (&out, tmp.n * 2
24b80 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
24b90 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
24ba0 6c 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e 70 2c  lob(&out, tmp.p,
24bb0 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20   tmp.n);.       
24bc0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
24bd0 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20  Next(&i1);.     
24be0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
24bf0 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20  erNext(&i2);.   
24c00 20 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73       if( i1.aPos
24c10 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 61 50  list==0 || i2.aP
24c20 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61  oslist==0 ) brea
24c30 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
24c40 0a 0a 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f  ..    if( i1.aPo
24c50 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66  slist ){.      f
24c60 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
24c70 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
24c80 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29  owid, i1.iRowid)
24c90 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
24ca0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
24cb0 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69  (&out, i1.aPosli
24cc0 73 74 2c 20 69 31 2e 61 45 6f 66 20 2d 20 69 31  st, i1.aEof - i1
24cd0 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
24ce0 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 69  }.    else if( i
24cf0 32 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20  2.aPoslist ){.  
24d00 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
24d10 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
24d20 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
24d30 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73  owid);.      fts
24d40 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
24d50 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61  dBlob(&out, i2.a
24d60 50 6f 73 6c 69 73 74 2c 20 69 32 2e 61 45 6f 66  Poslist, i2.aEof
24d70 20 2d 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b   - i2.aPoslist);
24d80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
24d90 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
24da0 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74  , p1, out.n, out
24db0 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .p);.    fts5Buf
24dc0 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20  ferFree(&tmp);. 
24dd0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
24de0 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(&out);.  }.}..
24df0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24e00 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
24e10 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72     /* Index to r
24e40 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
24e50 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24e70 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52   True for "ORDER
24e80 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
24e90 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
24ea0 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
24eb0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
24ec0 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
24ed0 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69   to match */.  i
24ee0 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24f00 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
24f10 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73   pToken in bytes
24f20 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
24f30 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20   *pColset,      
24f40 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
24f50 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 65  t matches to the
24f60 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  se columns */.  
24f70 46 74 73 35 49 74 65 72 20 2a 2a 70 70 49 74 65  Fts5Iter **ppIte
24f80 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
24f90 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
24fa0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
24fb0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
24fc0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42    Fts5Buffer *aB
24fd0 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  uf;.  const int 
24fe0 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 76 6f  nBuf = 32;..  vo
24ff0 69 64 20 28 2a 78 4d 65 72 67 65 29 28 46 74 73  id (*xMerge)(Fts
25000 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 42 75 66  5Index*, Fts5Buf
25010 66 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65 72  fer*, Fts5Buffer
25020 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 41 70  *);.  void (*xAp
25030 70 65 6e 64 29 28 46 74 73 35 49 6e 64 65 78 2a  pend)(Fts5Index*
25040 2c 20 69 36 34 2c 20 46 74 73 35 49 74 65 72 2a  , i64, Fts5Iter*
25050 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a  , Fts5Buffer*);.
25060 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
25070 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
25080 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
25090 20 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73 35     xMerge = fts5
250a0 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73 3b  MergeRowidLists;
250b0 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66  .    xAppend = f
250c0 74 73 35 41 70 70 65 6e 64 52 6f 77 69 64 3b 0a  ts5AppendRowid;.
250d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 4d 65    }else{.    xMe
250e0 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65 50  rge = fts5MergeP
250f0 72 65 66 69 78 4c 69 73 74 73 3b 0a 20 20 20 20  refixLists;.    
25100 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70  xAppend = fts5Ap
25110 70 65 6e 64 50 6f 73 6c 69 73 74 3b 0a 20 20 7d  pendPoslist;.  }
25120 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35  ..  aBuf = (Fts5
25130 42 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d  Buffer*)fts5IdxM
25140 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
25150 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66  Fts5Buffer)*nBuf
25160 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  );.  pStruct = f
25170 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
25180 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66  (p);..  if( aBuf
25190 20 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20   && pStruct ){. 
251a0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
251b0 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51  gs = FTS5INDEX_Q
251c0 55 45 52 59 5f 53 43 41 4e 20 0a 20 20 20 20 20  UERY_SCAN .     
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
251e0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
251f0 5f 53 4b 49 50 45 4d 50 54 59 20 0a 20 20 20 20  _SKIPEMPTY .    
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25210 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  | FTS5INDEX_QUER
25220 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 20 20  Y_NOOUTPUT;.    
25230 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69  int i;.    i64 i
25240 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
25250 20 20 20 46 74 73 35 49 74 65 72 20 2a 70 31 20     Fts5Iter *p1 
25260 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72  = 0;     /* Iter
25270 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74  ator used to gat
25280 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e  her data from in
25290 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  dex */.    Fts5D
252a0 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
252b0 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69  Fts5Buffer docli
252c0 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77  st;.    int bNew
252d0 54 65 72 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d  Term = 1;..    m
252e0 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20  emset(&doclist, 
252f0 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73  0, sizeof(doclis
25300 74 29 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  t));.    fts5Mul
25310 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
25320 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 70 43 6f  ruct, flags, pCo
25330 6c 73 65 74 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  lset, pToken, nT
25340 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31  oken, -1, 0, &p1
25350 29 3b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53  );.    fts5IterS
25360 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72  etOutputCb(&p->r
25370 63 2c 20 70 31 29 3b 0a 20 20 20 20 66 6f 72 28  c, p1);.    for(
25380 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20   /* no-op */ ;. 
25390 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
253a0 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d  IterEof(p, p1)==
253b0 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  0;.        fts5M
253c0 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70 2c  ultiIterNext2(p,
253d0 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a   p1, &bNewTerm).
253e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46 74 73      ){.      Fts
253f0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
25400 20 26 70 31 2d 3e 61 53 65 67 5b 20 70 31 2d 3e   &p1->aSeg[ p1->
25410 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
25420 20 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   ];.      int nT
25430 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d  erm = pSeg->term
25440 2e 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  .n;.      const 
25450 75 38 20 2a 70 54 65 72 6d 20 3d 20 70 53 65 67  u8 *pTerm = pSeg
25460 2d 3e 74 65 72 6d 2e 70 3b 0a 20 20 20 20 20 20  ->term.p;.      
25470 70 31 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28  p1->xSetOutputs(
25480 70 31 2c 20 70 53 65 67 29 3b 0a 0a 20 20 20 20  p1, pSeg);..    
25490 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d    assert_nc( mem
254a0 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
254b0 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e  m, MIN(nToken, n
254c0 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20  Term))<=0 );.   
254d0 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20     if( bNewTerm 
254e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
254f0 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d  Term<nToken || m
25500 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
25510 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62  erm, nToken) ) b
25520 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
25530 20 20 20 20 20 69 66 28 20 70 31 2d 3e 62 61 73       if( p1->bas
25540 65 2e 6e 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e  e.nData==0 ) con
25550 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 69 66  tinue;..      if
25560 28 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69  ( p1->base.iRowi
25570 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 20 26 26  d<=iLastRowid &&
25580 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a   doclist.n>0 ){.
25590 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
255a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
255b0 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20  K && doclist.n; 
255c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
255d0 61 73 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29  assert( i<nBuf )
255e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
255f0 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a  aBuf[i].n==0 ){.
25600 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
25610 42 75 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c  BufferSwap(&docl
25620 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
25630 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
25640 42 75 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c  BufferZero(&docl
25650 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
25660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25670 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f     xMerge(p, &do
25680 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
25690 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
256a0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42  s5BufferZero(&aB
256b0 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
256c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
256d0 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64        iLastRowid
256e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
256f0 20 20 20 20 20 78 41 70 70 65 6e 64 28 70 2c 20       xAppend(p, 
25700 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 2d  p1->base.iRowid-
25710 69 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c 20  iLastRowid, p1, 
25720 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  &doclist);.     
25730 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 70 31   iLastRowid = p1
25740 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3b 0a 20  ->base.iRowid;. 
25750 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
25760 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b  0; i<nBuf; i++){
25770 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
25780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25790 20 20 20 20 20 20 20 78 4d 65 72 67 65 28 70 2c         xMerge(p,
257a0 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66   &doclist, &aBuf
257b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
257c0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
257d0 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  ee(&aBuf[i]);.  
257e0 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74    }.    fts5Mult
257f0 69 49 74 65 72 46 72 65 65 28 70 31 29 3b 0a 0a  iIterFree(p1);..
25800 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
25810 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
25820 65 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20  eof(Fts5Data) + 
25830 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20  doclist.n);.    
25840 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
25850 20 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75     pData->p = (u
25860 38 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20  8*)&pData[1];.  
25870 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20      pData->nn = 
25880 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20  pData->szLeaf = 
25890 64 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20  doclist.n;.     
258a0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70   memcpy(pData->p
258b0 2c 20 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63  , doclist.p, doc
258c0 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66  list.n);.      f
258d0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32  ts5MultiIterNew2
258e0 28 70 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63  (p, pData, bDesc
258f0 2c 20 70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  , ppIter);.    }
25900 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
25910 72 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20  ree(&doclist);. 
25920 20 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74   }..  fts5Struct
25930 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
25940 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ct);.  sqlite3_f
25950 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f  ree(aBuf);.}.../
25960 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
25970 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  at all subsequen
25980 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
25990 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
259a0 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f  () pertain.** to
259b0 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
259c0 74 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e  th rowid iRowid.
259d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
259e0 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69  ts5IndexBeginWri
259f0 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
25a00 20 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 69 36   int bDelete, i6
25a10 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73  4 iRowid){.  ass
25a20 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
25a30 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41  TE_OK );..  /* A
25a40 6c 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73 68  llocate the hash
25a50 20 74 61 62 6c 65 20 69 66 20 69 74 20 68 61 73   table if it has
25a60 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
25a70 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
25a80 20 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30   if( p->pHash==0
25a90 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
25aa0 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e  sqlite3Fts5HashN
25ab0 65 77 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26  ew(p->pConfig, &
25ac0 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50  p->pHash, &p->nP
25ad0 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d  endingData);.  }
25ae0 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
25af0 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64   hash table to d
25b00 69 73 6b 20 69 66 20 72 65 71 75 69 72 65 64 20  isk if required 
25b10 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c  */.  if( iRowid<
25b20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a  p->iWriteRowid .
25b30 20 20 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70     || (iRowid==p
25b40 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 26 26  ->iWriteRowid &&
25b50 20 70 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a   p->bDelete==0).
25b60 20 20 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69     || (p->nPendi
25b70 6e 67 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e  ngData > p->pCon
25b80 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20  fig->nHashSize) 
25b90 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  .  ){.    fts5In
25ba0 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d  dexFlush(p);.  }
25bb0 0a 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  ..  p->iWriteRow
25bc0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70  id = iRowid;.  p
25bd0 2d 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c  ->bDelete = bDel
25be0 65 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ete;.  return ft
25bf0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
25c00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
25c10 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a  t data to disk..
25c20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
25c30 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35  s5IndexSync(Fts5
25c40 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43  Index *p, int bC
25c50 6f 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74  ommit){.  assert
25c60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
25c70 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  OK );.  fts5Inde
25c80 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28  xFlush(p);.  if(
25c90 20 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43   bCommit ) fts5C
25ca0 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
25cb0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
25cc0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
25cd0 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79  *.** Discard any
25ce0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
25cf0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
25d00 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f  sh tables. Do no
25d10 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f  t write it.** to
25d20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
25d30 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73  dditionally, ass
25d40 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ume that the con
25d50 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64  tents of the %_d
25d60 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79  ata.** table may
25d70 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e   have changed on
25d80 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e   disk. So any in
25d90 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f  -memory caches o
25da0 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63  f %_data .** rec
25db0 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76  ords must be inv
25dc0 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  alidated..*/.int
25dd0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
25de0 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e  xRollback(Fts5In
25df0 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43  dex *p){.  fts5C
25e00 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
25e10 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72   fts5IndexDiscar
25e20 64 44 61 74 61 28 70 29 3b 0a 20 20 2f 2a 20 61  dData(p);.  /* a
25e30 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
25e40 4c 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20  LITE_OK ); */.  
25e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25e60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25  ;.}../*.** The %
25e70 5f 64 61 74 61 20 74 61 62 6c 65 20 69 73 20 63  _data table is c
25e80 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20  ompletely empty 
25e90 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
25ea0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  on is called. Th
25eb0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  is.** function p
25ec0 6f 70 75 6c 61 74 65 73 20 69 74 20 77 69 74 68  opulates it with
25ed0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72   the initial str
25ee0 75 63 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66  ucture objects f
25ef0 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a  or each index,.*
25f00 2a 20 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61  * and the initia
25f10 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  l version of the
25f20 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
25f30 72 64 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20  rd (a zero-byte 
25f40 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  blob)..*/.int sq
25f50 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
25f60 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a  init(Fts5Index *
25f70 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
25f80 75 72 65 20 73 3b 0a 20 20 6d 65 6d 73 65 74 28  ure s;.  memset(
25f90 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  &s, 0, sizeof(Ft
25fa0 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20  s5Structure));. 
25fb0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
25fc0 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
25fd0 52 4f 57 49 44 2c 20 28 63 6f 6e 73 74 20 75 38  ROWID, (const u8
25fe0 2a 29 22 22 2c 20 30 29 3b 0a 20 20 66 74 73 35  *)"", 0);.  fts5
25ff0 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
26000 2c 20 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  , &s);.  return 
26010 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
26020 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  p);.}../*.** Ope
26030 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65  n a new Fts5Inde
26040 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65  x handle. If the
26050 20 62 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e   bCreate argumen
26060 74 20 69 73 20 74 72 75 65 2c 20 63 72 65 61 74  t is true, creat
26070 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
26080 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
26090 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  ng %_data table.
260a0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
260b0 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f  sful, set *pp to
260c0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
260d0 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  w object and ret
260e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
260f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
26100 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   *pp to NULL and
26110 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
26120 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
26130 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
26140 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73  IndexOpen(.  Fts
26150 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
26160 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65  , .  int bCreate
26170 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  , .  Fts5Index *
26180 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  *pp,.  char **pz
26190 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Err.){.  int rc 
261a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
261b0 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20  ts5Index *p;    
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
261d0 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
261e0 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74  .  *pp = p = (Ft
261f0 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33  s5Index*)sqlite3
26200 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
26210 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49  rc, sizeof(Fts5I
26220 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 72 63  ndex));.  if( rc
26230 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26240 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20     p->pConfig = 
26250 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e  pConfig;.    p->
26260 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53 35  nWorkUnit = FTS5
26270 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20  _WORK_UNIT;.    
26280 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73 71  p->zDataTbl = sq
26290 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66  lite3Fts5Mprintf
262a0 28 26 72 63 2c 20 22 25 73 5f 64 61 74 61 22 2c  (&rc, "%s_data",
262b0 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29   pConfig->zName)
262c0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 61  ;.    if( p->zDa
262d0 74 61 54 62 6c 20 26 26 20 62 43 72 65 61 74 65  taTbl && bCreate
262e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
262f0 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
26300 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20  Table(.         
26310 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22   pConfig, "data"
26320 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52  , "id INTEGER PR
26330 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b  IMARY KEY, block
26340 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72   BLOB", 0, pzErr
26350 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
26360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26370 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
26380 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65  = sqlite3Fts5Cre
26390 61 74 65 54 61 62 6c 65 28 70 43 6f 6e 66 69 67  ateTable(pConfig
263a0 2c 20 22 69 64 78 22 2c 20 0a 20 20 20 20 20 20  , "idx", .      
263b0 20 20 20 20 20 20 22 73 65 67 69 64 2c 20 74 65        "segid, te
263c0 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52  rm, pgno, PRIMAR
263d0 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 65 72  Y KEY(segid, ter
263e0 6d 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  m)", .          
263f0 20 20 31 2c 20 70 7a 45 72 72 0a 20 20 20 20 20    1, pzErr.     
26400 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
26410 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
26440 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b  5IndexReinit(p);
26450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26460 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63   }..  assert( rc
26470 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
26480 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
26490 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
264a0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e     sqlite3Fts5In
264b0 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20  dexClose(p);.   
264c0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
264d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
264e0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64  .** Close a hand
264f0 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  le opened by an 
26500 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
26510 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
26520 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Open()..*/.int s
26530 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
26540 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  lose(Fts5Index *
26550 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
26560 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
26570 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
26580 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29   p->pReader==0 )
26590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
265a0 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65  nalize(p->pWrite
265b0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
265c0 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c  finalize(p->pDel
265d0 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  eter);.    sqlit
265e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
265f0 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20  IdxWriter);.    
26600 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
26610 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29  (p->pIdxDeleter)
26620 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
26630 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53 65  nalize(p->pIdxSe
26640 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
26650 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70  e3Fts5HashFree(p
26660 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71  ->pHash);.    sq
26670 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44  lite3_free(p->zD
26680 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c  ataTbl);.    sql
26690 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
266a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
266b0 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
266c0 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62   p points to a b
266d0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
266e0 20 75 74 66 2d 38 20 74 65 78 74 20 74 68 61 74   utf-8 text that
266f0 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a   is n bytes in .
26700 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  ** size. Return 
26710 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
26720 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72  tes in the nChar
26730 20 63 68 61 72 61 63 74 65 72 20 70 72 65 66 69   character prefi
26740 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66  x of the.** buff
26750 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72  er, or 0 if ther
26760 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  e are less than 
26770 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 73  nChar characters
26780 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 69 6e   in total..*/.in
26790 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
267a0 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c  exCharlenToBytel
267b0 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
267c0 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42 79 74   *p, .  int nByt
267d0 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61 72 0a  e, .  int nChar.
267e0 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
267f0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
26800 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
26810 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42  ){.    if( n>=nB
26820 79 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  yte ) return 0; 
26830 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f       /* Input co
26840 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61  ntains fewer tha
26850 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f  n nChar chars */
26860 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e  .    if( (unsign
26870 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d  ed char)p[n++]>=
26880 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
26890 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63  ile( (p[n] & 0xc
268a0 30 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a  0)==0x80 ) n++;.
268b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
268c0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn n;.}../*.** p
268d0 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e  In is a UTF-8 en
268e0 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49  coded string, nI
268f0 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  n bytes in size.
26900 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
26910 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65  er of.** unicode
26920 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
26930 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  he string..*/.st
26940 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
26950 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20  exCharlen(const 
26960 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e  char *pIn, int n
26970 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  In){.  int nChar
26980 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26990 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20   .  int i = 0;. 
269a0 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b   while( i<nIn ){
269b0 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e  .    if( (unsign
269c0 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d  ed char)pIn[i++]
269d0 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
269e0 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20  while( i<nIn && 
269f0 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d  (pIn[i] & 0xc0)=
26a00 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20  =0x80 ) i++;.   
26a10 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a   }.    nChar++;.
26a20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68    }.  return nCh
26a30 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  ar;.}../*.** Ins
26a40 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61  ert or remove da
26a50 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ta to or from th
26a60 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69  e index. Each ti
26a70 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73  me a document is
26a80 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72   .** added to or
26a90 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
26aa0 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75  e index, this fu
26ab0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26ac0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
26ad0 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  times..**.** For
26ae0 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d   an insert, it m
26af0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  ust be called on
26b00 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65  ce for each toke
26b10 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63  n in the new doc
26b20 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65  ument..** If the
26b30 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
26b40 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20  delete, it must 
26b50 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65  be called (at le
26b60 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61  ast) once for ea
26b70 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b  ch.** unique tok
26b80 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  en in the docume
26b90 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20  nt with an iCol 
26ba0 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20  value less than 
26bb0 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a  zero. The iPos.*
26bc0 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67  * argument is ig
26bd0 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65  nored for a dele
26be0 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  te..*/.int sqlit
26bf0 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
26c00 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
26c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26c20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
26c30 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  write to */.  in
26c40 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c60 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70   Column token ap
26c70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e  pears in (-ve ->
26c80 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e   delete) */.  in
26c90 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  t iPos,         
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26cb0 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b   Position of tok
26cc0 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e  en within column
26cd0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
26ce0 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
26cf0 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74  oken  /* Token t
26d00 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  o add or remove 
26d10 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78  to or from index
26d20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
26d50 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
26d60 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ugh indexes */. 
26d70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26d80 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
26d90 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
26da0 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
26db0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
26dc0 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74  onfig;..  assert
26dd0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
26de0 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
26df0 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65  (iCol<0)==p->bDe
26e00 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  lete );..  /* Ad
26e10 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74  d the entry to t
26e20 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e  he main terms in
26e30 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  dex. */.  rc = s
26e40 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
26e50 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48  ite(.      p->pH
26e60 61 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f  ash, p->iWriteRo
26e70 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
26e80 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
26e90 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  X, pToken, nToke
26ea0 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  n.  );..  for(i=
26eb0 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50  0; i<pConfig->nP
26ec0 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c  refix && rc==SQL
26ed0 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
26ee0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68 61    const int nCha
26ef0 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  r = pConfig->aPr
26f00 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  efix[i];.    int
26f10 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
26f20 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  Fts5IndexCharlen
26f30 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e  ToBytelen(pToken
26f40 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72 29  , nToken, nChar)
26f50 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
26f60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
26f70 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
26f80 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20  te(p->pHash, .  
26f90 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74          p->iWrit
26fa0 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
26fb0 6f 73 2c 20 28 63 68 61 72 29 28 46 54 53 35 5f  os, (char)(FTS5_
26fc0 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31 29  MAIN_PREFIX+i+1)
26fd0 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20  , pToken,.      
26fe0 20 20 20 20 6e 42 79 74 65 0a 20 20 20 20 20 20      nByte.      
26ff0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
27000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27010 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69  .** Open a new i
27020 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61  terator to itera
27030 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f  te though all ro
27040 77 69 64 20 74 68 61 74 20 6d 61 74 63 68 20 74  wid that match t
27050 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  he .** specified
27060 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20   token or token 
27070 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73  prefix..*/.int s
27080 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
27090 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65  uery(.  Fts5Inde
270a0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
270b0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69          /* FTS i
270c0 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f  ndex to query */
270d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
270e0 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65  Token, int nToke
270f0 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20  n, /* Token (or 
27100 70 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79  prefix) to query
27110 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c   for */.  int fl
27120 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
27130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
27140 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51  k of FTS5INDEX_Q
27150 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a  UERY_X flags */.
27160 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
27170 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
27180 20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65    /* Match these
27190 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f   columns only */
271a0 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
271b0 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20   **ppIter       
271c0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69     /* OUT: New i
271d0 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a  terator object *
271e0 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  /.){.  Fts5Confi
271f0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
27200 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49  pConfig;.  Fts5I
27210 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ter *pRet = 0;. 
27220 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20   Fts5Buffer buf 
27230 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20  = {0, 0, 0};..  
27240 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f  /* If the QUERY_
27250 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74  SCAN flag is set
27260 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67  , all other flag
27270 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e  s must be clear.
27280 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
27290 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
272a0 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20  _QUERY_SCAN)==0 
272b0 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e  || flags==FTS5IN
272c0 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 29  DEX_QUERY_SCAN )
272d0 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
272e0 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
272f0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f  p->rc, &buf, nTo
27300 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20  ken+1)==0 ){.   
27310 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20   int iIdx = 0;  
27320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27330 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72 63  * Index to searc
27340 68 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  h */.    memcpy(
27350 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65  &buf.p[1], pToke
27360 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20  n, nToken);..   
27370 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
27380 68 69 63 68 20 69 6e 64 65 78 20 74 6f 20 73 65  hich index to se
27390 61 72 63 68 20 61 6e 64 20 73 65 74 20 69 49 64  arch and set iId
273a0 78 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  x accordingly. I
273b0 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  f this.    ** is
273c0 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79 20   a prefix query 
273d0 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
273e0 69 73 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64  is no prefix ind
273f0 65 78 2c 20 73 65 74 20 69 49 64 78 20 74 6f 0a  ex, set iIdx to.
27400 20 20 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74      ** greater t
27410 68 61 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  han pConfig->nPr
27420 65 66 69 78 20 74 6f 20 69 6e 64 69 63 61 74 65  efix to indicate
27430 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20   that the query 
27440 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73  will be.    ** s
27450 61 74 69 73 66 69 65 64 20 62 79 20 73 63 61 6e  atisfied by scan
27460 6e 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74 65  ning multiple te
27470 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rms in the main 
27480 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
27490 20 20 2a 2a 20 49 66 20 74 68 65 20 51 55 45 52    ** If the QUER
274a0 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61  Y_TEST_NOIDX fla
274b0 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c  g was specified,
274c0 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20   then this must 
274d0 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66  be a.    ** pref
274e0 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61  ix-query. Instea
274f0 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65  d of using a pre
27500 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e  fix-index (if on
27510 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20  e exists), .    
27520 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  ** evaluate the 
27530 70 72 65 66 69 78 20 71 75 65 72 79 20 75 73 69  prefix query usi
27540 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20  ng the main FTS 
27550 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20 75  index. This is u
27560 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69  sed.    ** for i
27570 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63  nternal sanity c
27580 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69  hecking by the i
27590 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69  ntegrity-check i
275a0 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20  n debug .    ** 
275b0 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23  mode only.  */.#
275c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
275d0 55 47 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66  UG.    if( pConf
275e0 69 67 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78  ig->bPrefixIndex
275f0 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
27600 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
27610 54 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20  TEST_NOIDX) ){. 
27620 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
27630 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
27640 55 45 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20  UERY_PREFIX );. 
27650 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43       iIdx = 1+pC
27660 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a  onfig->nPrefix;.
27670 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
27680 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
27690 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
276a0 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20  _PREFIX ){.     
276b0 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73   int nChar = fts
276c0 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54  5IndexCharlen(pT
276d0 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
276e0 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b       for(iIdx=1;
276f0 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e   iIdx<=pConfig->
27700 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29  nPrefix; iIdx++)
27710 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  {.        if( pC
27720 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
27730 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20  Idx-1]==nChar ) 
27740 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27750 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49     }..    if( iI
27760 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
27770 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  efix ){.      /*
27780 20 53 74 72 61 69 67 68 74 20 69 6e 64 65 78 20   Straight index 
27790 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20  lookup */.      
277a0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
277b0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
277c0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
277d0 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20       buf.p[0] = 
277e0 28 75 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50  (u8)(FTS5_MAIN_P
277f0 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20  REFIX + iIdx);. 
27800 20 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74       if( pStruct
27810 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
27820 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
27830 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 20 7c  pStruct, flags |
27840 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
27850 5f 53 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20 20  _SKIPEMPTY, .   
27860 20 20 20 20 20 20 20 20 20 70 43 6f 6c 73 65 74           pColset
27870 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b  , buf.p, nToken+
27880 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a  1, -1, 0, &pRet.
27890 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
278a0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
278b0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
278c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
278d0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63  lse{.      /* Sc
278e0 61 6e 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  an multiple term
278f0 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e  s in the main in
27900 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
27910 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20   bDesc = (flags 
27920 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
27930 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20  Y_DESC)!=0;.    
27940 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53    buf.p[0] = FTS
27950 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20  5_MAIN_PREFIX;. 
27960 20 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72       fts5SetupPr
27970 65 66 69 78 49 74 65 72 28 70 2c 20 62 44 65 73  efixIter(p, bDes
27980 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e  c, buf.p, nToken
27990 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52  +1, pColset, &pR
279a0 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  et);.      asser
279b0 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
279c0 5f 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f  _OK || pRet->pCo
279d0 6c 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lset==0 );.     
279e0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
279f0 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 52 65  utCb(&p->rc, pRe
27a00 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  t);.      if( p-
27a10 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
27a20 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65  {.        Fts5Se
27a30 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
27a40 52 65 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e  Ret->aSeg[pRet->
27a50 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
27a60 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
27a70 53 65 67 2d 3e 70 4c 65 61 66 20 29 20 70 52 65  Seg->pLeaf ) pRe
27a80 74 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70  t->xSetOutputs(p
27a90 52 65 74 2c 20 70 53 65 67 29 3b 0a 20 20 20 20  Ret, pSeg);.    
27aa0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
27ab0 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
27ac0 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
27ad0 72 43 6c 6f 73 65 28 26 70 52 65 74 2d 3e 62 61  rClose(&pRet->ba
27ae0 73 65 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20  se);.      pRet 
27af0 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73 35 43  = 0;.      fts5C
27b00 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
27b10 20 20 20 7d 0a 0a 20 20 20 20 2a 70 70 49 74 65     }..    *ppIte
27b20 72 20 3d 20 26 70 52 65 74 2d 3e 62 61 73 65 3b  r = &pRet->base;
27b30 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
27b40 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
27b50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  ;.  }.  return f
27b60 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
27b70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
27b80 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
27b90 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
27ba0 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
27bb0 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a  ent is at EOF..*
27bc0 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  /./*.** Move to 
27bd0 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
27be0 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74  g rowid. .*/.int
27bf0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
27c00 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74  Next(Fts5IndexIt
27c10 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b  er *pIndexIter){
27c20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
27c30 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
27c40 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 61 73  pIndexIter;.  as
27c50 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
27c60 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  dex->rc==SQLITE_
27c70 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74  OK );.  fts5Mult
27c80 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d  iIterNext(pIter-
27c90 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20  >pIndex, pIter, 
27ca0 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
27cb0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
27cc0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
27cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  }../*.** Move to
27ce0 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
27cf0 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55  ng term/rowid. U
27d00 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76  sed by the fts5v
27d10 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  ocab module..*/.
27d20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
27d30 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35  terNextScan(Fts5
27d40 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
27d50 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74  xIter){.  Fts5It
27d60 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73  er *pIter = (Fts
27d70 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
27d80 72 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r;.  Fts5Index *
27d90 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
27da0 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  x;..  assert( pI
27db0 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
27dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
27dd0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
27de0 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
27df0 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0);.  if( p->rc=
27e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27e10 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
27e20 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
27e30 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
27e40 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
27e50 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
27e60 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d  af && pSeg->term
27e70 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e  .p[0]!=FTS5_MAIN
27e80 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20  _PREFIX ){.     
27e90 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
27ea0 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20  (pSeg->pLeaf);. 
27eb0 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66       pSeg->pLeaf
27ec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65   = 0;.      pIte
27ed0 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31  r->base.bEof = 1
27ee0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
27ef0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
27f00 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
27f10 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
27f20 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
27f30 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74  matching rowid t
27f40 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72  hat occurs at or
27f50 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54   after iMatch. T
27f60 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e  he.** definition
27f70 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72   of "at or after
27f80 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  " depends on whe
27f90 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74  ther this iterat
27fa0 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69  or iterates.** i
27fb0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64  n ascending or d
27fc0 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
27fd0 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  order..*/.int sq
27fe0 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
27ff0 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49  tFrom(Fts5IndexI
28000 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c  ter *pIndexIter,
28010 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20   i64 iMatch){.  
28020 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20  Fts5Iter *pIter 
28030 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e  = (Fts5Iter*)pIn
28040 64 65 78 49 74 65 72 3b 0a 20 20 66 74 73 35 4d  dexIter;.  fts5M
28050 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
28060 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
28070 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a  pIter, iMatch);.
28080 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
28090 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
280a0 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
280b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
280c0 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f  rent term..*/.co
280d0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
280e0 33 46 74 73 35 49 74 65 72 54 65 72 6d 28 46 74  3Fts5IterTerm(Ft
280f0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
28100 64 65 78 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e  dexIter, int *pn
28110 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  ){.  int n;.  co
28120 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
28130 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d  onst char*)fts5M
28140 75 6c 74 69 49 74 65 72 54 65 72 6d 28 28 46 74  ultiIterTerm((Ft
28150 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
28160 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d  er, &n);.  *pn =
28170 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26   n-1;.  return &
28180 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  z[1];.}../*.** C
28190 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72  lose an iterator
281a0 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61   opened by an ea
281b0 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71  rlier call to sq
281c0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
281d0 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ery()..*/.void s
281e0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
281f0 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49 74 65  ose(Fts5IndexIte
28200 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a  r *pIndexIter){.
28210 20 20 69 66 28 20 70 49 6e 64 65 78 49 74 65 72    if( pIndexIter
28220 20 29 7b 0a 20 20 20 20 46 74 73 35 49 74 65 72   ){.    Fts5Iter
28230 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
28240 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
28250 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
28260 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e  pIndex = pIter->
28270 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
28280 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
28290 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c  ter);.    fts5Cl
282a0 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78  oseReader(pIndex
282b0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
282c0 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20  Read and decode 
282d0 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
282e0 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64  ecord from the d
282f0 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  atabase. .**.** 
28300 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65  Parameter anSize
28310 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
28320 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20  n array of size 
28330 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c  nCol, where nCol
28340 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   is.** the numbe
28350 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65  r of user define
28360 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
28370 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   FTS table..*/.i
28380 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
28390 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
283a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
283b0 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e   *pnRow, i64 *an
283c0 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f  Size){.  int nCo
283d0 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
283e0 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61  nCol;.  Fts5Data
283f0 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52   *pData;..  *pnR
28400 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ow = 0;.  memset
28410 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65  (anSize, 0, size
28420 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b  of(i64) * nCol);
28430 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
28440 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
28450 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b  AVERAGES_ROWID);
28460 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
28470 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
28480 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ->nn ){.    int 
28490 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
284a0 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74  Col;.    i += ft
284b0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
284c0 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29  ta->p[i], (u64*)
284d0 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28  pnRow);.    for(
284e0 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d  iCol=0; i<pData-
284f0 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c  >nn && iCol<nCol
28500 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
28510 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
28520 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d  int(&pData->p[i]
28530 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b  , (u64*)&anSize[
28540 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  iCol]);.    }.  
28550 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  }..  fts5DataRel
28560 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72  ease(pData);.  r
28570 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
28580 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
28590 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
285a0 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73  urrent "averages
285b0 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68  " record with th
285c0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
285d0 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70  e buffer .** sup
285e0 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63  plied as the sec
285f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
28600 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
28610 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
28620 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63  (Fts5Index *p, c
28630 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
28640 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73  int nData){.  as
28650 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
28660 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
28670 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
28680 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
28690 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  , pData, nData);
286a0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
286b0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
286c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
286d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
286e0 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f  f blocks this mo
286f0 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72  dule has read fr
28700 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  om the %_data.**
28710 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20   table since it 
28720 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  was created..*/.
28730 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
28740 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e  ndexReads(Fts5In
28750 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  dex *p){.  retur
28760 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f  n p->nRead;.}../
28770 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d  *.** Set the 32-
28780 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  bit cookie value
28790 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
287a0 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75  tart of all stru
287b0 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64  cture .** record
287c0 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  s to the value p
287d0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
287e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
287f0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
28800 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
28810 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
28820 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
28830 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
28840 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
28850 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f  3Fts5IndexSetCoo
28860 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  kie(Fts5Index *p
28870 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69  , int iNew){.  i
28880 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
288b0 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
288c0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
288d0 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20  >pConfig;    /* 
288e0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62  Configuration ob
288f0 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f  ject */.  u8 aCo
28900 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20  okie[4];        
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28920 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65  * Binary represe
28930 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20  ntation of iNew 
28940 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
28950 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20  b *pBlob = 0;.. 
28960 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
28970 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
28980 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
28990 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a  aCookie, iNew);.
289a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
289b0 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
289c0 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  g->db, pConfig->
289d0 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
289e0 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22  , .      "block"
289f0 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
28a00 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f  _ROWID, 1, &pBlo
28a10 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  b.  );.  if( rc=
28a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28a30 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77    sqlite3_blob_w
28a40 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f  rite(pBlob, aCoo
28a50 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  kie, 4, 0);.    
28a60 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
28a70 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a  b_close(pBlob);.
28a80 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
28a90 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
28aa0 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e  Fts5IndexLoadCon
28ab0 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70  fig(Fts5Index *p
28ac0 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
28ad0 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70  re *pStruct;.  p
28ae0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
28af0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
28b00 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
28b10 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
28b20 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
28b30 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
28b40 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
28b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
28b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28bd0 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
28be0 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
28bf0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
28c00 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
28c10 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63  y-check .** func
28c20 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f  tionality..*/../
28c30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69  *.** Return a si
28c40 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61  mple checksum va
28c50 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  lue based on the
28c60 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75   arguments..*/.u
28c70 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  64 sqlite3Fts5In
28c80 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20  dexEntryCksum(. 
28c90 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
28ca0 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74  int iCol, .  int
28cb0 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49   iPos, .  int iI
28cc0 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
28cd0 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e   *pTerm,.  int n
28ce0 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Term.){.  int i;
28cf0 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f  .  u64 ret = iRo
28d00 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  wid;.  ret += (r
28d10 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20  et<<3) + iCol;. 
28d20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
28d30 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69   + iPos;.  if( i
28d40 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20  Idx>=0 ) ret += 
28d50 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35  (ret<<3) + (FTS5
28d60 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
28d70 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Idx);.  for(i=0;
28d80 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72   i<nTerm; i++) r
28d90 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
28da0 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74   pTerm[i];.  ret
28db0 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64  urn ret;.}..#ifd
28dc0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28dd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
28de0 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e  ion is purely an
28df0 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
28e00 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
28e10 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
28e20 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
28e30 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
28e40 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
28e50 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
28e60 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74  Instead, it test
28e70 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  s that the same 
28e80 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69  set of pgno/rowi
28e90 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  d combinations a
28ea0 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72  re .** visited r
28eb0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
28ec0 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74  ther the doclist
28ed0 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65  -index identifie
28ee0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a  d by parameters.
28ef0 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20  ** iSegid/iLeaf 
28f00 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66  is iterated in f
28f10 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72  orwards or rever
28f20 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  se order..*/.sta
28f30 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
28f40 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20  tDlidxReverse(. 
28f50 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
28f60 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20    int iSegid,   
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f80 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
28f90 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a  to load from */.
28fa0 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20    int iLeaf     
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fc0 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73    /* Load doclis
28fd0 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73  t-index for this
28fe0 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74   leaf */.){.  Ft
28ff0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
29000 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63  idx = 0;.  u64 c
29010 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36  ksum1 = 13;.  u6
29020 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a  4 cksum2 = 13;..
29030 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
29040 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
29050 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65  , 0, iSegid, iLe
29060 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  af);.      fts5D
29070 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
29080 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
29090 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
290a0 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20  xt(p, pDlidx).  
290b0 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
290c0 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  d = fts5DlidxIte
290d0 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a  rRowid(pDlidx);.
290e0 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66      int pgno = f
290f0 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
29100 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73  (pDlidx);.    as
29110 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66  sert( pgno>iLeaf
29120 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b   );.    cksum1 +
29130 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
29140 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
29150 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
29160 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
29170 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f  Dlidx = 0;..  fo
29180 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
29190 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c  dxIterInit(p, 1,
291a0 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b   iSegid, iLeaf);
291b0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
291c0 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
291d0 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  x)==0;.      fts
291e0 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70  5DlidxIterPrev(p
291f0 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  , pDlidx).  ){. 
29200 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
29210 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
29220 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  id(pDlidx);.    
29230 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44  int pgno = fts5D
29240 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
29250 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74  idx);.    assert
29260 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  ( fts5DlidxIterP
29270 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61  gno(pDlidx)>iLea
29280 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20  f );.    cksum2 
29290 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
292a0 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
292b0 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
292c0 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
292d0 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69  pDlidx = 0;..  i
292e0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
292f0 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63  _OK && cksum1!=c
29300 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
29310 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a  FTS5_CORRUPT;.}.
29320 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
29330 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74  QueryCksum(.  Ft
29340 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29360 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65   Fts5 index obje
29370 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
29380 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
29390 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
293a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79      /* Index key
293b0 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
293c0 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
293d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e     /* Size of in
293f0 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73  dex key in bytes
29400 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
29430 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72  or Fts5IndexQuer
29440 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73  y */.  u64 *pCks
29450 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  um              
29460 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
29470 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  : Checksum value
29480 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65   */.){.  int eDe
29490 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
294a0 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36  g->eDetail;.  u6
294b0 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75  4 cksum = *pCksu
294c0 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  m;.  Fts5IndexIt
294d0 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
294e0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
294f0 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
29500 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20  p, z, n, flags, 
29510 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20 20 77  0, &pIter);..  w
29520 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
29530 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
29540 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74  3Fts5IterEof(pIt
29550 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20 72  er) ){.    i64 r
29560 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52  owid = pIter->iR
29570 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 65  owid;..    if( e
29580 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
29590 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
295a0 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74    cksum ^= sqlit
295b0 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
295c0 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20  Cksum(rowid, 0, 
295d0 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a  0, iIdx, z, n);.
295e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
295f0 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
29600 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20  er sReader;.    
29610 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73    for(sqlite3Fts
29620 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
29630 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74 61 2c  it(pIter->pData,
29640 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26   pIter->nData, &
29650 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  sReader);.      
29660 20 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66      sReader.bEof
29670 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ==0;.          s
29680 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
29690 74 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65  tReaderNext(&sRe
296a0 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20  ader).      ){. 
296b0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
296c0 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  = FTS5_POS2COLUM
296d0 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b  N(sReader.iPos);
296e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
296f0 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  f = FTS5_POS2OFF
29700 53 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73  SET(sReader.iPos
29710 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
29720 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
29730 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72  ndexEntryCksum(r
29740 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66  owid, iCol, iOff
29750 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20  , iIdx, z, n);. 
29760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
29770 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29780 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
29790 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
297a0 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20 20 20  Next(pIter);.   
297b0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
297c0 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49  Fts5IterClose(pI
297d0 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d  ter);..  *pCksum
297e0 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75   = cksum;.  retu
297f0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
29800 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
29810 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e  s also purely an
29820 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
29830 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
29840 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
29850 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
29860 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
29870 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
29880 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61   any way..*/.sta
29890 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
298a0 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  tTerm(.  Fts5Ind
298b0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75  ex *p, .  Fts5Bu
298c0 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20  ffer *pPrev,    
298d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
298e0 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20  vious term */.  
298f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
29900 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
29910 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20  /* Possibly new 
29920 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a  term to test */.
29930 20 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a    u64 expected,.
29940 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b    u64 *pCksum.){
29950 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
29960 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e  c;.  if( pPrev->
29970 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
29980 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70  BufferSet(&rc, p
29990 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20  Prev, n, (const 
299a0 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a  u8*)z);.  }else.
299b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
299c0 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e  _OK && (pPrev->n
299d0 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50  !=n || memcmp(pP
299e0 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29  rev->p, z, n)) )
299f0 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33  {.    u64 cksum3
29a00 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20   = *pCksum;.    
29a10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
29a20 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  m = (const char*
29a30 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20  )&pPrev->p[1];  
29a40 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65  /* term sans pre
29a50 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20  fix-byte */.    
29a60 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65  int nTerm = pPre
29a70 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20  v->n-1;         
29a80 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
29a90 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
29aa0 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28      int iIdx = (
29ab0 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54  pPrev->p[0] - FT
29ac0 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b  S5_MAIN_PREFIX);
29ad0 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
29ae0 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20   (iIdx==0 ? 0 : 
29af0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
29b00 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34  PREFIX);.    u64
29b10 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36   ck1 = 0;.    u6
29b20 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20  4 ck2 = 0;..    
29b30 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
29b40 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
29b50 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44  ed for ASC and D
29b60 45 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a  ESC queries are.
29b70 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e      ** the same.
29b80 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68   If not, call th
29b90 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  is corruption.  
29ba0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  */.    rc = fts5
29bb0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
29bc0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
29bd0 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a  , flags, &ck1);.
29be0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29bf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
29c00 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
29c10 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
29c20 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  C;.      rc = ft
29c30 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
29c40 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
29c50 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20  rm, f, &ck2);.  
29c60 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
29c70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
29c80 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
29c90 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
29ca0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
29cb0 70 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68  prefix query, ch
29cc0 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73  eck that the res
29cd0 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66  ults returned if
29ce0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
29cf0 69 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65  index is disable
29d00 64 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  d are the same. 
29d10 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20  In both ASC and 
29d20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20  DESC order. .   
29d30 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
29d40 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62  check may only b
29d50 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74  e performed if t
29d60 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73  he hash table is
29d70 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20   empty. This.   
29d80 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74   ** is because t
29d90 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e  he hash table on
29da0 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69  ly supports a si
29db0 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20  ngle scan query 
29dc0 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65  at.    ** a time
29dd0 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d  , and the multi-
29de0 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77  iter loop from w
29df0 68 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69  hich this functi
29e00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20  on is called.   
29e10 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70   ** is already p
29e20 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61  erforming such a
29e30 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   scan. */.    if
29e40 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  ( p->nPendingDat
29e50 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  a==0 ){.      if
29e60 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d  ( iIdx>0 && rc==
29e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29e80 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
29e90 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
29ea0 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20  RY_TEST_NOIDX;. 
29eb0 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a         ck2 = 0;.
29ec0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
29ed0 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
29ee0 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
29ef0 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
29f00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29f10 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
29f20 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
29f30 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
29f40 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30        if( iIdx>0
29f50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
29f60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
29f70 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
29f80 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
29f90 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f  NOIDX|FTS5INDEX_
29fa0 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20  QUERY_DESC;.    
29fb0 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20      ck2 = 0;.   
29fc0 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75       rc = fts5Qu
29fd0 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
29fe0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
29ff0 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20  f, &ck2);.      
2a000 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a010 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
2a020 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
2a030 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
2a040 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e   }..    cksum3 ^
2a050 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42  = ck1;.    fts5B
2a060 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
2a070 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
2a080 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20  8*)z);..    if( 
2a090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a0a0 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65   cksum3!=expecte
2a0b0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
2a0c0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2a0d0 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20    }.    *pCksum 
2a0e0 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20  = cksum3;.  }.  
2a0f0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a  p->rc = rc;.}. .
2a100 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
2a110 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
2a120 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66  rse(x,y,z).# def
2a130 69 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d  ine fts5TestTerm
2a140 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  (u,v,w,x,y,z).#e
2a150 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
2a160 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  k that:.**.**   
2a170 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66  1) All leaves of
2a180 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46   pSeg between iF
2a190 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28  irst and iLast (
2a1a0 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74  inclusive) exist
2a1b0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e   and.**      con
2a1c0 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e  tain zero terms.
2a1d0 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61  .**   2) All lea
2a1e0 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77  ves of pSeg betw
2a1f0 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64  een iNoRowid and
2a200 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76   iLast (inclusiv
2a210 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20  e) exist and.** 
2a220 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72       contain zer
2a230 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61  o rowids..*/.sta
2a240 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
2a250 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2a260 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64  Empty(.  Fts5Ind
2a270 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72  ex *p,.  Fts5Str
2a280 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
2a290 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg,     /* Segm
2a2a0 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74  ent to check int
2a2b0 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63  ernal consistenc
2a2c0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  y */.  int iFirs
2a2d0 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69  t,.  int iNoRowi
2a2e0 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29  d,.  int iLast.)
2a2f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
2a300 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
2a310 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20  the iter.nEmpty 
2a320 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67  leaves following
2a330 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
2a340 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74  f.  ** (a) exist
2a350 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
2a360 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20   no terms. */.  
2a370 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d  for(i=iFirst; p-
2a380 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2a390 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29  & i<=iLast; i++)
2a3a0 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
2a3b0 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2a3c0 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
2a3d0 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
2a3e0 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20  >iSegid, i));.  
2a3f0 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
2a400 20 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65       if( !fts5Le
2a410 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65  afIsTermless(pLe
2a420 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
2a430 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2a440 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69    if( i>=iNoRowi
2a450 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66  d && 0!=fts5Leaf
2a460 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
2a470 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  eaf) ) p->rc = F
2a480 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2a490 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52   }.    fts5DataR
2a4a0 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
2a4b0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
2a4c0 64 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43  d fts5IntegrityC
2a4d0 68 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e  heckPgidx(Fts5In
2a4e0 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61  dex *p, Fts5Data
2a4f0 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20   *pLeaf){.  int 
2a500 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
2a510 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42  int ii;..  Fts5B
2a520 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c  uffer buf1 = {0,
2a530 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66  0,0};.  Fts5Buff
2a540 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30  er buf2 = {0,0,0
2a550 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66  };..  ii = pLeaf
2a560 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c  ->szLeaf;.  whil
2a570 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20  e( ii<pLeaf->nn 
2a580 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
2a590 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
2a5a0 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  es;.    int iOff
2a5b0 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b  ;.    int nIncr;
2a5c0 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35  ..    ii += fts5
2a5d0 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2a5e0 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72  af->p[ii], nIncr
2a5f0 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20  );.    iTermOff 
2a600 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f  += nIncr;.    iO
2a610 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a  ff = iTermOff;..
2a620 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c      if( iOff>=pL
2a630 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2a640 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2a650 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2a660 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66  else if( iTermOf
2a670 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20  f==nIncr ){.    
2a680 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
2a690 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2a6a0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2a6b0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  f->p[iOff], nByt
2a6c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  e);.      if( (i
2a6d0 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66  Off+nByte)>pLeaf
2a6e0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
2a6f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2a700 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2a710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
2a720 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
2a730 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74  >rc, &buf1, nByt
2a740 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  e, &pLeaf->p[iOf
2a750 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  f]);.      }.   
2a760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
2a770 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a  t nKeep, nByte;.
2a780 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2a790 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2a7a0 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2a7b0 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66  Keep);.      iOf
2a7c0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2a7d0 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
2a7e0 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
2a7f0 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75      if( nKeep>bu
2a800 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42  f1.n || (iOff+nB
2a810 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  yte)>pLeaf->szLe
2a820 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  af ){.        p-
2a830 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2a840 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
2a850 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20  .        buf1.n 
2a860 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20  = nKeep;.       
2a870 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
2a880 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
2a890 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65  uf1, nByte, &pLe
2a8a0 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20  af->p[iOff]);.  
2a8b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2a8c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2a8d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  K ){.        res
2a8e0 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d   = fts5BufferCom
2a8f0 70 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66  pare(&buf1, &buf
2a900 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
2a910 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d  res<=0 ) p->rc =
2a920 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2a930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2a940 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
2a950 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75  p->rc, &buf2, bu
2a960 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20  f1.n, buf1.p);. 
2a970 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72   }..  fts5Buffer
2a980 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66  Free(&buf1);.  f
2a990 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
2a9a0 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  uf2);.}..static 
2a9b0 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e  void fts5IndexIn
2a9c0 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
2a9d0 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ent(.  Fts5Index
2a9e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2a9f0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
2aa00 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
2aa10 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2aa20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20  Segment *pSeg   
2aa30 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f     /* Segment to
2aa40 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20   check internal 
2aa50 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29  consistency */.)
2aa60 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
2aa70 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
2aa80 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nfig;.  sqlite3_
2aa90 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
2aaa0 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e  .  int rc2;.  in
2aab0 74 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d  t iIdxPrevLeaf =
2aac0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2aad0 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78  -1;.  int iDlidx
2aae0 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
2aaf0 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66  >pgnoLast;..  if
2ab00 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ( pSeg->pgnoFirs
2ab10 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  t==0 ) return;..
2ab20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
2ab30 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74  reStmt(p, &pStmt
2ab40 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
2ab50 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  f(.      "SELECT
2ab60 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70   segid, term, (p
2ab70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31  gno>>1), (pgno&1
2ab80 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64  ) FROM %Q.'%q_id
2ab90 78 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25  x' WHERE segid=%
2aba0 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  d",.      pConfi
2abb0 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
2abc0 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53  >zName, pSeg->iS
2abd0 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  egid.  ));..  /*
2abe0 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
2abf0 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
2ac00 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69  archy.  */.  whi
2ac10 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
2ac20 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2ac30 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2ac40 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69  (pStmt) ){.    i
2ac50 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20  64 iRow;        
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ac70 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c  Rowid for this l
2ac80 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  eaf */.    Fts5D
2ac90 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
2aca0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2acb0 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
2acc0 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54  /..    int nIdxT
2acd0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  erm = sqlite3_co
2ace0 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
2acf0 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 1);.    const 
2ad00 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d  char *zIdxTerm =
2ad10 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2ad20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2ad30 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
2ad40 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20   int iIdxLeaf = 
2ad50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2ad60 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20  nt(pStmt, 2);.  
2ad70 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20    int bIdxDlidx 
2ad80 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2ad90 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
2ada0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c  .    /* If the l
2adb0 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  eaf in question 
2adc0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2add0 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68   trimmed from th
2ade0 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20  e segment, .    
2adf0 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62  ** ignore this b
2ae00 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68  -tree entry. Oth
2ae10 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20  erwise, load it 
2ae20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a  into memory. */.
2ae30 20 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66      if( iIdxLeaf
2ae40 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  <pSeg->pgnoFirst
2ae50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2ae60 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47   iRow = FTS5_SEG
2ae70 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
2ae80 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61  >iSegid, iIdxLea
2ae90 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20  f);.    pLeaf = 
2aea0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
2aeb0 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  iRow);.    if( p
2aec0 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
2aed0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
2aee0 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e  hat the leaf con
2aef0 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f  tains at least o
2af00 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61  ne term, and tha
2af10 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20  t it is equal.  
2af20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65    ** to or large
2af30 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74  r than the split
2af40 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d  -key in zIdxTerm
2af50 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68  .  Also check th
2af60 61 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  at if there.    
2af70 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77  ** is also a row
2af80 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69  id pointer withi
2af90 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  n the leaf page 
2afa0 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74  header, it point
2afb0 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f  s to a.    ** lo
2afc0 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  cation before th
2afd0 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  e term.  */.    
2afe0 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70  if( pLeaf->nn<=p
2aff0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2b000 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2b010 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2b020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2b030 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
2b040 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2b050 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d  et of first term
2b060 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20   on leaf */.    
2b070 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b    int iRowidOff;
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b090 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
2b0a0 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a   rowid on leaf *
2b0b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  /.      int nTer
2b0c0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2b0d0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
2b0e0 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62  erm on leaf in b
2b0f0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ytes */.      in
2b100 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
2b110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2b120 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20  parison of term 
2b130 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f  and split-key */
2b140 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66  ..      iOff = f
2b150 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
2b160 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2b170 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
2b180 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2b190 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2b1a0 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e    if( iRowidOff>
2b1b0 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  =iOff ){.       
2b1c0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2b1d0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  RRUPT;.      }el
2b1e0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  se{.        iOff
2b1f0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2b200 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
2b210 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  ff], nTerm);.   
2b220 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d       res = memcm
2b230 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  p(&pLeaf->p[iOff
2b240 5d 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e  ], zIdxTerm, MIN
2b250 28 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d  (nTerm, nIdxTerm
2b260 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
2b270 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e  res==0 ) res = n
2b280 54 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b  Term - nIdxTerm;
2b290 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
2b2a0 3c 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  <0 ) p->rc = FTS
2b2b0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2b2c0 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e   }..      fts5In
2b2d0 74 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64  tegrityCheckPgid
2b2e0 78 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20  x(p, pLeaf);.   
2b2f0 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52   }.    fts5DataR
2b300 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
2b310 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62     if( p->rc ) b
2b320 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  reak;..    /* No
2b330 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
2b340 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61   iter.nEmpty lea
2b350 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ves following th
2b360 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20  e current leaf. 
2b370 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20     ** (a) exist 
2b380 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
2b390 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20  no terms. */.   
2b3a0 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
2b3b0 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20  ityCheckEmpty(. 
2b3c0 20 20 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20         p, pSeg, 
2b3d0 69 49 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20  iIdxPrevLeaf+1, 
2b3e0 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31  iDlidxPrevLeaf+1
2b3f0 2c 20 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20  , iIdxLeaf-1.   
2b400 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   );.    if( p->r
2b410 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  c ) break;..    
2b420 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
2b430 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20   doclist-index, 
2b440 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f  check that it lo
2b450 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  oks right. */.  
2b460 20 20 69 66 28 20 62 49 64 78 44 6c 69 64 78 20    if( bIdxDlidx 
2b470 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69  ){.      Fts5Dli
2b480 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
2b490 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72   0;  /* For iter
2b4a0 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f  ating through do
2b4b0 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  clist index */. 
2b4c0 20 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65       int iPrevLe
2b4d0 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20  af = iIdxLeaf;. 
2b4e0 20 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20       int iSegid 
2b4f0 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  = pSeg->iSegid;.
2b500 20 20 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20        int iPg = 
2b510 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65  0;.      i64 iKe
2b520 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44  y;..      for(pD
2b530 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74  lidx=fts5DlidxIt
2b540 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65  erInit(p, 0, iSe
2b550 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a  gid, iIdxLeaf);.
2b560 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c            fts5Dl
2b570 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
2b580 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
2b590 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2b5a0 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29  rNext(p, pDlidx)
2b5b0 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20  .      ){..     
2b5c0 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20     /* Check any 
2b5d0 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73  rowid-less pages
2b5e0 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f   that occur befo
2b5f0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  re the current l
2b600 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eaf. */.        
2b610 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61  for(iPg=iPrevLea
2b620 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69  f+1; iPg<fts5Dli
2b630 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
2b640 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  x); iPg++){.    
2b650 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
2b660 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
2b670 69 53 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20  iSegid, iPg);.  
2b680 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
2b690 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
2b6a0 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  iKey);.         
2b6b0 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
2b6c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74            if( ft
2b6d0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2b6e0 4f 66 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20  Off(pLeaf)!=0 ) 
2b6f0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2b700 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
2b710 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
2b720 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
2b730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b740 20 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61          iPrevLea
2b750 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  f = fts5DlidxIte
2b760 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a  rPgno(pDlidx);..
2b770 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2b780 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70   that the leaf p
2b790 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  age indicated by
2b7a0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
2b7b0 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20  ally does.      
2b7c0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65    ** contain the
2b7d0 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64   rowid suggested
2b7e0 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f   by the same. */
2b7f0 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
2b800 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
2b810 49 44 28 69 53 65 67 69 64 2c 20 69 50 72 65 76  ID(iSegid, iPrev
2b820 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70  Leaf);.        p
2b830 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
2b840 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
2b850 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
2b860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  ){.          i64
2b870 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20   iRowid;.       
2b880 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
2b890 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
2b8a0 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b  RowidOff(pLeaf);
2b8b0 0a 20 20 20 20 20 20 20 20 20 20 41 53 53 45 52  .          ASSER
2b8c0 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61  T_SZLEAF_OK(pLea
2b8d0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  f);.          if
2b8e0 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65  ( iRowidOff>=pLe
2b8f0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2b900 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
2b910 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2b920 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2b930 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
2b940 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61  5GetVarint(&pLea
2b950 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c  f->p[iRowidOff],
2b960 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
2b970 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b980 20 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69   iRowid!=fts5Dli
2b990 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
2b9a0 64 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  dx) ) p->rc = FT
2b9b0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2b9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b9d0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
2b9e0 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
2b9f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
2ba00 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61     iDlidxPrevLea
2ba10 66 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66  f = iPg;.      f
2ba20 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
2ba30 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  (pDlidx);.      
2ba40 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76  fts5TestDlidxRev
2ba50 65 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20  erse(p, iSegid, 
2ba60 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d  iIdxLeaf);.    }
2ba70 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69  else{.      iDli
2ba80 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65  dxPrevLeaf = pSe
2ba90 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20  g->pgnoLast;.   
2baa0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
2bab0 6b 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f  k there is no do
2bac0 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  clist index */. 
2bad0 20 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72     }..    iIdxPr
2bae0 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61  evLeaf = iIdxLea
2baf0 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20  f;.  }..  rc2 = 
2bb00 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2bb10 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70  (pStmt);.  if( p
2bb20 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2bb30 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a  ) p->rc = rc2;..
2bb40 20 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69    /* Page iter.i
2bb50 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65  Leaf must now be
2bb60 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c   the rightmost l
2bb70 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20  eaf-page in the 
2bb80 73 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30  segment */.#if 0
2bb90 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
2bba0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e  LITE_OK && iter.
2bbb0 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e  iLeaf!=pSeg->pgn
2bbc0 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  oLast ){.    p->
2bbd0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2bbe0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  T;.  }.#endif.}.
2bbf0 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65  ../*.** Run inte
2bc00 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65  rnal checks to e
2bc10 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46  nsure that the F
2bc20 54 53 20 69 6e 64 65 78 20 28 61 29 20 69 73 20  TS index (a) is 
2bc30 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63  internally .** c
2bc40 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62  onsistent and (b
2bc50 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69  ) contains entri
2bc60 65 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  es for which the
2bc70 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63   XOR of the chec
2bc80 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63  ksums.** as calc
2bc90 75 6c 61 74 65 64 20 62 79 20 73 71 6c 69 74 65  ulated by sqlite
2bca0 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2bcb0 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e  ksum() is cksum.
2bcc0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
2bcd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
2bce0 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72  any of the inter
2bcf0 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c  nal checks fail,
2bd00 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68   or if the.** ch
2bd10 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20  ecksum does not 
2bd20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51  match. Return SQ
2bd30 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63  LITE_OK if all c
2bd40 68 65 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f  hecks pass witho
2bd50 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20  ut.** error, or 
2bd60 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74  some other SQLit
2bd70 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
2bd80 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65  another error (e
2bd90 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75  .g. OOM).** occu
2bda0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2bdb0 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67  e3Fts5IndexInteg
2bdc0 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e  rityCheck(Fts5In
2bdd0 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75  dex *p, u64 cksu
2bde0 6d 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69  m){.  int eDetai
2bdf0 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
2be00 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63  eDetail;.  u64 c
2be10 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20  ksum2 = 0;      
2be20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
2be30 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20  ecksum based on 
2be40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65  contents of inde
2be50 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  xes */.  Fts5Buf
2be60 66 65 72 20 70 6f 73 6c 69 73 74 20 3d 20 7b 30  fer poslist = {0
2be70 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20 42 75 66 66  ,0,0};   /* Buff
2be80 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  er used to hold 
2be90 61 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 46  a poslist */.  F
2bea0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 3b 20  ts5Iter *pIter; 
2beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bec0 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
2bed0 65 20 74 68 72 6f 75 67 68 20 65 6e 74 69 72 65  e through entire
2bee0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35   index */.  Fts5
2bef0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
2bf00 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ct;         /* I
2bf10 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
2bf20 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
2bf30 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 73 65 64  _DEBUG.  /* Used
2bf40 20 62 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e   by extra intern
2bf50 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75  al tests only ru
2bf60 6e 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  n if NDEBUG is n
2bf70 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  ot defined */.  
2bf80 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20  u64 cksum3 = 0; 
2bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfa0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65  /* Checksum base
2bfb0 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66  d on contents of
2bfc0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74   indexes */.  Ft
2bfd0 73 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20  s5Buffer term = 
2bfe0 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a  {0,0,0};      /*
2bff0 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20   Buffer used to 
2c000 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74  hold most recent
2c010 20 74 65 72 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a   term */.#endif.
2c020 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
2c030 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s = FTS5INDEX_QU
2c040 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20  ERY_NOOUTPUT;.  
2c050 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46  .  /* Load the F
2c060 54 53 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  TS index structu
2c070 72 65 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20  re */.  pStruct 
2c080 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
2c090 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68  ead(p);..  /* Ch
2c0a0 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74  eck that the int
2c0b0 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65  ernal nodes of e
2c0c0 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63  ach segment matc
2c0d0 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a  h the leaves */.
2c0e0 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
2c0f0 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69  .    int iLvl, i
2c100 53 65 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76  Seg;.    for(iLv
2c110 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
2c120 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
2c130 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  +){.      for(iS
2c140 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
2c150 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
2c160 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
2c170 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75          Fts5Stru
2c180 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
2c190 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
2c1a0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
2c1b0 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iSeg];.        
2c1c0 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
2c1d0 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70  tyCheckSegment(p
2c1e0 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d  , pSeg);.      }
2c1f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c200 20 54 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d   The cksum argum
2c210 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
2c220 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2c230 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c   checksum calcul
2c240 61 74 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20  ated.  ** based 
2c250 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20  on all expected 
2c260 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46  entries in the F
2c270 54 53 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64  TS index (includ
2c280 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64 65 78  ing prefix index
2c290 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20  .  ** entries). 
2c2a0 54 68 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b  This block check
2c2b0 73 20 74 68 61 74 20 61 20 63 68 65 63 6b 73 75  s that a checksu
2c2c0 6d 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  m calculated bas
2c2d0 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61  ed on the.  ** a
2c2e0 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f  ctual contents o
2c2f0 66 20 46 54 53 20 69 6e 64 65 78 20 69 73 20 69  f FTS index is i
2c300 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20  dentical..  **. 
2c310 20 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73   ** Two versions
2c320 20 6f 66 20 74 68 65 20 73 61 6d 65 20 63 68 65   of the same che
2c330 63 6b 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c  cksum are calcul
2c340 61 74 65 64 2e 20 54 68 65 20 66 69 72 73 74 20  ated. The first 
2c350 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69  (stack.  ** vari
2c360 61 62 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73  able cksum2) bas
2c370 65 64 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78  ed on entries ex
2c380 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
2c390 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
2c3a0 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e  .  ** while doin
2c3b0 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  g a linear scan 
2c3c0 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  of each individu
2c3d0 61 6c 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e  al index in turn
2c3e0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20  . .  **.  ** As 
2c3f0 65 61 63 68 20 74 65 72 6d 20 76 69 73 69 74 65  each term visite
2c400 64 20 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20  d by the linear 
2c410 73 63 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74  scans, a separat
2c420 65 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a  e query for the.
2c430 20 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69    ** same term i
2c440 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73  s performed. cks
2c450 75 6d 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65  um3 is calculate
2c460 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65  d based on the e
2c470 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72  ntries.  ** extr
2c480 61 63 74 65 64 20 62 79 20 74 68 65 73 65 20 71  acted by these q
2c490 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  ueries..  */.  f
2c4a0 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72  or(fts5MultiIter
2c4b0 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
2c4c0 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20  flags, 0, 0, 0, 
2c4d0 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a  -1, 0, &pIter);.
2c4e0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
2c4f0 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
2c500 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  ==0;.      fts5M
2c510 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
2c520 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29  pIter, 0, 0).  )
2c530 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20  {.    int n;    
2c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c550 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
2c560 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
2c570 20 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20    i64 iPos = 0; 
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c590 20 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66   Position read f
2c5a0 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20  rom poslist */. 
2c5b0 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c5d0 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20  * Offset within 
2c5e0 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  poslist */.    i
2c5f0 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
2c600 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
2c610 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20  Iter);.    char 
2c620 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35  *z = (char*)fts5
2c630 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
2c640 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f  ter, &n);..    /
2c650 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e  * If this is a n
2c660 65 77 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66  ew term, query f
2c670 6f 72 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b  or it. Update ck
2c680 73 75 6d 33 20 77 69 74 68 20 74 68 65 20 72 65  sum3 with the re
2c690 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74  sults. */.    ft
2c6a0 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74  s5TestTerm(p, &t
2c6b0 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d  erm, z, n, cksum
2c6c0 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20  2, &cksum3);..  
2c6d0 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
2c6e0 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
2c6f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
2c700 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
2c710 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29  mpty(p, pIter) )
2c720 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32  {.        cksum2
2c730 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
2c740 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69  ndexEntryCksum(i
2c750 52 6f 77 69 64 2c 20 30 2c 20 30 2c 20 2d 31 2c  Rowid, 0, 0, -1,
2c760 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
2c770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c780 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a   poslist.n = 0;.
2c790 20 20 20 20 20 20 66 74 73 35 53 65 67 69 74 65        fts5Segite
2c7a0 72 50 6f 73 6c 69 73 74 28 70 2c 20 26 70 49 74  rPoslist(p, &pIt
2c7b0 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
2c7c0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
2c7d0 5d 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b  ], 0, &poslist);
2c7e0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 3d  .      while( 0=
2c7f0 3d 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c  =sqlite3Fts5Posl
2c800 69 73 74 4e 65 78 74 36 34 28 70 6f 73 6c 69 73  istNext64(poslis
2c810 74 2e 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20  t.p, poslist.n, 
2c820 26 69 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b  &iOff, &iPos) ){
2c830 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
2c840 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c  l = FTS5_POS2COL
2c850 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20 20 20  UMN(iPos);.     
2c860 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20 3d     int iTokOff =
2c870 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
2c880 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  (iPos);.        
2c890 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65  cksum2 ^= sqlite
2c8a0 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2c8b0 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f  ksum(iRowid, iCo
2c8c0 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20  l, iTokOff, -1, 
2c8d0 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
2c8e0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54     }.  }.  fts5T
2c8f0 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d  estTerm(p, &term
2c900 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20  , 0, 0, cksum2, 
2c910 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73  &cksum3);..  fts
2c920 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
2c930 49 74 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Iter);.  if( p->
2c940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c950 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29   cksum!=cksum2 )
2c960 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2c970 52 52 55 50 54 3b 0a 0a 20 20 66 74 73 35 53 74  RRUPT;..  fts5St
2c980 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
2c990 53 74 72 75 63 74 29 3b 0a 23 69 66 64 65 66 20  Struct);.#ifdef 
2c9a0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
2c9b0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
2c9c0 65 72 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66  erm);.#endif.  f
2c9d0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
2c9e0 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  oslist);.  retur
2c9f0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
2ca00 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n(p);.}../******
2ca10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca50 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2ca60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2caa0 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69  * Below this poi
2cab0 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d  nt is the implem
2cac0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2cad0 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 73 63  fts5_decode() sc
2cae0 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  alar.** function
2caf0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a   only..*/../*.**
2cb00 20 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65 6e   Decode a segmen
2cb10 74 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72 6f  t-data rowid fro
2cb20 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
2cb30 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
2cb40 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f  n is.** the oppo
2cb50 73 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46 54  site of macro FT
2cb60 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2cb70 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
2cb80 69 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  id fts5DecodeRow
2cb90 69 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64  id(.  i64 iRowid
2cba0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cbb0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
2cbc0 72 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c 65  rom %_data table
2cbd0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67   */.  int *piSeg
2cbe0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2cbf0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
2cc00 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
2cc10 74 20 2a 70 62 44 6c 69 64 78 2c 20 20 20 20 20  t *pbDlidx,     
2cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cc30 20 4f 55 54 3a 20 44 6c 69 64 78 20 66 6c 61 67   OUT: Dlidx flag
2cc40 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69   */.  int *piHei
2cc50 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
2cc60 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65        /* OUT: He
2cc70 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ight */.  int *p
2cc80 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20  iPgno           
2cc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2cca0 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  : Page number */
2ccb0 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20  .){.  *piPgno = 
2ccc0 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
2ccd0 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
2cce0 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31  DATA_PAGE_B) - 1
2ccf0 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
2cd00 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
2cd10 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20  B;..  *piHeight 
2cd20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2cd30 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
2cd40 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29  5_DATA_HEIGHT_B)
2cd50 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64   - 1));.  iRowid
2cd60 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48   >>= FTS5_DATA_H
2cd70 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44  EIGHT_B;..  *pbD
2cd80 6c 69 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f  lidx = (int)(iRo
2cd90 77 69 64 20 26 20 30 78 30 30 30 31 29 3b 0a 20  wid & 0x0001);. 
2cda0 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2cdb0 5f 44 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20  _DATA_DLI_B;..  
2cdc0 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29  *piSegid = (int)
2cdd0 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2cde0 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2cdf0 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a  ID_B) - 1));.}..
2ce00 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2ce10 44 65 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a  DebugRowid(int *
2ce20 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
2ce30 2a 70 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29  *pBuf, i64 iKey)
2ce40 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20  {.  int iSegid, 
2ce50 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20  iHeight, iPgno, 
2ce60 62 44 6c 69 64 78 3b 20 20 20 20 20 20 20 2f 2a  bDlidx;       /*
2ce70 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74   Rowid compenent
2ce80 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64  s */.  fts5Decod
2ce90 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 53  eRowid(iKey, &iS
2cea0 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26  egid, &bDlidx, &
2ceb0 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
2cec0 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d  ;..  if( iSegid=
2ced0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b  =0 ){.    if( iK
2cee0 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45  ey==FTS5_AVERAGE
2cef0 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  S_ROWID ){.     
2cf00 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2cf10 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2cf20 52 63 2c 20 70 42 75 66 2c 20 22 7b 61 76 65 72  Rc, pBuf, "{aver
2cf30 61 67 65 73 7d 20 22 29 3b 0a 20 20 20 20 7d 65  ages} ");.    }e
2cf40 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2cf50 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2cf60 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2cf70 75 66 2c 20 22 7b 73 74 72 75 63 74 75 72 65 7d  uf, "{structure}
2cf80 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
2cf90 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
2cfa0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2cfb0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2cfc0 66 2c 20 22 7b 25 73 73 65 67 69 64 3d 25 64 20  f, "{%ssegid=%d 
2cfd0 68 3d 25 64 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a  h=%d pgno=%d}",.
2cfe0 20 20 20 20 20 20 20 20 62 44 6c 69 64 78 20 3f          bDlidx ?
2cff0 20 22 64 6c 69 64 78 20 22 20 3a 20 22 22 2c 20   "dlidx " : "", 
2d000 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c  iSegid, iHeight,
2d010 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20   iPgno.    );.  
2d020 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
2d030 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
2d040 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ure(.  int *pRc,
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d060 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2d070 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : error code */.
2d080 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
2d090 75 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  uf,.  Fts5Struct
2d0a0 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20  ure *p.){.  int 
2d0b0 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20  iLvl, iSeg;     
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2d0d0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
2d0e0 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20  evels, segments 
2d0f0 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30  */..  for(iLvl=0
2d100 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c  ; iLvl<p->nLevel
2d110 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46  ; iLvl++){.    F
2d120 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
2d130 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c  l *pLvl = &p->aL
2d140 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
2d150 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2d160 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2d170 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20  c, pBuf, .      
2d180 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72    " {lvl=%d nMer
2d190 67 65 3d 25 64 20 6e 53 65 67 3d 25 64 22 2c 20  ge=%d nSeg=%d", 
2d1a0 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72  iLvl, pLvl->nMer
2d1b0 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20  ge, pLvl->nSeg. 
2d1c0 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53     );.    for(iS
2d1d0 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d  eg=0; iSeg<pLvl-
2d1e0 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  >nSeg; iSeg++){.
2d1f0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
2d200 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
2d210 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69   = &pLvl->aSeg[i
2d220 53 65 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  Seg];.      sqli
2d230 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2d240 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2d250 42 75 66 2c 20 22 20 7b 69 64 3d 25 64 20 6c 65  Buf, " {id=%d le
2d260 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a  aves=%d..%d}", .
2d270 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e            pSeg->
2d280 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 70 67  iSegid, pSeg->pg
2d290 6e 6f 46 69 72 73 74 2c 20 70 53 65 67 2d 3e 70  noFirst, pSeg->p
2d2a0 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20 29 3b  gnoLast.      );
2d2b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2d2c0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2d2d0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2d2e0 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a  uf, "}");.  }.}.
2d2f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70  ./*.** This is p
2d300 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f  art of the fts5_
2d310 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69  decode() debuggi
2d320 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  ng aid..**.** Ar
2d330 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42  guments pBlob/nB
2d340 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 20 73 65  lob contain a se
2d350 72 69 61 6c 69 7a 65 64 20 46 74 73 35 53 74 72  rialized Fts5Str
2d360 75 63 74 75 72 65 20 6f 62 6a 65 63 74 2e 20 54  ucture object. T
2d370 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
2d380 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d  appends a human-
2d390 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65  readable represe
2d3a0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
2d3b0 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ame object.** to
2d3c0 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73   the buffer pass
2d3d0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2d3e0 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73   argument. .*/.s
2d3f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2d400 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 0a  ecodeStructure(.
2d410 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d430 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2d440 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2d450 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2d460 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62   const u8 *pBlob
2d470 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20  , int nBlob.){. 
2d480 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2d4b0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2d4c0 72 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  re *p = 0;      
2d4d0 20 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 64 20       /* Decoded 
2d4e0 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
2d4f0 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 35   */..  rc = fts5
2d500 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
2d510 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c  pBlob, nBlob, 0,
2d520 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   &p);.  if( rc!=
2d530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d540 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
2d550 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
2d560 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
2d570 65 28 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b  e(pRc, pBuf, p);
2d580 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
2d590 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f  Release(p);.}../
2d5a0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72  *.** This is par
2d5b0 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  t of the fts5_de
2d5c0 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67  code() debugging
2d5d0 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75   aid..**.** Argu
2d5e0 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f  ments pBlob/nBlo
2d5f0 62 20 63 6f 6e 74 61 69 6e 20 61 6e 20 22 61 76  b contain an "av
2d600 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 2e 20  erages" record. 
2d610 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
2d620 2a 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61  * appends a huma
2d630 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65  n-readable repre
2d640 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 65 63  sentation of rec
2d650 6f 72 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ord to the buffe
2d660 72 20 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20  r passed .** as 
2d670 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2d680 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ent. .*/.static 
2d690 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 41  void fts5DecodeA
2d6a0 76 65 72 61 67 65 73 28 0a 20 20 69 6e 74 20 2a  verages(.  int *
2d6b0 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
2d6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2d6d0 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
2d6e0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2d6f0 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20   *pBuf,.  const 
2d700 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  u8 *pBlob, int n
2d710 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 69 20  Blob.){.  int i 
2d720 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
2d730 72 20 2a 7a 53 70 61 63 65 20 3d 20 22 22 3b 0a  r *zSpace = "";.
2d740 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 42 6c 6f  .  while( i<nBlo
2d750 62 20 29 7b 0a 20 20 20 20 75 36 34 20 69 56 61  b ){.    u64 iVa
2d760 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  l;.    i += sqli
2d770 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2d780 28 26 70 42 6c 6f 62 5b 69 5d 2c 20 26 69 56 61  (&pBlob[i], &iVa
2d790 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l);.    sqlite3F
2d7a0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2d7b0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2d7c0 20 22 25 73 25 64 22 2c 20 7a 53 70 61 63 65 2c   "%s%d", zSpace,
2d7d0 20 28 69 6e 74 29 69 56 61 6c 29 3b 0a 20 20 20   (int)iVal);.   
2d7e0 20 7a 53 70 61 63 65 20 3d 20 22 20 22 3b 0a 20   zSpace = " ";. 
2d7f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66   }.}../*.** Buff
2d800 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75  er (a/n) is assu
2d810 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  med to contain a
2d820 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69   list of seriali
2d830 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61  zed varints. Rea
2d840 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74  d.** each varint
2d850 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20   and append its 
2d860 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
2d870 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20  ation to buffer 
2d880 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  pBuf. Return.** 
2d890 61 66 74 65 72 20 65 69 74 68 65 72 20 74 68 65  after either the
2d8a0 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73   input buffer is
2d8b0 20 65 78 68 61 75 73 74 65 64 20 6f 72 20 61 20   exhausted or a 
2d8c0 30 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e  0 value is read.
2d8d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
2d8e0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
2d8f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
2d900 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
2d910 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
2d920 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
2d930 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a  odePoslist(int *
2d940 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
2d950 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
2d960 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *a, int n){.  in
2d970 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68  t iOff = 0;.  wh
2d980 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
2d990 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20     int iVal;.   
2d9a0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2d9b0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
2d9c0 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71  ], iVal);.    sq
2d9d0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2d9e0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2d9f0 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56   pBuf, " %d", iV
2da00 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  al);.  }.  retur
2da10 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
2da20 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75   The start of bu
2da30 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61  ffer (a/n) conta
2da40 69 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66  ins the start of
2da50 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20   a doclist. The 
2da60 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f  doclist.** may o
2da70 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68  r may not finish
2da80 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
2da90 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
2daa0 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74  n appends a text
2dab0 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69  .** representati
2dac0 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f  on of the part o
2dad0 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68  f the doclist th
2dae0 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f  at is present to
2daf0 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e   buffer.** pBuf.
2db00 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75   .**.** The retu
2db10 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
2db20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2db30 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  read from the in
2db40 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73  put buffer..*/.s
2db50 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65  tatic int fts5De
2db60 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20  codeDoclist(int 
2db70 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
2db80 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38   *pBuf, const u8
2db90 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *a, int n){.  i
2dba0 36 34 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20  64 iDocid = 0;. 
2dbb0 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a   int iOff = 0;..
2dbc0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2dbd0 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 46   iOff = sqlite3F
2dbe0 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts5GetVarint(a, 
2dbf0 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a  (u64*)&iDocid);.
2dc00 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2dc10 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2dc20 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69  f(pRc, pBuf, " i
2dc30 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29  d=%lld", iDocid)
2dc40 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69  ;.  }.  while( i
2dc50 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74  Off<n ){.    int
2dc60 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62   nPos;.    int b
2dc70 44 65 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  Del;.    iOff +=
2dc80 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
2dc90 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e  ize(&a[iOff], &n
2dca0 50 6f 73 2c 20 26 62 44 65 6c 29 3b 0a 20 20 20  Pos, &bDel);.   
2dcb0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2dcc0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2dcd0 52 63 2c 20 70 42 75 66 2c 20 22 20 6e 50 6f 73  Rc, pBuf, " nPos
2dce0 3d 25 64 25 73 22 2c 20 6e 50 6f 73 2c 20 62 44  =%d%s", nPos, bD
2dcf0 65 6c 3f 22 2a 22 3a 22 22 29 3b 0a 20 20 20 20  el?"*":"");.    
2dd00 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
2dd10 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70  dePoslist(pRc, p
2dd20 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d  Buf, &a[iOff], M
2dd30 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29  IN(n-iOff, nPos)
2dd40 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c  );.    if( iOff<
2dd50 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  n ){.      i64 i
2dd60 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66  Delta;.      iOf
2dd70 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
2dd80 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
2dd90 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  f], (u64*)&iDelt
2dda0 61 29 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64  a);.      iDocid
2ddb0 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
2ddc0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2ddd0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2dde0 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d  pRc, pBuf, " id=
2ddf0 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a  %lld", iDocid);.
2de00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2de10 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  urn iOff;.}../*.
2de20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2de30 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2de40 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
2de50 62 75 67 67 69 6e 67 20 66 75 6e 63 74 69 6f 6e  bugging function
2de60 2e 20 49 74 20 69 73 20 0a 2a 2a 20 6f 6e 6c 79  . It is .** only
2de70 20 65 76 65 72 20 75 73 65 64 20 77 69 74 68 20   ever used with 
2de80 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c  detail=none tabl
2de90 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72  es..**.** Buffer
2dea0 20 28 70 44 61 74 61 2f 6e 44 61 74 61 29 20 63   (pData/nData) c
2deb0 6f 6e 74 61 69 6e 73 20 61 20 64 6f 63 6c 69 73  ontains a doclis
2dec0 74 20 69 6e 20 74 68 65 20 66 6f 72 6d 61 74 20  t in the format 
2ded0 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 6e  used by detail=n
2dee0 6f 6e 65 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54  one.** tables. T
2def0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
2df00 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61  ends a human-rea
2df10 64 61 62 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66  dable version of
2df20 20 74 68 61 74 20 6c 69 73 74 20 74 6f 0a 2a 2a   that list to.**
2df30 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
2df40 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6f  .** If *pRc is o
2df50 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
2df60 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
2df70 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2df80 2c 20 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  , it is a.** no-
2df90 6f 70 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 72  op. If an OOM or
2dfa0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63   other error occ
2dfb0 75 72 73 20 77 69 74 68 69 6e 20 74 68 69 73 20  urs within this 
2dfc0 66 75 6e 63 74 69 6f 6e 2c 20 2a 70 52 63 20 69  function, *pRc i
2dfd0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 61 6e 20 53  s.** set to an S
2dfe0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2dff0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2e000 67 2e 20 54 68 65 20 66 69 6e 61 6c 20 73 74 61  g. The final sta
2e010 74 65 20 6f 66 20 62 75 66 66 65 72 0a 2a 2a 20  te of buffer.** 
2e020 70 42 75 66 20 69 73 20 75 6e 64 65 66 69 6e 65  pBuf is undefine
2e030 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
2e040 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2e050 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69  ts5DecodeRowidLi
2e060 73 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  st(.  int *pRc, 
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2e090 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
2e0a0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2e0b0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
2e0c0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 61 70   /* Buffer to ap
2e0d0 70 65 6e 64 20 74 65 78 74 20 74 6f 20 2a 2f 0a  pend text to */.
2e0e0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74    const u8 *pDat
2e0f0 61 2c 20 69 6e 74 20 6e 44 61 74 61 20 20 20 20  a, int nData    
2e100 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 64 65 63    /* Data to dec
2e110 6f 64 65 20 6c 69 73 74 2d 6f 66 2d 72 6f 77 69  ode list-of-rowi
2e120 64 73 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20  ds from */.){.  
2e130 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 36 34  int i = 0;.  i64
2e140 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20   iRowid = 0;..  
2e150 77 68 69 6c 65 28 20 69 3c 6e 44 61 74 61 20 29  while( i<nData )
2e160 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2e170 20 2a 7a 41 70 70 20 3d 20 22 22 3b 0a 20 20 20   *zApp = "";.   
2e180 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   u64 iVal;.    i
2e190 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
2e1a0 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 5b  etVarint(&pData[
2e1b0 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  i], &iVal);.    
2e1c0 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iRowid += iVal;.
2e1d0 0a 20 20 20 20 69 66 28 20 69 3c 6e 44 61 74 61  .    if( i<nData
2e1e0 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78   && pData[i]==0x
2e1f0 30 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  00 ){.      i++;
2e200 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 44 61  .      if( i<nDa
2e210 74 61 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d  ta && pData[i]==
2e220 30 78 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0x00 ){.        
2e230 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a 41 70  i++;.        zAp
2e240 70 20 3d 20 22 2b 22 3b 0a 20 20 20 20 20 20 7d  p = "+";.      }
2e250 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 41  else{.        zA
2e260 70 70 20 3d 20 22 2a 22 3b 0a 20 20 20 20 20 20  pp = "*";.      
2e270 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
2e280 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2e290 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2e2a0 70 42 75 66 2c 20 22 20 25 6c 6c 64 25 73 22 2c  pBuf, " %lld%s",
2e2b0 20 69 52 6f 77 69 64 2c 20 7a 41 70 70 29 3b 0a   iRowid, zApp);.
2e2c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
2e2d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e2e0 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
2e2f0 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
2e300 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a  fts5_decode()..*
2e310 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2e320 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
2e330 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2e340 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
2e350 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2e360 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
2e370 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e390 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2e3a0 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
2e3b0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
2e3c0 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
2e3d0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2e3e0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2e3f0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e410 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72    /* Rowid for r
2e420 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f  ecord being deco
2e430 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ded */.  int iSe
2e440 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e  gid,iHeight,iPgn
2e450 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69  o,bDlidx;/* Rowi
2e460 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a  d components */.
2e470 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f    const u8 *aBlo
2e480 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  b; int n;       
2e490 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64    /* Record to d
2e4a0 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61  ecode */.  u8 *a
2e4b0 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66   = 0;.  Fts5Buff
2e4c0 65 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  er s;           
2e4d0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64          /* Build
2e4e0 20 75 70 20 74 65 78 74 20 74 6f 20 72 65 74 75   up text to retu
2e4f0 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  rn here */.  int
2e500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e520 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2e530 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b   int nSpace = 0;
2e540 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 4e 6f  .  int eDetailNo
2e550 6e 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 75 73  ne = (sqlite3_us
2e560 65 72 5f 64 61 74 61 28 70 43 74 78 29 21 3d 30  er_data(pCtx)!=0
2e570 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41  );..  assert( nA
2e580 72 67 3d 3d 32 20 29 3b 0a 20 20 55 4e 55 53 45  rg==2 );.  UNUSE
2e590 44 5f 50 41 52 41 4d 28 6e 41 72 67 29 3b 0a 20  D_PARAM(nArg);. 
2e5a0 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
2e5b0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
2e5c0 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73  ));.  iRowid = s
2e5d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2e5e0 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20  64(apVal[0]);.. 
2e5f0 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
2e600 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
2e610 67 75 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29 20  gument (a blob) 
2e620 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65 20  in aBlob[]. The 
2e630 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70  aBlob[].  ** cop
2e640 79 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79  y is followed by
2e650 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
2e660 50 41 44 44 49 4e 47 20 30 78 30 30 20 62 79 74  PADDING 0x00 byt
2e670 65 73 2c 20 77 68 69 63 68 20 70 72 65 76 65 6e  es, which preven
2e680 74 73 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 6f  ts.  ** buffer o
2e690 76 65 72 72 65 61 64 73 20 65 76 65 6e 20 69 66  verreads even if
2e6a0 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63   the record is c
2e6b0 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e 20  orrupt.  */.  n 
2e6c0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2e6d0 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b  bytes(apVal[1]);
2e6e0 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  aBlob = sqlit
2e6f0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70  e3_value_blob(ap
2e700 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61 63  Val[1]);.  nSpac
2e710 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54  e = n + FTS5_DAT
2e720 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a  A_ZERO_PADDING;.
2e730 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74    a = (u8*)sqlit
2e740 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
2e750 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20  (&rc, nSpace);. 
2e760 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f   if( a==0 ) goto
2e770 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d   decode_out;.  m
2e780 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20  emcpy(a, aBlob, 
2e790 6e 29 3b 0a 0a 0a 20 20 66 74 73 35 44 65 63 6f  n);...  fts5Deco
2e7a0 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20  deRowid(iRowid, 
2e7b0 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78  &iSegid, &bDlidx
2e7c0 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67  , &iHeight, &iPg
2e7d0 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75  no);..  fts5Debu
2e7e0 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20  gRowid(&rc, &s, 
2e7f0 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62  iRowid);.  if( b
2e800 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
2e810 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20  5Data dlidx;.   
2e820 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76   Fts5DlidxLvl lv
2e830 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20  l;..    dlidx.p 
2e840 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e  = a;.    dlidx.n
2e850 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73  n = n;..    mems
2e860 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(&lvl, 0, size
2e870 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
2e880 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61  );.    lvl.pData
2e890 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c   = &dlidx;.    l
2e8a0 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  vl.iLeafPgno = i
2e8b0 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66  Pgno;..    for(f
2e8c0 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
2e8d0 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d  &lvl); lvl.bEof=
2e8e0 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  =0; fts5DlidxLvl
2e8f0 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20  Next(&lvl)){.   
2e900 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2e910 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2e920 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20  (&rc, &s, .     
2e930 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22       " %d(%lld)"
2e940 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c  , lvl.iLeafPgno,
2e950 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20   lvl.iRowid.    
2e960 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c    );.    }.  }el
2e970 73 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30  se if( iSegid==0
2e980 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77   ){.    if( iRow
2e990 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45  id==FTS5_AVERAGE
2e9a0 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  S_ROWID ){.     
2e9b0 20 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61   fts5DecodeAvera
2e9c0 67 65 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ges(&rc, &s, a, 
2e9d0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
2e9e0 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53       fts5DecodeS
2e9f0 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73  tructure(&rc, &s
2ea00 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , a, n);.    }. 
2ea10 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 74 61   }else if( eDeta
2ea20 69 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46 74  ilNone ){.    Ft
2ea30 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
2ea40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2ea50 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64  urrent term read
2ea60 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20   from page */.  
2ea70 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20 20    int szLeaf;.  
2ea80 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 20    int iPgidxOff 
2ea90 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47  = szLeaf = fts5G
2eaa0 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20  etU16(&a[2]);.  
2eab0 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a    int iTermOff;.
2eac0 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20      int nKeep = 
2ead0 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  0;.    int iOff;
2eae0 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65  ..    memset(&te
2eaf0 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  rm, 0, sizeof(Ft
2eb00 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
2eb10 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 65   /* Decode any e
2eb20 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
2eb30 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
2eb40 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  st term. */.    
2eb50 69 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a  if( szLeaf<n ){.
2eb60 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
2eb70 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2eb80 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
2eb90 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20  , iTermOff);.   
2eba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 54   }else{.      iT
2ebb0 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b  ermOff = szLeaf;
2ebc0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
2ebd0 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26  ecodeRowidList(&
2ebe0 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69  rc, &s, &a[4], i
2ebf0 54 65 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20 20  TermOff-4);..   
2ec00 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
2ec10 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66  ;.    while( iOf
2ec20 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  f<szLeaf ){.    
2ec30 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 3b 0a 0a    int nAppend;..
2ec40 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
2ec50 65 20 74 65 72 6d 20 64 61 74 61 20 66 6f 72 20  e term data for 
2ec60 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2a 2f 0a  the next term*/.
2ec70 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2ec80 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
2ec90 5b 69 4f 66 66 5d 2c 20 6e 41 70 70 65 6e 64 29  [iOff], nAppend)
2eca0 3b 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d  ;.      term.n =
2ecb0 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 66 74   nKeep;.      ft
2ecc0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
2ecd0 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
2ece0 41 70 70 65 6e 64 2c 20 26 61 5b 69 4f 66 66 5d  Append, &a[iOff]
2ecf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ed00 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2ed10 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
2ed20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72    &rc, &s, " ter
2ed30 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c  m=%.*s", term.n,
2ed40 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65   (const char*)te
2ed50 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20  rm.p.      );.  
2ed60 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 41 70 70      iOff += nApp
2ed70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  end;..      /* F
2ed80 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
2ed90 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  the doclist for 
2eda0 74 68 69 73 20 74 65 72 6d 20 65 6e 64 73 20 2a  this term ends *
2edb0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69  /.      if( iPgi
2edc0 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20  dxOff<n ){.     
2edd0 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 20 20     int nIncr;.  
2ede0 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
2edf0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2ee00 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
2ee10 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 20 20  , nIncr);.      
2ee20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49    iTermOff += nI
2ee30 6e 63 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ncr;.      }else
2ee40 7b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f  {.        iTermO
2ee50 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  ff = szLeaf;.   
2ee60 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35     }..      fts5
2ee70 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28  DecodeRowidList(
2ee80 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
2ee90 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 69 4f 66 66  ], iTermOff-iOff
2eea0 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  );.      iOff = 
2eeb0 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20  iTermOff;.      
2eec0 69 66 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20  if( iOff<szLeaf 
2eed0 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
2eee0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2eef0 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65  32(&a[iOff], nKe
2ef00 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ep);.      }.   
2ef10 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
2ef20 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
2ef30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35   }else{.    Fts5
2ef40 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
2ef50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2ef60 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66  rent term read f
2ef70 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  rom page */.    
2ef80 69 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20  int szLeaf;     
2ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2efa0 20 4f 66 66 73 65 74 20 6f 66 20 70 67 69 64 78   Offset of pgidx
2efb0 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69   in a[] */.    i
2efc0 6e 74 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20  nt iPgidxOff;.  
2efd0 20 20 69 6e 74 20 69 50 67 69 64 78 50 72 65 76    int iPgidxPrev
2efe0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2eff0 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75  /* Previous valu
2f000 65 20 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64  e read from pgid
2f010 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65  x */.    int iTe
2f020 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  rmOff = 0;.    i
2f030 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30  nt iRowidOff = 0
2f040 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ;.    int iOff;.
2f050 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74      int nDoclist
2f060 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  ;..    memset(&t
2f070 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
2f080 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
2f090 20 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20    if( n<4 ){.   
2f0a0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2f0b0 66 66 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c  fferSet(&rc, &s,
2f0c0 20 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22   7, (const u8*)"
2f0d0 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20  corrupt");.     
2f0e0 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
2f0f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f100 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
2f110 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29  ts5GetU16(&a[0])
2f120 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66  ;.      iPgidxOf
2f130 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73  f = szLeaf = fts
2f140 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a  5GetU16(&a[2]);.
2f150 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78        if( iPgidx
2f160 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
2f170 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2f180 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
2f190 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20  iTermOff);.     
2f1a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2f1b0 20 44 65 63 6f 64 65 20 74 68 65 20 70 6f 73 69   Decode the posi
2f1c0 74 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20 61  tion list tail a
2f1d0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
2f1e0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
2f1f0 66 28 20 69 52 6f 77 69 64 4f 66 66 21 3d 30 20  f( iRowidOff!=0 
2f200 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ){.      iOff = 
2f210 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d  iRowidOff;.    }
2f220 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66  else if( iTermOf
2f230 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f  f!=0 ){.      iO
2f240 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20  ff = iTermOff;. 
2f250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f260 69 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  iOff = szLeaf;. 
2f270 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63     }.    fts5Dec
2f280 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20  odePoslist(&rc, 
2f290 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d  &s, &a[4], iOff-
2f2a0 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f  4);..    /* Deco
2f2b0 64 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c  de any more docl
2f2c0 69 73 74 20 64 61 74 61 20 74 68 61 74 20 61 70  ist data that ap
2f2d0 70 65 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67  pears on the pag
2f2e0 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  e before the.   
2f2f0 20 2a 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20   ** first term. 
2f300 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20  */.    nDoclist 
2f310 3d 20 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54  = (iTermOff ? iT
2f320 65 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29  ermOff : szLeaf)
2f330 20 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73   - iOff;.    fts
2f340 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26  5DecodeDoclist(&
2f350 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
2f360 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20  , nDoclist);..  
2f370 20 20 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f    while( iPgidxO
2f380 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  ff<n ){.      in
2f390 74 20 62 46 69 72 73 74 20 3d 20 28 69 50 67 69  t bFirst = (iPgi
2f3a0 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20  dxOff==szLeaf); 
2f3b0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2f3c0 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61  first term on pa
2f3d0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ge */.      int 
2f3e0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
2f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f400 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61    /* Bytes of da
2f410 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ta */.      int 
2f420 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20  iEnd;.      .   
2f430 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20     iPgidxOff += 
2f440 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2f450 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e  &a[iPgidxOff], n
2f460 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67  Byte);.      iPg
2f470 69 64 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65  idxPrev += nByte
2f480 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  ;.      iOff = i
2f490 50 67 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20  PgidxPrev;..    
2f4a0 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c    if( iPgidxOff<
2f4b0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  n ){.        fts
2f4c0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
2f4d0 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74  iPgidxOff], nByt
2f4e0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64  e);.        iEnd
2f4f0 20 3d 20 69 50 67 69 64 78 50 72 65 76 20 2b 20   = iPgidxPrev + 
2f500 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c  nByte;.      }el
2f510 73 65 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64  se{.        iEnd
2f520 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20   = szLeaf;.     
2f530 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 62 46   }..      if( bF
2f540 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  irst==0 ){.     
2f550 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2f560 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
2f570 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
2f580 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42       term.n = nB
2f590 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  yte;.      }.   
2f5a0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2f5b0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
2f5c0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
2f5d0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
2f5e0 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65  endBlob(&rc, &te
2f5f0 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f  rm, nByte, &a[iO
2f600 66 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  ff]);.      iOff
2f610 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20   += nByte;..    
2f620 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2f630 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2f640 0a 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20  .          &rc, 
2f650 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22  &s, " term=%.*s"
2f660 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74  , term.n, (const
2f670 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20   char*)term.p.  
2f680 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66      );.      iOf
2f690 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44  f += fts5DecodeD
2f6a0 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
2f6b0 26 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69  &a[iOff], iEnd-i
2f6c0 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Off);.    }..   
2f6d0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2f6e0 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20  &term);.  }.  . 
2f6f0 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71  decode_out:.  sq
2f700 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20  lite3_free(a);. 
2f710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f720 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2f730 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
2f740 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  tx, (const char*
2f750 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54  )s.p, s.n, SQLIT
2f760 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
2f770 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
2f780 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
2f790 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a  code(pCtx, rc);.
2f7a0 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
2f7b0 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a  Free(&s);.}../*.
2f7c0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
2f7d0 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65  ation of user-de
2f7e0 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
2f7f0 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64  ction fts5_rowid
2f800 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
2f810 69 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63  id fts5RowidFunc
2f820 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
2f830 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
2f840 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
2f850 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74  ion call context
2f860 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f880 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f890 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20  of args (always 
2f8a0 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  2) */.  sqlite3_
2f8b0 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
2f8c0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
2f8d0 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
2f8e0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
2f8f0 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41   *zArg;.  if( nA
2f900 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rg==0 ){.    sql
2f910 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2f920 72 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20  r(pCtx, "should 
2f930 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73  be: fts5_rowid(s
2f940 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20  ubject, ....)", 
2f950 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
2f960 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20    zArg = (const 
2f970 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
2f980 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
2f990 5d 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  ]);.    if( 0==s
2f9a0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2f9b0 41 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20  Arg, "segment") 
2f9c0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
2f9d0 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  wid;.      int s
2f9e0 65 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20  egid, pgno;.    
2f9f0 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b    if( nArg!=3 ){
2fa00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fa10 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
2fa20 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  tx, .           
2fa30 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73   "should be: fts
2fa40 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74  5_rowid('segment
2fa50 27 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29  ', segid, pgno))
2fa60 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b  ", -1.        );
2fa70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2fa80 20 20 20 20 20 20 73 65 67 69 64 20 3d 20 73 71        segid = sq
2fa90 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
2faa0 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20  apVal[1]);.     
2fab0 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65     pgno = sqlite
2fac0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
2fad0 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  l[2]);.        i
2fae0 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
2faf0 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64  MENT_ROWID(segid
2fb00 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
2fb10 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2fb20 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77  int64(pCtx, iRow
2fb30 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  id);.      }.   
2fb40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2fb50 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2fb60 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20  or(pCtx, .      
2fb70 20 20 22 66 69 72 73 74 20 61 72 67 20 74 6f 20    "first arg to 
2fb80 66 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73  fts5_rowid() mus
2fb90 74 20 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20  t be 'segment'" 
2fba0 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  , -1.      );.  
2fbb0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2fbc0 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
2fbd0 61 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73  as part of regis
2fbe0 74 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20  tering the FTS5 
2fbf0 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61  module with data
2fc00 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
2fc10 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74  on db. It regist
2fc20 65 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72  ers several user
2fc30 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
2fc40 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c  functions useful
2fc50 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a  .** with FTS5..*
2fc60 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2fc70 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
2fc80 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2fc90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
2fca0 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c  ome other.** SQL
2fcb0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2fcc0 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
2fcd0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
2fce0 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28  e3Fts5IndexInit(
2fcf0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
2fd00 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
2fd10 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
2fd20 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73  (.      db, "fts
2fd30 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51  5_decode", 2, SQ
2fd40 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
2fd50 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
2fd60 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 20 20 69  , 0, 0.  );..  i
2fd70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fd80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
2fd90 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
2fda0 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62  tion(.        db
2fdb0 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e  , "fts5_decode_n
2fdc0 6f 6e 65 22 2c 20 32 2c 20 0a 20 20 20 20 20 20  one", 2, .      
2fdd0 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28    SQLITE_UTF8, (
2fde0 76 6f 69 64 2a 29 64 62 2c 20 66 74 73 35 44 65  void*)db, fts5De
2fdf0 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  codeFunction, 0,
2fe00 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
2fe10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fe20 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
2fe30 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
2fe40 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
2fe50 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22  db, "fts5_rowid"
2fe60 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
2fe70 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46  8, 0, fts5RowidF
2fe80 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
2fe90 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72    );.  }.  retur
2fea0 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.